Reputation: 677
Array(
["car"] => Array(
[12/11/1989] => (...)
[6/14/2011] => (...)
[5/2/2012] => (...)
)
["sled"] => Array(
[1/15/2001] => (...)
[4/14/2004] => (...)
[5/23/2005] => (...)
)
["boat"] => Array(
[12/1/1999] => (...)
[6/14/2000] => (...)
[8/23/2000] => (...)
)
)
Given the above array structure, I am trying to sort the keys ["boat"], ["sled"], ["car"]
by the first date key in their respective sub-arrays. So the correct key order would now be car, boat, sled. Is there an elegant or easy way to do this with PHP?
Upvotes: 0
Views: 94
Reputation: 38308
You'll need to use uasort
and compare the first key value of each array. Cast to a timestring using strtotime
to simplify date comparisons:
<?php
$array = array(
"car" => array(
"12/11/1989" => "first element",
"6/14/2011" => "second element",
"5/2/2012" => "third element",
),
"sled" => array(
"1/15/2001" => "first element",
"4/14/2004" => "second element",
"5/23/2005" => "third element",
),
"boat" => array(
"12/1/1999" => "first element",
"6/14/2000" => "second element",
"8/23/2000" => "third element",
),
);
uasort($array, function($a, $b) {
$ts1 = strtotime(reset(array_keys($a)));
$ts2 = strtotime(reset(array_keys($b)));
if ($ts1 === $ts2) {
return 0;
}
return ($ts1 < $ts2) ? -1 : 1;
});
var_export($array);
Which will output:
array (
'car' =>
array (
'12/11/1989' => 'first element',
'6/14/2011' => 'second element',
'5/2/2012' => 'third element',
),
'boat' =>
array (
'12/1/1999' => 'first element',
'6/14/2000' => 'second element',
'8/23/2000' => 'third element',
),
'sled' =>
array (
'1/15/2001' => 'first element',
'4/14/2004' => 'second element',
'5/23/2005' => 'third element',
),
)
Upvotes: 0
Reputation: 780889
Use uasort()
to sort the array with a user-supplied comparison function, keeping the keys of the associative array.
function compare_first_key_date($a, $b) {
$a_keys = array_keys($a);
$a_date = strtotime($a_keys[0]);
$b_keys = array_keys($b);
$b_date = strtotime($b_keys[0]);
return $a_date - $b_date;
}
uasort($array, 'compare_first_key_date');
Upvotes: 4