У меня есть следующая структура массива:
Array ( [0] => Array ( [configuration_id] => 10 [id] => 1 [optionNumber] => 3 [optionActive] => 1 [lastUpdated] => 2010-03-17 15:44:12 ) [1] => Array ( [configuration_id] => 9 [id] => 1 [optionNumber] => 2 [optionActive] => 1 [lastUpdated] => 2010-03-17 15:44:12 ) [2] => Array ( [configuration_id] => 8 [id] => 1 [optionNumber] => 1 [optionActive] => 1 [lastUpdated] => 2010-03-17 15:44:12 ) )
Каков наилучший способ упорядочения массива поэтапно, основываясь на optionNumber?
Таким образом, результаты выглядят так:
Array ( [0] => Array ( [configuration_id] => 8 [id] => 1 [optionNumber] => 1 [optionActive] => 1 [lastUpdated] => 2010-03-17 15:44:12 ) [1] => Array ( [configuration_id] => 9 [id] => 1 [optionNumber] => 2 [optionActive] => 1 [lastUpdated] => 2010-03-17 15:44:12 ) [2] => Array ( [configuration_id] => 10 [id] => 1 [optionNumber] => 3 [optionActive] => 1 [lastUpdated] => 2010-03-17 15:44:12 ) )
Используйте usort
.
function cmp_by_optionNumber($a, $b) { return $a["optionNumber"] - $b["optionNumber"]; } ... usort($array, "cmp_by_optionNumber");
В PHP ≥5.3 вместо этого вы должны использовать анонимную функцию :
usort($array, function ($a, $b) { return $a['optionNumber'] - $b['optionNumber']; });
Обратите внимание, что оба вышеуказанных кода предполагают, что $a['optionNumber']
является целым числом. Используйте @St. Решение Джона Джонсона, если они являются струнами.
В PHP ≥7.0 используйте оператор космического корабля <=>
вместо вычитания, чтобы предотвратить проблемы с переполнением / усечением.
usort($array, function ($a, $b) { return $a['optionNumber'] <=> $b['optionNumber']; });
Использовать usort
usort($array, 'sortByOption'); function sortByOption($a, $b) { return strcmp($a['optionNumber'], $b['optionNumber']); }
Я использовал оба решения KennyTM и AJ Quick и придумал функцию, которая может помочь в этой проблеме для многих случаев, например, для сортировки или сохранения ключей ASC или DESC или если у вас есть объекты в виде дочерних элементов массива .
Вот эта функция:
/** * @param array $array * @param string $value * @param bool $asc - ASC (true) or DESC (false) sorting * @param bool $preserveKeys * @return array * */ function sortBySubValue($array, $value, $asc = true, $preserveKeys = false) { if ($preserveKeys) { $c = array(); if (is_object(reset($array))) { foreach ($array as $k => $v) { $b[$k] = strtolower($v->$value); } } else { foreach ($array as $k => $v) { $b[$k] = strtolower($v[$value]); } } $asc ? asort($b) : arsort($b); foreach ($b as $k => $v) { $c[$k] = $array[$k]; } $array = $c; } else { if (is_object(reset($array))) { usort($array, function ($a, $b) use ($value, $asc) { return $a->{$value} == $b->{$value} ? 0 : ($a->{$value} - $b->{$value}) * ($asc ? 1 : -1); }); } else { usort($array, function ($a, $b) use ($value, $asc) { return $a[$value] == $b[$value] ? 0 : ($a[$value] - $b[$value]) * ($asc ? 1 : -1); }); } } return $array; }
Применение:
sortBySubValue($array, 'optionNumber', true, false);
редактировать
Первая часть может быть переписана с использованием uasort()
и функция будет короче:
/** * @param array $array * @param string $value * @param bool $asc - ASC (true) or DESC (false) sorting * @param bool $preserveKeys * @return array * */ function sortBySubValue($array, $value, $asc = true, $preserveKeys = false) { if (is_object(reset($array))) { $preserveKeys ? uasort($array, function ($a, $b) use ($value, $asc) { return $a->{$value} == $b->{$value} ? 0 : ($a->{$value} - $b->{$value}) * ($asc ? 1 : -1); }) : usort($array, function ($a, $b) use ($value, $asc) { return $a->{$value} == $b->{$value} ? 0 : ($a->{$value} - $b->{$value}) * ($asc ? 1 : -1); }); } else { $preserveKeys ? uasort($array, function ($a, $b) use ($value, $asc) { return $a[$value] == $b[$value] ? 0 : ($a[$value] - $b[$value]) * ($asc ? 1 : -1); }) : usort($array, function ($a, $b) use ($value, $asc) { return $a[$value] == $b[$value] ? 0 : ($a[$value] - $b[$value]) * ($asc ? 1 : -1); }); } return $array; }
Клавиши удаляются при использовании функции, аналогичной приведенной выше. Если ключи важны, следующая функция будет поддерживать его … но петли foreach довольно неэффективны.
function subval_sort($a,$subkey) { foreach($a as $k=>$v) { $b[$k] = strtolower($v[$subkey]); } asort($b); foreach($b as $key=>$val) { $c[$key] = $a[$key]; } return $c; } $array = subval_sort($array,'optionNumber');
Используйте arsort вместо asort, если хотите от максимума до минимума.
Кодовый кредит: http://www.firsttube.com/read/sorting-a-multi-dimensional-array-with-php/
PHP 5.3+
usort($array, function($a,$b){ return $a['optionNumber']-$b['optionNumber'];} );