Естественная сортировка ассоциативного массива?

Учитывая массив массивов, как бы я естественным образом сортировал внутренние массивы на основе их значений?

Пример массива:

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 ())