하위 배열 값별로 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
)
)
를 사용합니다.
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 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']);
}
나는 케니의 두 가지 해결책을 모두 사용했다.TM 및 AJ Quick은 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);
편집
첫 번째 부분은 를 사용하여 다시 쓸 수 있고, 기능은 더 짧아집니다(우주선 오퍼레이터로 인해 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;
}
array_multisort() 및 array_map() 사용
array_multisort(array_map(function($element) {
return $element['optionNumber'];
}, $array), SORT_ASC, $array);
print_r($array);
위와 같은 기능을 사용하면 키가 제거됩니다.키가 중요한 경우 다음 기능이 키를 유지합니다.하지만 포어치 루프는 매우 비효율적이야
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/
PHP 5.3+
usort($array, function($a,$b){ return $a['optionNumber']-$b['optionNumber'];} );
가장 현대적이고 간결한 두 가지 접근방식은 다음과 같습니다.
usort()화살표 기능 구문과 우주선(3방향 비교) 연산자. (데모)usort($array, fn($a, $b) => $a['optionNumber'] <=> $b['optionNumber'] );$a <=> $b오름차순 정렬을 제공합니다.$b <=> $a는 내림차순 정렬을 제공합니다.array_multisort()와 함께array_column()호출하여 비교할 값을 분리합니다.(데모)array_multisort( array_column($array, 'optionNumber'), $array );생략 시 오름차순 방향이 기본/암시 방향이 되므로 정렬 방향 플래그를 포함할 필요가 없습니다.
위의 두 방법 모두 타깃 어레이 열이 모든 행에 존재해야 합니다.그렇지 않으면 접근법이 실패, 중단, 오류가 발생합니다.
한 줄의 솔루션:array_multisort그리고.array_column.
//your array
$yourarray = 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"
)
);
//access optionNumber in the child arrays using array_column
array_multisort(array_column($yourarray, 'optionNumber'), SORT_ASC, $yourarray);
//print out preformatted
echo "<pre>"; print_r($images); echo "</pre>";
언급URL : https://stackoverflow.com/questions/2477496/php-sort-array-by-subarray-value
'programing' 카테고리의 다른 글
| ImportError: PIL이라는 이름의 모듈이 없습니다. (0) | 2022.11.26 |
|---|---|
| MariaDB 경고: 'root@localhost'에는 둘 다 있습니다.비밀번호는 무시됩니다. (0) | 2022.11.26 |
| Laravel Echo 접속, 절단, 재접속 등의 처리방법 (0) | 2022.11.26 |
| java.sql.SQLException: - ORA-01000: 열려 있는 최대 커서 수를 초과했습니다. (0) | 2022.11.26 |
| Java의 ArrayList에서 원하는 값 가져오기 (0) | 2022.11.26 |