2016-05-06 3 views
1

То, что я пытаюсь сделать, это сортировать многомерный массив по числу, но иметь любые значения, равные 0, в конце массива.Сортировка многомерного массива по номерному значению с нулевым последним

Этот код работает для сортировки с 0 и одной цифрой, но, похоже, он разбивается, когда к нему добавляются разные цифры.

Выход должен быть: 41,42,43,44,45,46,0,0,0

<?php 

$array = array(
    array(
     "position" => 41, 
    ), 
    array(
     "position" => 43, 
    ), 
    array(
     "position" => 42, 
    ), 
    array(
     "position" => 44, 
    ), 
    array(
     "position" => 45, 
    ), 
    array(
     "position" => 0, 
    ), 
    array(
     "position" => 0, 
    ), 
    array(
     "position" => 0, 
    ), 
    array(
     "position" => 46, 
    ), 
); 
// Sort ascending 
usort($array, 'sortByPosition'); 

// Show result 
echo '<pre>'; 
print_r($array); 

function sortByPosition($a, $b) { 
    return $a['position'] != 0 ? $a['position'] - $b['position'] : $b['position'] - $a['position']; 
} 

ответ

2

Ваша функция сравнения откусил. Я хотел бы сделать это следующим образом:

function sortByPosition($a, $b) { 
    if ($a['position'] == $b['position']) return 0; 
    if ($a['position'] == 0) return 1; 
    if ($b['position'] == 0) return -1; 
    return $a['position'] > $b['position'] ? 1 : -1; 
} 
  • Во-первых, если обе позиции совпадают, возвращают 0, независимо от того, является ли либо от того, являются они равны нулю.

  • Второй и третий, если любой из них являются ноль, что нужно сортировать за другим (так как он уже вернулся бы, если они были равны нулю).

  • В-четвертых, ни один из них не равен нулю, поэтому просто сравните значения.

+0

Хорошо это имеет смысл сейчас. Спасибо за ответ. Похоже, есть еще один ответ, который тоже работает. – stwhite

+0

Другой проще. Не беспокойтесь, если вы предпочтете это принять. –

+0

Для людей, пытающихся выяснить то же самое, что и я, я думаю, что ваш ответ дает объяснение, которое, я считаю, более важно. – stwhite

1

Таким образом:

usort($array, function ($a, $b) { 
    if (!$a['position']) return 1; 
    if (!$b['position']) return -1; 
    return $a['position']-$b['position']; 
}); 
+0

Что делать, если '$ a ['position']' false или пустой или пустой массив вообще? Вопрос был о '0'. – Axalix

+0

Это также правильный ответ, и он работает в моем случае с числами, однако следите за ложными значениями. См. Принятый ответ для объяснения того, как эта сортировка работает. – stwhite

+0

@Axalix: массив содержит только числа, ваш вопрос не имеет значения. –

Смежные вопросы