PHP сортировка многомерных массивов


У меня есть следующий массив. Мне нужно отсортировать этот массив по ключу вложенного массива [id]:

Array ( 
[0] => Array ( [id] => 5 [category_id] => 12 )
[1] => Array ( [id] => 3 [category_id] => 12 )
[2] => Array ( [id] => 9 [category_id] => 12 )
[3] => Array ( [id] => 4 [category_id] => 12 )
)
Author: kalpaitch, 2010-08-06

6 answers

Вы можете сделать это так

foreach($arr as $val) {
    $ret[$val['id']] = $val['category_id'];
}
ksort($ret);

Если вы хотите отсортировать один и тот же массив, вы можете добавить следующий код:

foreach($ret as $key=>$val) {
    $newArr[] = array('id'=>$key,'category_id'=>$val);
}
 2
Author: KoKo, 2010-08-06 14:05:39

Используйте usort с пользовательской функцией сравнения.

<?php

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

$array = Array ( 
  0 => Array ( 'id' => 5, 'category_id' => 12 ),
  1 => Array ( 'id' => 4, 'category_id' => 12 ),
  2 => Array ( 'id' => 7, 'category_id' => 12 ),
  3 => Array ( 'id' => 3, 'category_id' => 12 ),
);

usort($array, 'cmp');

// Output: 3 4 5 7 
foreach ($array as $element)
   echo $element['id'], " ";
 8
Author: meagar, 2010-08-06 14:07:37

Вы, вероятно, захотите использовать array_multisort Посмотрите на пример № 3 в документации.

 2
Author: speshak, 2010-08-06 14:00:00

Почему бы просто не хранить ваши данные таким образом?

Array ( 
    [5] => int(12)
    [3] => int(12)
    [9] => int(12)
    [4] => int(12)
)

Тогда вы можете просто использовать ksort() как обычно.

 1
Author: Dolph, 2010-08-06 13:58:27

Попробуйте array_multisort он отсортирует внешний массив по первому ключу/свойству внутренних массивов

 0
Author: Andreas Linden, 2010-08-06 13:58:12
function sort_by_field($field, & $data) {
    $sort_func = create_function('$a,$b', 'if ($a["' . $field . '"] == $b["' . $field . '"]) {return 0;} 
            return ($a["' . $field . '"] < $b["' . $field . '"]) ? -1 : 1;');

    uasort($data, $sort_func);
}
 0
Author: Codler, 2010-08-06 13:58:16