У меня есть массив вроде следующего:
массив ( [0] => Массив ( 'name' => "Пятница" 'weight' => 6 ) [1] => Массив ( '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, я также иногда использую example_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
subkey и 'asort' или 'sort' для переменной $sort