다음과 같은 배열 구조가 있습니다.
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를 사용하십시오 . 문자열 인 경우 John Johnson의 솔루션 입니다.
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 빠른을 과 같은 많은 경우에이 문제에 도움을 줄 수있는 기능을 함께했다 ASC를 사용하거나 DESC가 정렬 또는 키를 보존 당신이있는 경우 또는 배열의 자녀 등의 개체를 .
다음은이 함수입니다 (우주선 연산자로 인해 PHP7 이상에서 작동).
/**
* @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 = [];
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()
함수는 더 짧아집니다 (우주선 연산자로 인해 PHP7 이상에서 작동).
/**
* @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를 사용하십시오.
코드 크레딧 : http://www.firsttube.com/read/sorting-a-multi-dimensional-array-with-php/
답변
array_multisort (), array_map () 사용
array_multisort(array_map(function($element) {
return $element['optionNumber'];
}, $array), SORT_ASC, $array);
print_r($array);
답변
PHP 5.3 이상
usort($array, function($a,$b){ return $a['optionNumber']-$b['optionNumber'];} );