phparrayssortinggroupingassociative-array

Group 2d array data by one column and then sort by another column


I have an array that I am wanting to resort into an array by the value. Here is the existing array:

  1 => Array (9)
  OrgID => "XXXX"
  DOB => "1970-01-01"
  PersonID => "111111"
  ExpDate => "2013-07-31"
  Level => "WELITE"
  Status => "Active"
  FName => "Jane"
  LName => "Doe"
  Checked => null
2 => Array (9)
  OrgID => "XXXX"
  DOB => "1970-01-01"
  PersonID => "222222"
  ExpDate => "2013-07-31"
  Level => "WELITE"
  Status => "Active"
  FName => "Jane"
  LName => "Doe"
  Checked => null
3 => Array (9)
  OrgID => "XXXX"
  DOB => "1970-01-01"
  PersonID => "22222"
  ExpDate => "2013-07-31"
  Level => "WELITE"
  Status => "Active"
  FName => "Jane"
  LName => "Doe"
  Checked => null

I am trying to resort the array into the following and create a key based on the value called level:

 WELITE  => (3)
  1 => Array (9)
  OrgID => "XXXX"
  DOB => "1970-01-01"
  PersonID => "111111"
  ExpDate => "2013-07-31"
  Status => "Active"
  FName => "Jane"
  LName => "Doe"
  Checked => null
2 => Array (9)
  OrgID => "XXXX"
  DOB => "1970-01-01"
  PersonID => "222222"
  ExpDate => "2013-07-31"
  Status => "Active"
  FName => "Jane"
  LName => "Doe"
  Checked => null
3 => Array (9)
  OrgID => "XXXX"
  DOB => "1970-01-01"
  PersonID => "22222"
  ExpDate => "2013-07-31"
  Status => "Active"
  FName => "Jane"
  LName => "Doe"
  Checked => null

Here is what I have tried so far:

    $sort = array();
foreach($WlevelArray as $k=>$v) {
    $sort['Level'][$k] = $v['Level'];
    $sort['OrgID'][$k] = $v['OrgID'];
}
array_multisort($sort['Level'], SORT_DESC, $sort['OrgID'], SORT_ASC, $WlevelArray);

but this produces two arrays.


Solution

  • I am a little confused on what you are specifically looking for, based on what I think you are aiming at I have included code below.

    Set up arrays:

    $example1 = array(
      "OrgID" => "XXXX",
      "DOB" => "1970-01-01",
      "PersonID" => "111111",
      "ExpDate" => "2013-07-31",
      "Level" => "WELITE",
      "Status" => "Active",
      "FName" => "Jane",
      "LName" => "Doe",
      "Checked" => null
    );
    
    $example2 = array(
      "OrgID" => "XXXX",
      "DOB" => "1970-01-01",
      "PersonID" => "222222",
      "ExpDate" => "2013-07-31",
      "Level" => "WELITE",
      "Status" => "Active",
      "FName" => "Jane",
      "LName" => "Doe",
      "Checked" => null
    );
    
    $example3 = array(
      "OrgID" => "XXXX",
      "DOB" => "1970-01-01",
      "PersonID" => "22222",
      "ExpDate" => "2013-07-31",
      "Level" => "WELITE",
      "Status" => "Active",
      "FName" => "Jane",
      "LName" => "Doe",
      "Checked" => null
    );
    
    // Initial array
    $initArray = array($example1, $example2, $example3);
    

    Now let's 'sort':

    $finalArray = array();
    $i = 0;
    foreach ($initArray as $key => $value) {
        (isset($value['Level'])) ? $finalArray[$value['Level']][$i] = $value : NULL;
        unset($finalArray[$value['Level']][$i]['Level']);
        $i++;
    }
    
    echo '<pre>', print_r($finalArray, true), '</pre>';
    

    Output:

    Array
    (
        [WELITE] => Array
            (
                [0] => Array
                    (
                        [OrgID] => XXXX
                        [DOB] => 1970-01-01
                        [PersonID] => 111111
                        [ExpDate] => 2013-07-31
                        [Status] => Active
                        [FName] => Jane
                        [LName] => Doe
                        [Checked] => 
                    )
    
                [1] => Array
                    (
                        [OrgID] => XXXX
                        [DOB] => 1970-01-01
                        [PersonID] => 222222
                        [ExpDate] => 2013-07-31
                        [Status] => Active
                        [FName] => Jane
                        [LName] => Doe
                        [Checked] => 
                    )
    
                [2] => Array
                    (
                        [OrgID] => XXXX
                        [DOB] => 1970-01-01
                        [PersonID] => 22222
                        [ExpDate] => 2013-07-31
                        [Status] => Active
                        [FName] => Jane
                        [LName] => Doe
                        [Checked] => 
                    )
    
            )
    
    )
    

    Edit

    I did find an issue when changing the 'Level' value, the index would keep incrementing since I was using an auto-incrementing variable $i. So I added sort($finalArray[$value['Level']]); and it reset the index values.

    foreach ($initArray as $key => $value) {
        (isset($value['Level'])) ? $finalArray[$value['Level']][$i] = $value : NULL;
        unset($finalArray[$value['Level']][$i]['Level']);
        // Add this line to fix indexes
        sort($finalArray[$value['Level']]);
        $i++;
    }