PHP에서 주어진 키의 값으로 연관 배열의 배열을 정렬하는 방법은 무엇입니까?
이 배열이 주어지면 :
$inventory = array(
array("type"=>"fruit", "price"=>3.50),
array("type"=>"milk", "price"=>2.90),
array("type"=>"pork", "price"=>5.43),
);
$inventory
가격을 기준으로의 요소 를 정렬하고 싶습니다 .
$inventory = array(
array("type"=>"pork", "price"=>5.43),
array("type"=>"fruit", "price"=>3.50),
array("type"=>"milk", "price"=>2.90),
);
어떻게해야합니까?
당신이 옳습니다, 당신이 찾고있는 기능은 array_multisort()
입니다.
다음은 매뉴얼에서 직접 가져 와서 사례에 맞게 수정 한 예입니다.
$price = array();
foreach ($inventory as $key => $row)
{
$price[$key] = $row['price'];
}
array_multisort($price, SORT_DESC, $inventory);
PHP 5.5.0부터 foreach 대신 array_column ()을 사용할 수 있습니다
$price = array_column($inventory, 'price');
array_multisort($price, SORT_DESC, $inventory);
PHP 7 이상
PHP 7부터는 우주선 연산자 를 사용하여 요소를 비교 usort
하는 익명 함수 를 사용 하여 간결하게 수행 할 수 있습니다 .
다음과 같이 오름차순 정렬을 수행 할 수 있습니다.
usort($inventory, function ($item1, $item2) {
return $item1['price'] <=> $item2['price'];
});
또는 다음과 같이 내림차순으로 정렬하십시오.
usort($inventory, function ($item1, $item2) {
return $item2['price'] <=> $item1['price'];
});
이것이 어떻게 작동하는지 이해하려면 usort
(문서에서) 다음과 같이 동작 해야하는 사용자 제공 비교 기능이 필요합니다.
비교 함수는 첫 번째 인수가 각각 두 번째보다 작거나 같거나 큰 것으로 간주되는 경우 0보다 작거나 같거나 0보다 큰 정수를 반환해야합니다.
또한 참고 <=>
, 우주선 연산자
두 피연산자가 모두 같으면 0을, 왼쪽이 더 크면 1을, 오른쪽이 더 크면 -1을 반환합니다.
정확히 필요한 usort
것입니다. 실제로 https://wiki.php.net/rfc/combined-comparison-operator<=>
에서 언어에 추가 하기 위해 주어진 거의 모든 정당화 는
주문 콜백 작성을
usort()
보다 쉽게하기 위해 작성
PHP 5.3 이상
PHP 5.3에는 익명 함수가 도입되었지만 아직 우주선 연산자가 없습니다. 우리는 여전히 usort
배열을 정렬 하는 데 사용할 수 있지만 조금 더 장황하고 이해하기가 어렵습니다.
usort($inventory, function ($item1, $item2) {
if ($item1['price'] == $item2['price']) return 0;
return $item1['price'] < $item2['price'] ? -1 : 1;
});
참고 그냥 값의 차이를 반환하는 정수 값을 처리 비교기에 대한 매우 일반적인 비록 같은 것을 $item2['price'] - $item1['price']
, 우리가 할 수 안전하게 그렇게이 경우이다. 이것은 질문 asker의 예에서 가격이 부동 소수점 숫자이기 때문에 우리가 전달하는 비교 함수는 제대로 작동하려면 usort
정수를 반환 usort
해야합니다.
반환 비정 같은 플로트 같이, 비교 함수의 값을 콜백의 반환 값의 정수 내부 캐스팅 될 것이다. 따라서 0.99 및 0.1과 같은 값은 모두 0의 정수 값으로 캐스팅되어 해당 값을 동일한 값으로 비교합니다.
usort
PHP 5.x에서 사용할 때 명심해야 할 중요한 함정입니다 ! 이 답변의 원래 버전은이 실수를했지만 심각한 버그를 알리지 않고 수천 개의 견해에 대해 10 건의 공감대를 얻었습니다. 저 비교기 기능을 망칠 수있는 것처럼 용이성은 함께 lackwits 정확하게 쉽게 사용할 수있는 우주선 연산자 PHP 7 언어에 첨가하는 이유는.
다른 사람들이의 사용을 올바르게 제안했지만 array_multisort()
어떤 이유로 든 array_column()
솔루션 의 존재를 인정하는 답변이 없어 솔루션을 크게 단순화 할 수 있습니다. 그래서 내 제안은 다음과 같습니다.
array_multisort(array_column($inventory, 'price'), SORT_DESC, $inventory);
배열 요소는 문자열 키가있는 배열 자체이므로 사용자 지정 비교 함수를 정의하는 것이 가장 좋습니다. 매우 빠르고 쉽습니다. 이 시도:
function invenDescSort($item1,$item2)
{
if ($item1['price'] == $item2['price']) return 0;
return ($item1['price'] < $item2['price']) ? 1 : -1;
}
usort($inventory,'invenDescSort');
print_r($inventory);
다음을 생성합니다.
Array
(
[0] => Array
(
[type] => pork
[price] => 5.43
)
[1] => Array
(
[type] => fruit
[price] => 3.5
)
[2] => Array
(
[type] => milk
[price] => 2.9
)
)
나는 이것으로 끝났다.
function sort_array_of_array(&$array, $subfield)
{
$sortarray = array();
foreach ($array as $key => $row)
{
$sortarray[$key] = $row[$subfield];
}
array_multisort($sortarray, SORT_ASC, $array);
}
배열과 두 번째 수준 배열의 필드 이름을 전달하여 함수를 호출하십시오. 처럼:
sort_array_of_array($inventory, 'price');
usort
익명 기능과 함께 사용할 수 있습니다 . 예 :
usort($inventory, function ($a, $b) { return strnatcmp($a['price'], $b['price']); });
$inventory =
array(array("type"=>"fruit", "price"=>3.50),
array("type"=>"milk", "price"=>2.90),
array("type"=>"pork", "price"=>5.43),
);
function pricesort($a, $b) {
$a = $a['price'];
$b = $b['price'];
if ($a == $b)
return 0;
return ($a > $b) ? -1 : 1;
}
usort($inventory, "pricesort");
// uksort($inventory, "pricesort");
print("first: ".$inventory[0]['type']."\n\n");
// for usort(): prints milk (item with lowest price)
// for uksort(): prints fruit (item with key 0 in the original $inventory)
// foreach prints the same for usort and uksort.
foreach($inventory as $i){
print($i['type'].": ".$i['price']."\n");
}
출력 :
first: pork
pork: 5.43
fruit: 3.5
milk: 2.9
100 000 레코드에서 테스트되었습니다 : 초 단위의 시간 (funciton microtime으로 계산). 키 위치 정렬시 고유 한 값에만 해당됩니다.
@Josh Davis의 기능 솔루션 : 소요 시간 : 1.5768740177155
광산 솔루션 : 소요 시간 : 0.094044923782349
해결책:
function SortByKeyValue($data, $sortKey, $sort_flags=SORT_ASC)
{
if (empty($data) or empty($sortKey)) return $data;
$ordered = array();
foreach ($data as $key => $value)
$ordered[$value[$sortKey]] = $value;
ksort($ordered, $sort_flags);
return array_values($ordered); *// array_values() added for identical result with multisort*
}
From PHP에서 주어진 키의 값을 기준으로 연관 배열의 배열을 정렬하십시오 .
uasort ( http://php.net/uasort )를 사용하면 자신이 정의한 함수로 배열을 정렬 할 수 있습니다. 귀하의 경우에는 간단합니다.
$array = array(
array('price'=>'1000.50','product'=>'test1'),
array('price'=>'8800.50','product'=>'test2'),
array('price'=>'200.0','product'=>'test3')
);
function cmp($a, $b) {
return $a['price'] > $b['price'];
}
uasort($array, "cmp");
자체 비교 함수를 정의한 다음 usort 를 사용하려고 할 수 있습니다 .
이 기능은 재사용 가능합니다 :
function usortarr(&$array, $key, $callback = 'strnatcasecmp') {
uasort($array, function($a, $b) use($key, $callback) {
return call_user_func($callback, $a[$key], $b[$key]);
});
}
기본적으로 문자열 값에서 잘 작동하지만 모든 값이 숫자 인 경우 숫자 비교 함수에 콜백을 추가 해야합니다.
//Just in one line custom function
function cmp($a, $b)
{
return (float) $a['price'] < (float)$b['price'];
}
@uasort($inventory, "cmp");
print_r($inventory);
//result
Array
(
[2] => Array
(
[type] => pork
[price] => 5.43
)
[0] => Array
(
[type] => fruit
[price] => 3.5
)
[1] => Array
(
[type] => milk
[price] => 2.9
)
)
여기 오래 전에 발견하고 조금 정리 한 방법이 있습니다. 이것은 훌륭하게 작동하며 객체를 수락하도록 신속하게 변경할 수 있습니다.
/**
* A method for sorting arrays by a certain key:value.
* SortByKey is the key you wish to sort by
* Direction can be ASC or DESC.
*
* @param $array
* @param $sortByKey
* @param $sortDirection
* @return array
*/
private function sortArray($array, $sortByKey, $sortDirection) {
$sortArray = array();
$tempArray = array();
foreach ( $array as $key => $value ) {
$tempArray[] = strtolower( $value[ $sortByKey ] );
}
if($sortDirection=='ASC'){ asort($tempArray ); }
else{ arsort($tempArray ); }
foreach ( $tempArray as $key => $temp ){
$sortArray[] = $array[ $key ];
}
return $sortArray;
}
객체 정렬 방법을 변경하려면 다음 줄을 변경하면됩니다.
$tempArray[] = strtolower( $value[ $sortByKey ] );
에 $tempArray[] = strtolower( $value->$sortByKey );
방법을 간단하게 실행하려면
sortArray($inventory,'price','ASC');
$arr1 = array(
array('id'=>1,'name'=>'aA','cat'=>'cc'),
array('id'=>2,'name'=>'aa','cat'=>'dd'),
array('id'=>3,'name'=>'bb','cat'=>'cc'),
array('id'=>4,'name'=>'bb','cat'=>'dd')
);
$result1 = array_msort($arr1, array('name'=>SORT_DESC);
$result2 = array_msort($arr1, array('cat'=>SORT_ASC);
$result3 = array_msort($arr1, array('name'=>SORT_DESC, 'cat'=>SORT_ASC));
function array_msort($array, $cols)
{
$colarr = array();
foreach ($cols as $col => $order) {
$colarr[$col] = array();
foreach ($array as $k => $row) { $colarr[$col]['_'.$k] = strtolower($row[$col]); }
}
$eval = 'array_multisort(';
foreach ($cols as $col => $order) {
$eval .= '$colarr[\''.$col.'\'],'.$order.',';
}
$eval = substr($eval,0,-1).');';
eval($eval);
$ret = array();
foreach ($colarr as $col => $arr) {
foreach ($arr as $k => $v) {
$k = substr($k,1);
if (!isset($ret[$k])) $ret[$k] = $array[$k];
$ret[$k][$col] = $array[$k][$col];
}
}
return $ret;
}
완벽한 동적 함수 연관 배열 정렬을 위해 여기로 뛰어 들어 http://php.net/manual/en/function.sort.php에서 놀라운 기능을 발견했습니다 . 이 기능은 지정된 키를 사용하여 오름차순 및 내림차순으로 정렬되는 매우 동적입니다.
특정 키를 기준으로 배열을 정렬하는 간단한 기능입니다. 인덱스 연결 유지
<?php
function array_sort($array, $on, $order=SORT_ASC)
{
$new_array = array();
$sortable_array = array();
if (count($array) > 0) {
foreach ($array as $k => $v) {
if (is_array($v)) {
foreach ($v as $k2 => $v2) {
if ($k2 == $on) {
$sortable_array[$k] = $v2;
}
}
} else {
$sortable_array[$k] = $v;
}
}
switch ($order) {
case SORT_ASC:
asort($sortable_array);
break;
case SORT_DESC:
arsort($sortable_array);
break;
}
foreach ($sortable_array as $k => $v) {
$new_array[$k] = $array[$k];
}
}
return $new_array;
}
$people = array(
12345 => array(
'id' => 12345,
'first_name' => 'Joe',
'surname' => 'Bloggs',
'age' => 23,
'sex' => 'm'
),
12346 => array(
'id' => 12346,
'first_name' => 'Adam',
'surname' => 'Smith',
'age' => 18,
'sex' => 'm'
),
12347 => array(
'id' => 12347,
'first_name' => 'Amy',
'surname' => 'Jones',
'age' => 21,
'sex' => 'f'
)
);
print_r(array_sort($people, 'age', SORT_DESC)); // Sort by oldest first
print_r(array_sort($people, 'surname', SORT_ASC)); // Sort by surname
<?php
$inventory = array(
array("type"=>"fruit", "price"=>3.50),
array("type"=>"milk", "price"=>2.90),
array("type"=>"pork", "price"=>5.43),
);
function myfunc($a,$b){
return strnatcmp($a['price'],$b['price']);
}
$result=usort ($inventory,"myfunc");?>
<pre><?php print_r(array_reverse($inventory)); ?></pre>
간단한 해결책 :)
출력은
Array
(
[0] => Array
(
[type] => pork
[price] => 5.43
)
[1] => Array
(
[type] => fruit
[price] => 3.5
)
[2] => Array
(
[type] => milk
[price] => 2.9
)
)
이 시도:
asort($array_to_sort, SORT_NUMERIC);
참조를 위해 이것을 참조하십시오 : http://php.net/manual/en/function.asort.php
다양한 정렬 플래그를 여기에서 참조하십시오 : http://www.php.net/manual/en/function.sort.php
'Programming' 카테고리의 다른 글
SQL Server 쿼리-DISTINCT를 사용하여 COUNT (*) 선택 (0) | 2020.02.22 |
---|---|
PowerShell에서 함수에 여러 매개 변수를 전달하는 방법은 무엇입니까? (0) | 2020.02.22 |
PostgreSQL에서 제목이있는 테이블을 CSV로 내보내는 방법은 무엇입니까? (0) | 2020.02.22 |
필드에 문자열이 포함되어 있는지 확인 (0) | 2020.02.22 |
순차적으로 Gulp 작업을 순차적으로 실행하는 방법 (0) | 2020.02.22 |