Страницы

Поиск по вопросам

пятница, 11 января 2019 г.

Сортировка многомерного массива с не порядковыми id

Нужно отсортировать многомерный массив таким образом, чтобы элементы шли по возрастанию, по определенному параметру, но при это те элементы, параметр которых равен 0, были в самом низу.
Дополнительную сложность создает то, что ключи массива — это id-шники элементов, и идут они не по порядку, т.е., 4432, 4457, 5000, к примеру.
пример массива:
{ '4444'=>{id=>3, pole=>12 и тд..}, '4545'=>{id=>23, pole=>12322 и тд..} и тд.. }
pole — это поле, по значению которого нужно будет фильтровать.
Понимаю, что нужно это дело перебирать пузырьком, но на моменте понимая как вытащить следующий не порядковый айдишник из массива, мозг вскипел.
Подскажите, как быть, и в какую сторону копать.


Ответ

Сортировать массивы в php гораздо проще и эффективнее не пузырьком, а готовыми функциями, некоторые из которых вторым параметром берут имя функции которая сравнивает между собой 2 элемента и возвращает +1 если первый элемент большое второго, -1 если меньше и 0 - если они равны. Для вашего случая код должен выглядеть примерно так:
array("id"=>3, "pole"=>12), '3556'=>array("id"=>45, "pole"=>0), '4545'=>array("id"=>23, "pole"=>12322), '2557'=>array("id"=>49, "pole"=>0), '5555'=>array("id"=>54, "pole"=>111) ); function mysort($k1, $k2) { if($k1['pole']==0) return 1; if($k2['pole']==0) return -1; return $k1['pole']-$k2['pole']; }
uasort($A,"mysort"); // Вот собственно uasort и сортирует массив с использованием mysort для сравнения элементов
print_r($A); ?>
Результат:
Array ( [4444] => Array ([id] => 3 [pole] => 12 ) [5555] => Array ([id] => 54 [pole] => 111) [4545] => Array ([id] => 23 [pole] => 12322) [3556] => Array ([id] => 45 [pole] => 0) [2557] => Array ([id] => 49 [pole] => 0) )
Но если не смотря на лучшую эффективность встроенной сортировки и краткость кода хочется работать с таким массивом вручную, то перебирать его надо foreach, запоминая предыдущий ключ массива (ну или вместе с содержимым, это как удобно):
$prev=0; foreach($A as $key=>$val) { if(!$prev) {$prev=$key; continue;} print "$key <> $prev
"; if($A[$key]['pole']==0 && $A[$prev]['pole']!=0) ... $prev=$key; }

Комментариев нет:

Отправить комментарий