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),
);
이거 어떻게 해?
맞습니다. 찾으시는 기능은 입니다.
다음은 매뉴얼에서 직접 인용하여 고객의 상황에 맞게 수정한 예입니다.
$price = array();
foreach ($inventory as $key => $row)
{
$price[$key] = $row['price'];
}
array_multisort($price, SORT_DESC, $inventory);
.5부터는 PHP 5.5.0을 사용할 수 .부터는array_column()
다음 중 하나:
$price = array_column($inventory, 'price');
array_multisort($price, SORT_DESC, $inventory);
PHP 7+
PHP 7에서는 우주선 연산자를 사용하여 요소를 비교하는 어나니머스 기능으로 간결하게 사용할 수 있습니다.
다음과 같이 오름차순 정렬을 수행할 수 있습니다.
usort($inventory, function ($item1, $item2) {
return $item1['price'] <=> $item2['price'];
});
또는 다음과 같은 내림차순입니다.
usort($inventory, function ($item1, $item2) {
return $item2['price'] <=> $item1['price'];
});
구조를 하려면 , 「어느 쪽이 좋을까」, 「어느 쪽이 좋을까」, 「 쪽이 좋을까」usort
는 사용자 지정 비교 함수를 사용합니다.이 함수는 다음과 같이 동작해야 합니다(문서 참조).
첫 번째 인수가 두 번째 인수보다 각각 작거나 같거나 큰 것으로 간주될 경우 비교 함수는 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']
이 경우 안전하게 할 수 없습니다.이는 질문자의 예에서는 가격이 부동 소수점 숫자이지만 비교 함수는 전달되기 때문입니다.usort
has has has 에는 정수를 반환해야 합니다.usort
★★★★★★★★★★★★★★★★★★★★★★★:
float와 같은 비교 함수에서 정수 이외의 값을 반환하면 콜백 반환 값의 정수로 내부 캐스트됩니다.따라서 0.99 및 0.1과 같은 값은 모두 정수 값 0으로 캐스팅되며, 이 값은 동일한 값을 비교합니다.
.usort
PHP 5.x에서! 이 답변의 원래 버전이 이 오류를 범했지만, 아무도 심각한 버그를 눈치채지 못한 채 수천 건의 조회수를 10건이나 늘렸습니다.저와 같은 부족함이 비교기 기능을 망치기 쉽기 때문에 사용하기 쉬운 우주선 오퍼레이터가 PHP 7의 언어에 추가된 것입니다.
다른 사람들은 의 사용을 올바르게 제안하고 있지만, 어떤 이유로든 의 존재를 인정하는 답변은 없는 것 같습니다.이것에 의해, 솔루션이 큰폭으로 심플하게 됩니다.제 제안은 다음과 같습니다.
array_multisort(array_column($inventory, 'price'), SORT_DESC, $inventory);
문자열에 대소문자를 구분하지 않는 정렬을 원하는 경우SORT_NATURAL|SORT_FLAG_CASE
array_multisort(array_column($inventory, 'key_name'), SORT_DESC, SORT_NATURAL|SORT_FLAG_CASE, $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($inventory, function ($a, $b) { return strnatcmp($a['price'], $b['price']); });
From php에서 지정된 키의 값을 기준으로 연관 배열 정렬:
usort(http://php.net/usort) )를 사용하면 어레이를 오름차순과 내림차순으로 정렬할 수 있습니다.함수를 만들어 usort의 파라미터로 전달하면 됩니다.아래 예시와 같이 오름차순보다 많이 사용된 경우 조건보다 적게 통과하면 내림차순으로 정렬됩니다.예:
$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'];
}
usort($array, "cmp");
print_r($array);
출력:
Array
(
[0] => Array
(
[price] => 200.0
[product] => test3
)
[1] => Array
(
[price] => 1000.50
[product] => test1
)
[2] => Array
(
[price] => 8800.50
[product] => test2
)
)
$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
PHP 7 이상 버전용.
/**
* A method for sorting associative arrays by a key and a direction.
* Direction can be ASC or DESC.
*
* @param $array
* @param $key
* @param $direction
* @return mixed $array
*/
function sortAssociativeArrayByKey($array, $key, $direction){
switch ($direction){
case "ASC":
usort($array, function ($first, $second) use ($key) {
return $first[$key] <=> $second[$key];
});
break;
case "DESC":
usort($array, function ($first, $second) use ($key) {
return $second[$key] <=> $first[$key];
});
break;
default:
break;
}
return $array;
}
사용방법:
$inventory = sortAssociativeArrayByKey($inventory, "price", "ASC");
용 i i i i를 쓴다.uasort
<?php
$users = [
[
'username' => 'joe',
'age' => 11
],
[
'username' => 'rakoto',
'age' => 21
],
[
'username' => 'rabe',
'age' => 17
],
[
'username' => 'fy',
'age' => 19
],
];
uasort($users, function ($item, $compare) {
return $item['username'] >= $compare['username'];
});
var_dump($users);
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*
}
이것을 시험해 보세요.
$prices = array_column($inventory, 'price');
array_multisort($prices, SORT_DESC, $inventory);
print_r($inventory);
이 기능은 재사용할 수 있습니다.
function usortarr(&$array, $key, $callback = 'strnatcasecmp') {
uasort($array, function($a, $b) use($key, $callback) {
return call_user_func($callback, $a[$key], $b[$key]);
});
}
디폴트로는 문자열 값에서 정상적으로 동작하지만 모든 값이 숫자일 경우 번호 비교 함수를 위해 콜백을 서브해야 합니다.
PHP 7.4부터는 화살표 기능을 사용할 수 있습니다.
usort(
$inventory,
fn(array $a, array $b): int => $b['price'] <=> $a['price']
);
코드(데모):
$inventory = [
['type' => 'fruit', 'price' => 3.50],
['type' => 'milk', 'price' => 2.90],
['type' => 'pork', 'price' => 5.43],
];
usort(
$inventory,
fn(array $a, array $b): int => $b['price'] <=> $a['price']
);
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)
)
자체 비교 함수를 정의하고 usort를 사용할 수 있습니다.
여기 제가 오래전에 찾아서 조금 정리한 방법이 있습니다.이것은 매우 효과적이며 오브젝트를 받아들이도록 빠르게 변경할 수도 있습니다.
/**
* 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');
//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
)
)
많은 사람들이 라라벨과 함께 이 일을 할 방법을 찾고 있으며 결국 여기에 오게 된다.또한 일부 라라벨 질문은 이 질문의 중복으로 인해 종료되고 있습니다.그래서 Laravel collect() 메서드로 간단하게 실행할 수 있는 방법을 공유했습니다.
$inventory = collect($inventory)->sortBy('price')->toArray();
내림차순의 경우
$inventory = collect($inventory)->sortBy('price')->reverse()->toArray();
아니면...
$inventory = collect($inventory)->('price')->reverse()->toArray();
동적 기능 완료 연관지을 수 있는 어레이 정렬을 위해 여기를 클릭했는데 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
대소문자가 다른 문자열 배열을 정렬해야 할 경우 정렬 배열 값이 소문자로 변경됩니다.
$data = [
[
'name' => 'jack',
'eyeColor' => 'green'
],
[
'name' => 'Amy',
'eyeColor' => 'brown'
],
[
'name' => 'Cody',
'eyeColor' => 'blue'
]
];
function toLowerCase($a) { return strtolower($a); }
$sortArray = array_map("toLowerCase",array_column($data, 'name'));
array_multisort($sortArray, SORT_ASC, $data);
이 함수는 모든 주요 버전의 PHP에서 100% 작동하며 PHP5, PHP7, PHP8에서 테스트됩니다.
function sort_my_array($array, $order_by, $order)
{
switch ($order) {
case "asc":
usort($array, function ($first, $second) use ($order_by) {
if (version_compare(PHP_VERSION, '7.0.0') >= 0) {
return $first[$order_by] <=> $second[$order_by];
} else {
$array_cmp = strcmp($first[$order_by], $second[$order_by]);
return $array_cmp ;
}
});
break;
case "desc":
usort($certificates, function ($first, $second) use ($order_by) {
if (version_compare(PHP_VERSION, '7.0.0') >= 0) {
return $first[$order_by] <=> $second[$order_by];
} else {
$array_cmp = strcmp($first[$order_by], $second[$order_by]);
return -$array_cmp ;
}
});
break;
default:
break;
}
return $array;
}
$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;
}
이것을 시험해 보세요.
asort($array_to_sort, SORT_NUMERIC);
자세한 것은, http://php.net/manual/en/function.asort.php 를 참조해 주세요.
언급URL : https://stackoverflow.com/questions/1597736/how-to-sort-an-array-of-associative-arrays-by-value-of-a-given-key-in-php
'programing' 카테고리의 다른 글
가상 환경 내에서 pip 자체를 업데이트/업그레이드하려면 어떻게 해야 합니까? (0) | 2022.09.18 |
---|---|
MySQL > 테이블이 존재하지 않습니다.하지만 그렇다(혹은 그래야 한다) (0) | 2022.09.18 |
Python에서 대용량 파일을 읽기 위한 느린 방법? (0) | 2022.09.18 |
열을 변경하고 기본값을 변경하려면 어떻게 해야 합니까? (0) | 2022.09.18 |
복합 인덱스 및 영구 열을 사용한 MySQL 쿼리 최적화 (0) | 2022.09.18 |