2015-11-06 17 views
1

У меня есть массив, как, например:Сортировка массива по значению определенного ключа

$currentTerm = array(
    'name' => $term->name, 
    'weight' => $term->weight 
); 

Я хотел бы отсортировать весь массив по ключу weight. Я не могу понять, как это сделать. Любые мысли или я должен написать для этого настраиваемую функцию?

P.S Некоторые весы могут быть одинаковыми; поэтому сохранение их в качестве ключа не является вариантом. И он многомерный с ключом детей, который заполняется рекурсивно так же, как и выше.

+1

Пожалуйста, пост многомерный массив. Вы должны опубликовать код, на котором должна выполняться работа. –

ответ

4

Вы можете создать собственный способ сортировки usort().

Она будет работать так же, как это:

usort($array, function($a,$b) { 
    if($a->weight === $b->weight) return 0; 
    return ($a->weight < $b->weight) ? -1 : 1; 
}); 

Если люди из будущего PHP7 приходят сюда, они могут просто использовать это (космические корабли!):

usort($array, function($a,$b) { 
    return $a->weight <=> $b->weight; 
}); 

Полный (и громоздким) пример для предварительной PHP7 будет:

<?php 
class Obj { 
    public $name; 
    public $weight; 

    function __construct($name,$weight) { 
     $this->name = $name; 
     $this->weight = $weight; 
    } 
} 
$array = array(
    new Obj("A",3), 
    new Obj("B",10), 
    new Obj("C",8), 
); 

usort($array, function($a,$b) { 
    if($a->weight == $b->weight) return 0; 
    return ($a->weight < $b->weight) ? -1 : 1; 
}); 

print_r($array); 

?> 
+0

Я полагаю, что функция также должна возвращать 0, если веса одинаковы. –

+0

Хотя в этом случае это, вероятно, не имело бы никакого значения, это могло бы быть и в других. Я изменил его, @SalmanA, спасибо! – Andrius

+0

С некоторой настройкой с многомерностью Он отлично справился с этим Usort. Я не добавлял возвращаемое значение 0, потому что тот же вес не означает, что он должен быть первым весом. Дважды вес 5 после веса 4 не означает, что 5 должны быть впереди. – CaptainCarl

1

Посмотрите на array_multisort()

$weight = array(); 
foreach ($currentTerm as $key => $row) 
{ 
    $weight[$key] = $row['weight']; 
} 

затем

array_multisort($weight, SORT_ASC, $currentTerm); 

или

array_multisort($weight, SORT_DESC, $currentTerm); 
0

Вы можете попробовать этот код:

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

usort($array, "cmp"); 
Смежные вопросы