Учитывая массив массивов, как бы я естественным образом сортировал внутренние массивы на основе их значений?
Пример массива:
array (size=2) 0 => array (size=1) 'manager' => string 'Manager 1' (length=9) 1 => array (size=1) 'manager' => string 'Manager 3' (length=9)
Другой примерный массив:
array (size=2) 0 => array (size=1) 'month' => string 'June' (length=4) 1 => array (size=1) 'month' => string 'January' (length=7)
Моя первая идея состояла в том, чтобы просто natsort()
их, но это ожидает нормальный массив. Следующей идеей было использование array_multisort($array, SORT_NATURAL);
, но это не сработало из-за ассоциативных массивов.
Итак, как я мог сортировать внутренние массивы при использовании естественной сортировки? Кроме того, сохранение ключей массива в данном случае не имеет значения.
РЕДАКТИРОВАТЬ:
Ожидаемый результат массива 1 будет таким же (поскольку Manager 1 и Manager 3 уже в порядке):
array (size=2) 0 => array (size=1) 'manager' => string 'Manager 1' (length=9) 1 => array (size=1) 'manager' => string 'Manager 3' (length=9)
Ожидаемый выпуск массива два поставит январь впереди июня («естественный» заказ):
// 0 and 1 keys can switch or stay the same, doesn't matter array (size=2) 0 => array (size=1) 'month' => string 'January' (length=4) 1 => array (size=1) 'month' => string 'June' (length=7)
Ну !, Вы можете упростить функцию, используя естественные функции сортировки, такие как:
usort($array, function($a, $b){ return strnatcmp($a['manager'],$b['manager']); //Case sensitive //return strnatcasecmp($a['manager'],$b['manager']); //Case insensitive });
usort()
PHP позволяет вам определить пользовательскую функцию обратного вызова для сортировки:
usort($array, function($a, $b){ if ($a['manager'] == $b['manager']) { return 0; } return ($a['manager'] < $b['manager']) ? -1 : 1; });
Для сортировки месяцев вы можете использовать что-то вроде date('m', strtotime($a['month']))
чтобы получить номер месяца для сравнения. Больше способов сделать это можно найти здесь: конвертировать месяц от имени к числу
Вы можете использовать usort () и написать свою собственную функцию сравнения. Я начал с вашего массива примеров, а затем изменил индексы на строки, чтобы убедиться, что это сработало. Я тестировал его тремя способами, и все они работали, в том числе array_multisort (если вам не нужны ключи, как вы сказали).
# Quick, dirty, and probably not suitable for any use, anywhere, by anyone $test1 = array(); $test1["zero"]="June"; $test1["one"] ="January"; function nat_cmp($a,$b){ return strnatcmp($a,$b); } #usort($test1, 'nat_cmp'); # Returns {0=>"January",1=>"June"} #usort($test1, function($a,$b){return strnatcmp($a,$b);}); # Same array_multisort($test1, SORT_ASC, SORT_NATURAL); #Same var_dump($test1);
(Примечание. Если вам действительно нужны ключи, вам обязательно нужно выполнить настраиваемый путь с помощью array_keys или uksort ())