Учитывая массив массивов, как мне естественным образом отсортировать внутренние массивы на основе их значений?
Пример массива:
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 будет таким же (поскольку Менеджер 1 и Менеджер 3 уже в порядке):
array (size=2)
0 =>
array (size=1)
'manager' => string 'Manager 1' (length=9)
1 =>
array (size=1)
'manager' => string 'Manager 3' (length=9)
Ожидаемый результат массива 2 поставит январь перед июнем («естественный» порядок):
// 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)
3 ответа
Что ж! Вы можете упростить функцию, используя следующие функции естественной сортировки:
usort($array, function($a, $b){
return strnatcmp($a['manager'],$b['manager']); //Case sensitive
//return strnatcasecmp($a['manager'],$b['manager']); //Case insensitive
});
Вы можете использовать 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);
(NB: если вам в конечном итоге понадобятся ключи, вам обязательно придется перейти по настраиваемому свернутому пути с помощью array_keys или uksort ())
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']))
, чтобы получить номер месяца для сравнения. Дополнительные способы сделать это можно найти здесь: преобразовать месяц из названия в число
Похожие вопросы
Связанные вопросы
Новые вопросы
php
PHP — это открытый, мультипарадигмальный, динамически типизированный и интерпретируемый язык сценариев, изначально разработанный для веб-разработки на стороне сервера. Используйте этот тег для вопросов о программировании на языке PHP.