2011-12-28 4 views
1

У меня есть массив, содержащий значения север, восток, юг или запад.Сортировка массива с usort

Например, я получил массив со значениями в этом порядке: юг, запад и север.

Теперь я хотел бы отсортировать массив, как север, восток, юг и запад.

Итак, в моем примере значения должны быть в таком порядке: север, юг, запад.

Как я могу это сделать?

Спасибо!

+0

Пожалуйста, добавьте код, который вы сделали до сих пор. Даже если это только определение массивов. И, может быть, вы можете подчеркнуть тот момент, когда вы тоже застряли в этой проблеме. – hakre

+0

Часто очень полезно [сравнение функций сортировки массивов] (http://www.php.net/manual/en/array.sorting.php). – hakre

+0

Можете ли вы дать немного больше деталей, почему вы хотите отсортировать его таким образом? Что ты пытаешься сделать? Как и сейчас, я не понимаю, почему вы не просто создавали массив, сортированный таким образом, как вы хотите, так как вы уже знаете, что ему нужно содержать. –

ответ

6

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

$cardinals = array('north', 'east', 'south', 'west'); 
$input = array('south', 'west', 'north'); 

print_r(array_intersect($cardinals, $input)); 
+0

Спасибо, это работает! – Jordy

+0

Интересно, мне нравятся три вещи (по крайней мере), это краткий *, но * также очень понятный, не использует обратный вызов и не является расширяемым (если нужно добавить северо-восток и т. Д.) В качестве решения обратного вызова. Ухоженная! – zrvan

+0

Да, очень аккуратный. Если вам нужно отсортировать по ключам, также есть ['array_intersect_key'] (http://php.net/array_intersect_key). – hakre

0

Вы могли бы сделать что-то вдоль линий этого (я считаю, что это то, что Самуэль Лопес также указывает в комментариях):

$arr = array ('north', 'west', 'south', 'east',); 

function compass_sort ($a, $b) 
{ 
     $cmptable = array_flip (array (
       'north', 
       /* you might want to add 'northeast' here*/ 
       'east', 
       /* and 'southeast' here */ 
       'south', 
       'west', 
     )); 

     $v1 = trim (mb_strtolower ($a)); 
     $v2 = trim (mb_strtolower ($b)); 

     if (! isset ($cmptable[$v1]) 
      || ! isset ($cmptable[$v2])) 
     { 
       /* error, no such direction */ 
     } 

     return $cmptable[$v1] > $cmptable[$v2]; 
} 

usort ($arr, 'compass_sort'); 

Это присваивает номер каждому направлению и родам по этому номеру , north будет присвоен ноль, east один (если вы не добавите что-то между ними) и т. Д.

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