phparraysmultidimensional-arraygroupingsub-array

Group rows of a 2d array by a column and create subarrays


So I have a multidimensional array in the form (actual array can be much longer 500+ members)

$marr = array(
    array("s_id" => 1, 1.25 , 15),
    array("s_id" => 2, 0.75 , 25),
    array("s_id" => 1, 1.15 , 7) 
); 

I am trying to break it into an array grouped/indexed by the s_id value of the member arrays

$sarr = array(
    1 => array(
        array("s_id" => 1, 1.25 , 15),
        array("s_id" => 1, 1.15 , 7) 
    ),
    2 => array(
        array("s_id" => 2, 0.75 , 25)
    )
);

Is there a built in function in php to do this or some best practice way of doing this?


Solution

  • There is no built-in function that can supply this result. Instead, you need to iterate over the array, and check if the key matching the s_id value already exists. If it doesn't create a new array at that key.

    $marr = array( array("s_id" => 1, 1.25 , 15),
                   array("s_id" => 2, 0.75 , 25),
                   array("s_id" => 1, 1.15 , 7) 
                 ); 
    
    // Holds the whole output
    $output = array();
    
    // Looping over the original array
    foreach ($marr as $subarr) {
      // Check if the output array already has the s_id as a key
      if (!isset($output[$subarr['s_id']])) {
        // Initialize it
        $output[$subarr['s_id']] = array();
      }
      // Then append the current sub-array to the s_id array key
      $output[$subarr['s_id']][] = $subarr;
    }
    // Then call ksort() on the output array
    // to sort the s_id keys in ascending order
    ksort($output);
    

    http://codepad.viper-7.com/SSBrAl

    Prints:

    Array
    (
        [1] => Array
            (
                [0] => Array
                    (
                        [s_id] => 1
                        [0] => 1.25
                        [1] => 15
                    )
    
                [1] => Array
                    (
                        [s_id] => 1
                        [0] => 1.15
                        [1] => 7
                    )
    
            )
    
        [2] => Array
            (
                [0] => Array
                    (
                        [s_id] => 2
                        [0] => 0.75
                        [1] => 25
                    )
    
            )
    
    )