어떻게 PHP에서 주어진 키의 값으로 연관 배열의 배열을 정렬?
PHP어떻게 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),
);
어떻게해야합니까?
해결법
-
==============================
1.맞습니다. 찾고있는 함수는 array_multisort ()입니다.
맞습니다. 찾고있는 함수는 array_multisort ()입니다.
다음은 설명서에서 직접 취한 것으로 사례에 맞게 조정 된 예입니다.
$price = array(); foreach ($inventory as $key => $row) { $price[$key] = $row['price']; } array_multisort($price, SORT_DESC, $inventory);
-
==============================
2.PHP 7부터는 usort를 사용하여 우주선 연산자를 사용하여 요소를 비교하는 익명의 함수를 사용하여 간결하게 수행 할 수 있습니다.
PHP 7부터는 usort를 사용하여 우주선 연산자를 사용하여 요소를 비교하는 익명의 함수를 사용하여 간결하게 수행 할 수 있습니다.
다음과 같이 오름차순으로 정렬 할 수 있습니다.
usort($inventory, function ($item1, $item2) { return $item1['price'] <=> $item2['price']; });
또는 다음과 같은 내림차순 정렬 :
usort($inventory, function ($item1, $item2) { return $item2['price'] <=> $item1['price']; });
이것이 어떻게 작동 하는지를 이해하기 위해서, usort는 (docs에서) 다음과 같이 행동해야만하는 사용자 제공 비교 함수를 취합니다.
또한 우주선 운영자 인 <=>,
이는 정확하게 usort가 필요로하는 것입니다. 사실, https://wiki.php.net/rfc/combined-comparison-operator에서 언어에 <=>를 추가 할 때 부여되는 거의 모든 정당성은
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']처럼 정수 값을 다루는 비교기가 단지 값의 차이를 반환하는 것은 상당히 일반적인 일이지만,이 경우 안전하게 수행 할 수는 없습니다. 이것은 물음표의 예제에서 물가가 부동 소수이기 때문에 우리가 usort에 전달하는 비교 함수는 usort가 제대로 작동하도록 정수를 반환해야합니다.
이것은 PHP 5.x에서 usort를 사용할 때 염두에 두어야 할 중요한 함정입니다! 이 답변의 원래 버전은이 실수를 범했지만 심각한 버그를 알지 못하는 사람들이 수천 건의 조회수를 넘는 10 건의 증언을 분명히 보냈습니다. 필자와 같은 부족한 점이 PHP 7에서 언어에 추가 된 이유는 정확히 비교기 기능을 망칠 수 있기 때문입니다.
-
==============================
3.배열 요소는 문자열 키가있는 배열 자체이므로 가장 좋은 방법은 사용자 지정 비교 함수를 정의하는 것입니다. 꽤 빠르고 쉽게 할 수 있습니다. 이 시도:
배열 요소는 문자열 키가있는 배열 자체이므로 가장 좋은 방법은 사용자 지정 비교 함수를 정의하는 것입니다. 꽤 빠르고 쉽게 할 수 있습니다. 이 시도:
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 ) )
-
==============================
4.다른 사람들은 array_multisort ()의 사용을 올바르게 제안했지만, 어떤 이유로 array_column ()의 존재를 인정하지 않으므로 솔루션을 크게 단순화 할 수 있습니다. 그래서 제 제안은 다음과 같습니다 :
다른 사람들은 array_multisort ()의 사용을 올바르게 제안했지만, 어떤 이유로 array_column ()의 존재를 인정하지 않으므로 솔루션을 크게 단순화 할 수 있습니다. 그래서 제 제안은 다음과 같습니다 :
array_multisort(array_column($inventory, 'price'), SORT_DESC, $inventory);
-
==============================
5.나는 이것에 끝났다 :
나는 이것에 끝났다 :
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');
-
==============================
6.익명 함수와 함께 usort를 사용할 수 있습니다.
익명 함수와 함께 usort를 사용할 수 있습니다.
usort($inventory, function ($a, $b) { return strnatcmp($a['price'], $b['price']); });
-
==============================
7.
$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
-
==============================
8.100 000 개의 레코드에서 테스트되었습니다. 초 단위의 시간 (마이크로 시간 단위로 계산). 키 위치 정렬에 대한 고유 한 값에만 해당됩니다.
100 000 개의 레코드에서 테스트되었습니다. 초 단위의 시간 (마이크로 시간 단위로 계산). 키 위치 정렬에 대한 고유 한 값에만 해당됩니다.
@ 조쉬 데이비스의 기능의 해결책 : 소요 시간 : 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* }
-
==============================
9.자신의 비교 함수를 정의한 다음 usort를 사용해보십시오.
자신의 비교 함수를 정의한 다음 usort를 사용해보십시오.
-
==============================
10.이 함수는 재사용 가능합니다 :
이 함수는 재사용 가능합니다 :
function usortarr(&$array, $key, $callback = 'strnatcasecmp') { uasort($array, function($a, $b) use($key, $callback) { return call_user_func($callback, $a[$key], $b[$key]); }); }
기본적으로 문자열 값에서 잘 작동하지만 모든 값이 숫자 인 경우 숫자 비교 함수에 대한 콜백을 하위로 추가해야합니다.
-
==============================
11.PHP에서 제공된 키의 값으로 연관 배열의 배열을 정렬 :
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");
-
==============================
12.
//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 ) )
-
==============================
13.완벽한 동적 기능 나는 연관 배열 정렬을 위해 여기에 뛰어 들었고이 놀라운 기능을 http://php.net/manual/en/function.sort.php에서 발견했습니다. 이 함수는 지정된 키를 사용하여 오름차순 및 내림차순으로 정렬되는 매우 동적입니다.
완벽한 동적 기능 나는 연관 배열 정렬을 위해 여기에 뛰어 들었고이 놀라운 기능을 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
-
==============================
14.
$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; }
-
==============================
15.
<?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 ) )
-
==============================
16.이 시도:
이 시도:
asort($array_to_sort, SORT_NUMERIC);
참조 용 : http://php.net/manual/en/function.asort.php
다양한 정렬 플래그를 참조하십시오. http://www.php.net/manual/en/function.sort.php
from https://stackoverflow.com/questions/1597736/how-to-sort-an-array-of-associative-arrays-by-value-of-a-given-key-in-php by cc-by-sa and MIT license
'PHP' 카테고리의 다른 글
게시물 요청의 크기 제한은 얼마입니까? (0) | 2018.09.06 |
---|---|
간단한 PHP 페이지 매김 스크립트 [닫힌] (0) | 2018.09.06 |
v4 UUID를 생성하는 PHP 함수 (0) | 2018.09.06 |
htmlentities () 대 htmlspecialchars () (0) | 2018.09.06 |
PHP에서 startsWith () 및 endsWith () 함수 (0) | 2018.09.06 |