PHP는 배열을 SubArray 값으로 정렬합니다.
PHPPHP는 배열을 SubArray 값으로 정렬합니다.
배열의 다음 구조가 있습니다.
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
)
)
해결법
-
==============================
1.usort를 사용하십시오.
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']; });
-
==============================
2.usort 사용
usort 사용
usort($array, 'sortByOption'); function sortByOption($a, $b) { return strcmp($a['optionNumber'], $b['optionNumber']); }
-
==============================
3.KennyTM과 AJ Quick의 두 가지 솔루션을 모두 사용했으며 ASC 또는 DESC 정렬 또는 유지 키 사용과 같은 많은 경우 또는 배열의 자식으로 객체가있는 경우이 문제를 해결하는 데 도움이되는 함수를 만들었습니다.
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; }
-
==============================
4.위와 같은 기능을 사용할 때 키가 제거됩니다. 키가 중요하다면, 다음 함수는 그것을 유지할 것입니다 ...하지만 foreach 루프는 꽤 비효율적입니다.
위와 같은 기능을 사용할 때 키가 제거됩니다. 키가 중요하다면, 다음 함수는 그것을 유지할 것입니다 ...하지만 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');
높은 곳에서 낮은 곳으로 원하면 asort 대신 arsort를 사용하십시오.
코드 크레딧 : http://www.firsttube.com/read/sorting-a-multi-dimensional-array-with-php/
-
==============================
5.PHP 5.3 이상
PHP 5.3 이상
usort($array, function($a,$b){ return $a['optionNumber']-$b['optionNumber'];} );
from https://stackoverflow.com/questions/2477496/php-sort-array-by-subarray-value by cc-by-sa and MIT license
'PHP' 카테고리의 다른 글
제출시 체크 박스 값 가져 오기 (0) | 2018.09.18 |
---|---|
PHP 세션 제한 시간 (0) | 2018.09.18 |
HTML 콘텐츠에서 스크립트 태그 제거 (0) | 2018.09.18 |
문자열에서 줄 바꿈 (문자 없음!)을 제거하는 방법? (0) | 2018.09.18 |
날짜 문자열이 해당 형식의 유효한 날짜인지 정확하게 판단하십시오. (0) | 2018.09.18 |