2016-01-22 4 views
1

У меня есть этот массив:Лучший способ сортировки многомерных массивов в PHP

$order_list = array (array ("081", "01203", "2", "12000"), 
         array ("002", "01204", "8", NULL), 
         array ("021", "01207", "8", NULL), 
         array ("081", "01206", "8", NULL), 
         array ("043", "01205", "10", "14000"));   

и я хочу, чтобы отсортировать (по возрастанию), что массив на основе первого значения (081, 002, 021, 081 и 043). так что это будет выглядеть так:

array (array ("002", "01204", "8", NULL), 
     array ("021", "01207", "8", NULL), 
     array ("043", "01205", "10", "14000"), 
     array ("081", "01203", "2", "12000"), 
     array ("081", "01206", "8", NULL)); 

как это сделать? Я узнал о asort() и ksort(), но кажется, что работает только для ассоциативного массива, а не для многомерного массива.

+4

прочитайте о 'usort() ' – splash58

+2

Посмотрите на колонку ** Похожие ** в правой части этой страницы ... Есть много очень полезных вопросов и ответов. Кроме того, поиск 'Google:' 'php sort multi array'. –

+2

Это такой дублированный вопрос (и любые ответы) :) Он имеет один из самых популярных вопросов здесь. –

ответ

3

Вы можете использовать usort()

usort($yourArray, function ($a, $b) { 
    if ($a[0] == $b[0]) return 0; 
    return (int) $a[0] < (int) $b[0] ? -1 : 1; 
}); 

Параметры $a и $b ваши (суб) массивы. Эта простая функция сравнивает первое значение в каждом из них.

Если у вас, кроме чисел в массиве вы могли бы использовать strcmp():

usort($yourArray, function ($a, $b) { 
    return strcmp($a[0], $b[0]); 
}); 
+0

Помните, что 'usort' демонстрирует [неопределенное поведение] (http://php.net/manual/en/function.usort.php) (сначала * Примечание * в этой ссылке), если ваша функция сортировки возвращает' 0'. – morido

+0

@ morido, ты делаешь это хуже, чем есть. В нем просто говорится, что нет способа сообщить, возвращается ли значение 0, тогда usort не может определить, какая из двух (массивов в этом случае) на первом месте, что совершенно нормально, поскольку считается, что они равны. – Michael

+0

Я просто говорю, как это. В конце концов, это прекрасный источник (трудно найти) ошибок. Поэтому я предпочитаю * всегда * делать детерминированное поведение и либо сначала форматировать '$ a', либо' $ b', а не оставлять это для реализации. – morido

1

Это проще переписать так:

usort($order_list, function($v1, $v2) { return $v1[0] - $v2[0]; }); 

Или это очень удобно для сортировки массивов с sorted Функция от Nspl:

use function \nspl\a\sorted; 
use function \nspl\op\itemGetter; 

$sortedOrders = sorted($order_list, itemGetter(0)); 
+0

Приятное прикосновение с 'return $ a - $ b' – Michael

+1

Я просто пробовал, что произойдет, если вы опустили литую часть' (int) ', которая отлично работает. Таким образом, вы можете просто сделать 'return $ v1 [0] - $ v2 [0];' – Michael

+1

Приятное обнаружение. Поскольку '-' не определен для строки, PHP автоматически переводит значения в числовые. Обновление ответа. –