하위 배열 값으로 PHP 정렬 배열
다음과 같은 배열 구조가 있습니다.
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']);
}
I used both solutions by KennyTM and AJ Quick and came up with a function that can help in this issue for many cases like using ASC or DESC sorting or preserving keys or if you have objects as children of array.
Here is this function (works for PHP7 and higher because of spaceship operator):
/**
* @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;
}
Usage:
sortBySubValue($array, 'optionNumber', true, false);
Edit
The first part can be rewritten using uasort()
and the function will be shorter (works for PHP7 and higher because of spaceship operator):
/**
* @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;
}
The keys are removed when using a function like the ones above. If the keys are important, the following function would maintain it... but foreach loops are pretty inefficient.
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');
Use arsort instead of asort if you want from high to low.
Code credit: 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'];} );
Using array_multisort(), array_map()
array_multisort(array_map(function($element) {
return $element['optionNumber'];
}, $array), SORT_ASC, $array);
print_r($array);
참고URL : https://stackoverflow.com/questions/2477496/php-sort-array-by-subarray-value
'Programing' 카테고리의 다른 글
.gitignore는 특정 디렉토리가 아닌 디렉토리의 파일을 제외합니다. (0) | 2020.08.24 |
---|---|
DataTable을 Excel로 내보내는 방법 (0) | 2020.08.24 |
페이지의 모든 AJAX 요청에 "후크"추가 (0) | 2020.08.24 |
프로그래밍 방식으로 식별 열이있는 SQL 테이블을 확인하는 방법 (0) | 2020.08.24 |
안드로이드 웹뷰 위치 정보 (0) | 2020.08.24 |