2013-03-12 2 views
0

У меня есть массив, который выглядит следующим образом:PHP сортировки многомерный массив

Array 
(
[13] => Array 
     (
      [name] => Blah blah 
      [description] => Blah blah blah 
      [parent_group_id] => 8 
      [display] => Blah : Blah 
      [stamps] => Array 
       (
        [73] => Array 
         (
          [stamp_id] => 73 
          [name] => Blah 
          [is_member] => 
          [rank] => 2   <-- 
          [description] => Blah blah blah 
          [rank_token] => easy 
         ) 
        [80] => Array 
         (
          [stamp_id] => 80 
          [name] => Blah 
          [is_member] => 
          [rank] => 1   <-- 
          [description] => Blah blah blah 
          [rank_token] => medium 
         ) 
        [73] => Array 
         (
          [stamp_id] => 73 
          [name] => Blah 
          [is_member] => 
          [rank] => 4   <-- 
          [description] => Blah blah blah 
          [rank_token] => easy 
         ) 

        [80] => Array 
         (
          [stamp_id] => 80 
          [name] => Blah 
          [is_member] => 
          [rank] => 3   <-- 
          [description] => Blah blah blah 
          [rank_token] => medium 
         ) 
       ) 
     ) 
) 

Однако я хочу, чтобы отсортировать объекты в этом массиве по номерам, что держит [ «ранг»], которые являются 1, 2 , 3 и 4. (Я добавил стрелки в примеры кода). После использования usort я хочу, чтобы все было отсортировано в порядке чисел. Поэтому я хотел бы, чтобы это выглядело так:

Array 
(
[13] => Array 
     (
      [name] => Blah blah 
      [description] => Blah blah blah 
      [parent_group_id] => 8 
      [display] => Blah : Blah 
      [stamps] => Array 
       (
        [80] => Array 
         (
          [stamp_id] => 80 
          [name] => Blah 
          [is_member] => 
          [rank] => 1   <-- 
          [description] => Blah blah blah 
          [rank_token] => medium 
         ) 
        [73] => Array 
         (
          [stamp_id] => 73 
          [name] => Blah 
          [is_member] => 
          [rank] => 2   <-- 
          [description] => Blah blah blah 
          [rank_token] => easy 
         ) 
        [80] => Array 
         (
          [stamp_id] => 80 
          [name] => Blah 
          [is_member] => 
          [rank] => 3   <-- 
          [description] => Blah blah blah 
          [rank_token] => medium 
         ) 
        [73] => Array 
         (
          [stamp_id] => 73 
          [name] => Blah 
          [is_member] => 
          [rank] => 4   <-- 
          [description] => Blah blah blah 
          [rank_token] => easy 
         ) 
       ) 
     ) 
) 

Мой фактический массив намного больше, однако он все еще следует этому образцу.

+0

Я думаю, что это поможет: michi

+1

Вы уже упоминали «usort», что вы пробовали? 'foreach ($ array as $ key => $ value) usort ($ array [$ key] ['штампы'], 'yourusortfunction');' – Wrikken

ответ

1

Это должно работать, если я правильно понял ваш вопрос:

function cmp($a, $b) 
{ 
    if ($a['rank'] == $b['rank']) { 
     return 0; 
    } 
    return ($a['rank'] < $b['rank']) ? -1 : 1; 
} 
foreach($yourArray as &$entry) { 
    uasort($entry['stamps'], "cmp"); 
} 
unset($entry); 

print_r($yourArray); 

Обратите внимание, что функция CMP почти такая же, как и в руководстве. Амперсанд в foreach означает, что созданная переменная является псевдонимом элемента массива вместо копии (как это обычно делает PHP). Функция unset() существует, потому что если вы попытаетесь использовать переменную с именем $ entry позже, вы фактически будете манипулировать последней записью в массиве.

Если вам это не удобно, есть и другие способы его скинов; Например, вы можете создать вторую функцию и array_map его в оригинале, таким образом:

function cmp($a, $b) 
{ 
    if ($a['rank'] == $b['rank']) { 
     return 0; 
    } 
    return ($a['rank'] < $b['rank']) ? -1 : 1; 
} 
function sort_entry($entry) 
{ 
    uasort($entry['stamps'], "cmp"); 
    return $entry; 
} 
array_map('sort_entry', $yourArray);  
print_r($yourArray); 
+0

Работал как шарм, большое вам спасибо! – user2154729

+0

Нет проблем, приятный вечер – Matt

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