есть массив
[0] => Array
(
[title] => ITEM1
[id] => 1
[voites] => 0
)
[1] => Array
(
[title] => ITEM2
[id] => 2
[voites] => 0
)
[2] => Array
(
[title] => ITEM3
[id] => 3
[voites] => 4 // высший рейтинг
)
[3] => Array
(
[title] => ITEM4
[id] => 4
[voites] => 0
)
нужно отсортировать по полю voites... и нужно, чтобы не нарушался порядок..
например, обычная отсортировка выводит сначала элемент с наибольшим значение в voites(что и логично), но остальные, у которых это поле равно 0, выводит с конца... сортирую через usort()... не получается написать к нему cmp функцию
public function srtCMP($a, $b){
return $b["voites"] - $a["voites"];
}
повторюсь: нужно, чтобы не нарушался порядок... элементы у которых высший рейтинг должны подниматься вверх, а остальные оставить как есть
вот так:
[0] => Array
(
[title] => ITEM3
[id] => 3
[voites] => 4 // высший рейтинг
)
[1] => Array
(
[title] => ITEM1
[id] => 1
[voites] => 0
)
[2] => Array
(
[title] => ITEM2
[id] => 2
[voites] => 0
)
[3] => Array
(
[title] => ITEM4
[id] => 4
[voites] => 0
)
Ответ
По сути, имеется две сортировки: по убыванию voites и (при их равенстве) - по возрастанию ключа элемента.
Для применения функции usort() надо временно запомнить этот ключ внутри элемента.
Например, так:
$common = Array(
"0" => Array
(
"title" => ITEM1,
"id" => 1,
"voites" => 0
),
"1" => Array
(
"title" => ITEM2,
"id" => 2,
"voites" => 0
),
"2" => Array
(
"title" => ITEM3,
"id" => 3,
"voites" => 4 // высший рейтинг
),
"3" => Array
(
"title" => ITEM4,
"id" => 4,
"voites" => 0
)
);
function cmp($a, $b)
{
if ($a["voites"] == $b["voites"]) {
if (end($a) == end($b)) {
return 0;
}
return (end($a) < end($b)) ? -1 : 1;
}
return ($a > $b) ? -1 : 1;
}
function add_key(&$item, $key){
array_push($item,$key);
}
function delete_key(&$item, $key){
array_pop($item);
}
array_walk($common, 'add_key');
usort($common, 'cmp');
array_walk($common, 'delete_key');
var_dump($common);
Результат:
array (size=4)
0 =>
array (size=3)
'title' => string 'ITEM3' (length=5)
'id' => int 3
'voites' => int 4
1 =>
array (size=3)
'title' => string 'ITEM1' (length=5)
'id' => int 1
'voites' => int 0
2 =>
array (size=3)
'title' => string 'ITEM2' (length=5)
'id' => int 2
'voites' => int 0
3 =>
array (size=3)
'title' => string 'ITEM4' (length=5)
'id' => int 4
'voites' => int 0
Комментариев нет:
Отправить комментарий