У меня есть простой многоадресный массив, как описано ниже, который мне нужно заказать по его метке ключа (а не по значению ключа).
array( 1 => array( 2 => array(); 11 => array(); 20 => array(); 31 => array(); 4 => array(); 43 => array(); 12 => array(); 3 => array(); ); 2 => array(); 11 => array(); 20 => array(); 31 => array(); 4 => array(); 43 => array(); 12 => array(); 3 => array(); );
Проблема в том, что мой заказ возвращает мои упорядоченные массивы:
1, 11, 12, 2, 20, 3, 31,
т. Д. И не 1,2,3,4,11,12,
т. Д.
Это моя функция упорядочения:
private function orderByKey(&$array) { ksort($array); foreach($array as $value) { if (is_array($value)) { $this->orderByKey($value); } } }
Что здесь может быть неправильным?
Благодарю.
Вам нужно получить доступ к $ value как ссылку на запись в $ array
private function orderByKey(&$array) { ksort($array); foreach($array as &$value) { if (is_array($value)) { $this->orderByKey($value); } } }
Второй параметр для sort () и ksort () – sort_flags. Если вы хотите, чтобы он сортировался по номеру, а не по строковому значению (как это выглядит в настоящее время), вы должны установить этот параметр:
ksort($my_array, SORT_NUMERIC);
Проверьте страницу для sort (), где объясняются разные флаги сортировки: http://www.php.net/manual/en/function.sort.php
Вы можете использовать функцию natksort
.
Рядом с тем, чтобы не сортировать подмассивы, я также прочитал ваш вопрос о том, что у вас возникла проблема в сортировке ключей в том порядке, в котором вы указываете в своем вопросе ( 1, 11, 12, 2, 20, 3, 31, ...
):
uksort($array, function($a, $b) { return strcmp("$a ", "$b "); });
Этот вид заполняет каждый ключ пробелами, так что 3 больше 20, но меньше 30.
Полный код:
private function orderByKey(&$array) { if (!is_array($array)) return; uksort($array, function($a, $b) { return strcmp("$a ", "$b "); }); array_walk($array, [$this, 'orderByKey']); }
Или если ksort()
работает для вас:
private function orderByKey(&$array) { if (!is_array($array)) return; ksort($array); array_walk($array, [$this, 'orderByKey']); }
http://www.php.net/manual/en/function.uksort.php
Это то, что вы ищете; вместо ksort:
uksort($array, function ($a, $b) { return $a - $b; });
ksort($myarray); foreach ($myarray as $key => $val) { echo "$key = $val\n"; }