I have an array being created which contains a date:
JavaScript
x
$arr = array();
$arr["one"][] = array(
'due' => '17-01-2021 10:00:00',
);
$arr["one"][] = array(
'due' => '17-01-2021 09:00:00',
);
$arr["two"][] = array(
'due' => '19-01-2021 09:00:00',
);
$arr["two"][] = array(
'due' => '18-01-2021 09:00:00',
);
And I want to order by the value of the ‘due’ key
I tried adding this uasort function:
JavaScript
uasort($arr, function ($a, $b) {
return $a["due"] <=> $b["due"];
});
print_r($arr);
But that still shows in the order above, whereas it should be showing the ’09:00:00′ value first
Advertisement
Answer
Your approach wasn’t really that far off, I basically just changed a few little things:
- Loop over each “word-number-indexed” array individually (those indexed under
one
andtwo
in the main array$arr
). - Convert the due dates/times to unix timestamps to have an integer that can be compared. Without this, PHP tries to sort the strings on a character-by-character basis which does not work with your format but would work if your format was
YYYY-MM-DD hh:mm:ss
(because the “biggest” position value would be at the start). - Use
usort
instead ofuasort
since there is no point in keeping the keys (which are integers to begin with and neitherone
nordue
in this context.
JavaScript
$arr = array();
$arr["one"][] = array(
'due' => '17-01-2021 10:00:00',
);
$arr["one"][] = array(
'due' => '17-01-2021 09:00:00',
);
$arr["two"][] = array(
'due' => '19-01-2021 09:00:00',
);
$arr["two"][] = array(
'due' => '18-01-2021 09:00:00',
);
foreach ($arr as &$numberIndex) {
usort($numberIndex, function ($a, $b) {
return strtotime($a["due"]) <=> strtotime($b["due"]);
});
}
print_r($arr);
Some side notes:
- Note the
&
at&$numberIndex
, without this PHP works on an in-place copy of your value and it is never changed in$arr
. - This approach with
strototime()
only works if all your dates/times are after epoch time 0 (which is 1st of January 1970). If you need to use older dates you can createDateTime()
objects within the sort callback.
The resulting array looks like this:
JavaScript
Array
(
[one] => Array
(
[0] => Array
(
[due] => 17-01-2021 09:00:00
)
[1] => Array
(
[due] => 17-01-2021 10:00:00
)
)
[two] => Array
(
[0] => Array
(
[due] => 18-01-2021 09:00:00
)
[1] => Array
(
[due] => 19-01-2021 09:00:00
)
)
)