Как отсортировать массив PHP по элементу, вложенному внутрь?
У меня есть массив, подобный следующему:
Array ( [0] => Array ( 'name' => "Friday" 'weight' => 6 ) [1] => Array ( 'name' => "Monday" 'weight' => 2 ) )
Я хотел бы захватить последние значения в этом массиве ("вес") и использовать их для сортировки основных элементов массива. Итак, в этом массиве я бы хотел отсортировать его так, чтобы элемент "Понедельник" появлялся перед элементом "Пятница".
8 answers
Вы можете использовать usort
как:
function cmp($a, $b) {
return $a['weight'] - $b['weight'];
}
usort($arr,"cmp");
Можно сделать с помощью анонимной функции .
Также, если ваш "вес" является строкой , используйте один из других возвратов (см. закомментированные строки):
<?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,
),
)
*/
Попробуйте это: http://php.net/manual/en/function.usort.php
Согласен с 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 + Флаги для Естественной сортировки и Чувствительности к регистру - это путь:
$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 подсказки, которые могут быть не сразу очевидны:
- если ваши массивы являются объектами, вы можете использовать return $a->вес- $b->вес, конечно
- если вы вернете $b->вес - $a->вес, это будет сортировка по желанию.
Вот классная функция, которая может помочь:
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
и "сортировку" или "сортировку" для переменной $sort