Search code examples
phparraysmultidimensional-arraygroupingsub-array

Group data from a 2d array by a column value and push the original row into its dedicated group


I have this array

array
  0 => 
    array

      'prodid' => string '2' (length=1)
      'qty' => int 2
      'price' => string '100.00' (length=6)
      'sid' => string '13' (length=2)
  2 => 
    array

      'prodid' => string '3' (length=1)
      'qty' => int 1
      'price' => string '380.00' (length=6)
      'sid' => string '13' (length=2)
  1 => 
    array

      'prodid' => string '8' (length=1)
      'qty' => int 1
      'price' => string '300.00' (length=6)
      'sid' => string '24' (length=2)

How can i split it in to a multi dimentional array where the values 'sid' match like so.

array
  0 => 
    array

      0 => 
        array
          'prodid' => string '2' (length=1)
          'qty' => int 2
          'price' => string '100.00' (length=6)
          'sid' => string '13' (length=2)
      1 => 
        array
          'prodid' => string '2' (length=1)
          'qty' => int 2
          'price' => string '100.00' (length=6)
          'sid' => string '13' (length=2)

  1 => 
    array

      0 => 
        array
          'prodid' => string '7' (length=1)
          'qty' => int 1
          'price' => string '200.00' (length=6)
          'sid' => string '15' (length=2)

Solution

  • // $ouput array will be indexed by the 'sid' value
    $output = array();
    
    // Iterate over the main array and create a new subarray if 
    // it doesn't already exist, or add to it if it does.
    foreach($input as $subarr) {
      if (!isset($output[$subarr['sid']]) {
        // New array indexed by sid
        $output[$subarr['sid']] = array();
      }
      // Append the whole array
      $output[$subarr['sid']][] = $subarr;
    }
    

    Note: this produces slightly different output than you described, in that it uses the sid as array keys rather than just indexing them from 0:

    array
      // Note key difference...
      // sid == 13
      13 => 
        array
          0 => 
            array
              'prodid' => string '2' (length=1)
              'qty' => int 2
              'price' => string '100.00' (length=6)
              'sid' => string '13' (length=2)
          1 => 
            array
              'prodid' => string '2' (length=1)
              'qty' => int 2
              'price' => string '100.00' (length=6)
              'sid' => string '13' (length=2)
      // sid == 15
      15 => 
        array
    
          0 => 
            array
              'prodid' => string '7' (length=1)
              'qty' => int 1
              'price' => string '200.00' (length=6)
              'sid' => string '15' (length=2)