2015-01-25 4 views
0

Я ассоциативный массив которым мне нужно Sord по значению:многомерных ассоциативный массив сортировки по значению

Array 
(
    ['group_1'] => Array 
     (
      ['key_1'] => Array 
       (
         ['field_1'] = 'someval', 
         ['order'] = 2 
       ) 
      ['key_2'] => Array 
       (
         ['field_1'] = 'someval', 
         ['order'] = 0 
       ) 
     ) 

    ['group_2'] => Array 
     (
      ... 
     ) 
) 

Я пытаюсь отсортировать каждый массив «group_N» на поле «порядок» с usort():

function cmp($a, $b) { 
    if ($a['order'] == $b['order']) { 
     return 0; 
    } 
    return ($a['order'] < $b['order']) ? -1 : 1; 
} 

foreach ($result_array as $group => $values) {  
     uasort($values, "cmp");   
} 

Но никакого успеха. Как я могу это сделать?

+0

Вы сортируете локальную переменную '$ values', которая не хранится нигде. '$ result_array [$ group] = $ values;' – zerkms

+4

передать '$ values' по ссылке. 'foreach ($ result_array as & $ group => & $ value)'. честно говоря, я думаю, что было бы лучше использовать карту массива с анонимной функцией, содержащей сортировку, в отличие от foreach, но это только я. – r3wt

+1

@ r3wt 1. 'array_map' действительно принимает копию массива 2. Он не работает с ключами 3. Мутации/изменчивость не круты; ;-) – zerkms

ответ

-1

Попробуйте использовать ниже логику. для меня это работает.

usort($arr, function($a, $b) { 
return $a['order'] - $b['order']}); 
0

Передача аргументов путем ссылки, как предложено, решила проблему.

Работа отлично с:

foreach ($result_array as $group => &$values) {  
    uasort($values, "cmp");   
} 
0

изменить массив в foreach цикле, вы должны передать ключ/Вэл по ссылке, как так

foreach ($result_array as &$group => &$values) {  
     uasort($values, "cmp");   
} 

или использовать array walk() (в соответствии с @zerkms это медленнее, поэтому, вероятно, плохая идея)

array_walk($array, 
    function(&$row){ 
     uasort($row, "cmp"); 
    } 
); 

demo using array walk

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