Ответ 1
Вы можете использовать usort
как:
function cmp($a, $b) {
return $a['weight'] - $b['weight'];
}
usort($arr,"cmp");
У меня есть массив вроде следующего:
Array ( [0] => Array ( 'name' => "Friday" 'weight' => 6 ) [1] => Array ( 'name' => "Monday" 'weight' => 2 ) )
Я хотел бы получить последние значения в этом массиве ( "вес" ) и использовать их для сортировки основных элементов массива. Итак, в этом массиве я хотел бы отсортировать его, чтобы элемент "Понедельник" появился перед элементом "Friday".
Вы можете использовать usort
как:
function cmp($a, $b) {
return $a['weight'] - $b['weight'];
}
usort($arr,"cmp");
попробуйте следующее: http://php.net/manual/en/function.usort.php
Может быть выполнено с помощью анонимной функции .
Также, если ваш вес является строкой , используйте один из других возвратов (см. прокомментированные строки):
<?php
$arr = array(
0 => array (
'name' => 'Friday',
'weight' => 6,
),
1 => array (
'name' => 'Monday',
'weight' => 2,
),
);
// sort by 'weight'
usort($arr, function($a, $b) { // anonymous function
// compare numbers only
return $a['weight'] - $b['weight'];
// compare numbers or strings
//return strcmp($a['weight'], $b['weight']);
// compare numbers or strings non-case-sensitive
//return strcmp(strtoupper($a['weight']), strtoupper($b['weight']));
});
var_export($arr);
/*
array (
0 => array (
'name' => 'Monday',
'weight' => 2,
),
1 => array (
'name' => 'Friday',
'weight' => 6,
),
)
*/
Согласитесь с usort, я также иногда использую array_multisort (http://ca2.php.net/manual/en/function.usort.php) пример 3, сортируя результаты базы данных. Вы можете сделать что-то вроде:
<?php
$days = array(
array('name' => 'Friday', 'weight' => 6),
array('name' => 'Monday', 'weight' => 2),
);
$weight = array();
foreach($days as $k => $d) {
$weight[$k] = $d['weight'];
}
print_r($days);
array_multisort($weight, SORT_ASC, $days);
print_r($days);
?>
Вывод:
Array
(
[0] => Array
(
[name] => Friday
[weight] => 6
)
[1] => Array
(
[name] => Monday
[weight] => 2
)
)
Array
(
[0] => Array
(
[name] => Monday
[weight] => 2
)
[1] => Array
(
[name] => Friday
[weight] => 6
)
)
Вы также можете использовать анонимную функцию.
usort($items, function($a, $b) {
return $a['name'] > $b['name'];
});
Если поданная вами сортировка является строкой типа title
name
,
array_multisort + Флаги для Естественная сортировка и CaseInSensitivity:
$sort_by_title = array();
foreach($items as $item) {
$sort_by_title [] = $item['title'];
}
array_multisort($sort_by_title , SORT_ASC, SORT_NATURAL | SORT_FLAG_CASE, $items );
ПРИМЕЧАНИЕ. Если элемент, который вы сортируете, является поплавком типа .0534 и .0353 (например, для процента), тогда вам нужно умножить на 1000. Не уверен, почему, откровенно говоря... кажется, что usort кажется сравните целочисленные значения.
взял меня немного, чтобы понять, что один из них...
и 2 подсказки, которые могут быть не сразу очевидны:
Здесь классная функция, которая может помочь:
function subval_sort($a,$subkey,$sort) {
foreach($a as $k=>$v) {
$b[$k] = strtolower($v[$subkey]);
}
if($b)
{
$sort($b);
foreach($b as $key=>$val) {
$c[] = $a[$key];
}
return $c;
}
}
Отправить в массив как $a
ключ как $subkey
и 'asort' или 'sort' для переменной $sort