1

I need some help about sorting a multiple array. This is what I got:

Array ( 
   [ALU0000001] => 
         Array ( [0] => Array ( [period] => 2012 [codCurse] => S12-2030 [idPersona] => ALU0000001 [date] => 2012-04-02 [amount] => 238.00 [active] => X ) 
                 [1] => Array ( [period] => 2012 [codCurse] => S12-2030 [idPersona] => ALU0000001 [date] => 2012-05-02 [amount] => 238.00 [active] => X )
                 [2] => Array ( [period] => 2012 [codCurso] => S12-2030 [idPersona] => ALU0000001 [date] => 2012-06-02 [amount] => 238.00 [active] => X )
                 [3] => Array ( [period] => 2013 [codCurso] => S12-2030 [idPersona] => ALU0000001 [date] => 2013-01-02 [amount] => 238.00 [active] => X )

   [ALU0000005] =>
         Array ( [0] => Array ( [period] => 2013 [codCurse] => S13-2010 [idPersona] => ALU0000005 [date] => 2013-03-01 [amount] => 225.00 [active] => X )
                 [1] => Array ( [period] => 2013 [codCurse] => S13-2010 [idPersona] => ALU0000005 [date] => 2013-03-02 [amount] => 333.00 [active] => X ) 
                 [2] => Array ( [period] => 2013 [codCurse] => S13-2010 [idPersona] => ALU0000005 [date] => 2013-04-02 [amount] => 333.00 [active] => X ) 

I need to sort multiarray by period date to get something like this

  Y   M   D
  2012 2012-04-02 ALU00000001 .....
  2012 2012-05-02 ALU00000005 .....
  2012 2012-06-01 ALU00000001 .....
  2013 2013-01-01 ALU00000001 .....
  2013 2013-06-01 ALU00000001 .....
  2013 2013-12-24 ALU00000005 .....

Thanks

Jens Bergvall
  • 1,617
  • 2
  • 24
  • 54
Zuko
  • 13
  • 4

2 Answers2

1

As danp says you will need a custom sort function using PHP usort.

You execute this in Codeigniter using the syntax;

usort($data_array, array('controller', 'sort_function'));

function sort_function($a, $b)
{
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}
gen_Eric
  • 223,194
  • 41
  • 299
  • 337
Rooneyl
  • 7,802
  • 6
  • 52
  • 81
0

Considering the main array keys don't do much (because they're already contained within the values by the date key) you can safely ignore them. So first you want to collect all the values into a single array to be able to sort later:

$allItems = array();
foreach ($outputArr as $arr) { // $outputArr should be the name of your array
    $allItems = array_merge($allItems,array_values($arr));
}

Then you need to sort the array values by the date keys:

function sortByDate($a,$b) {
    $d1 = strtotime($a['date']);
    $d2 = strtotime($b['date']);
    return $d1 == $d2 ? 0 : ($d1 > $d2 ? 1 : -1);
}
usort($allItems,'sortByDate');
// and there you go.
print_r($allItems);
inhan
  • 7,394
  • 2
  • 24
  • 35