programing

열 값을 기준으로 연관 배열 정렬

testmans 2023. 5. 20. 10:30
반응형

열 값을 기준으로 연관 배열 정렬

이 배열이 지정된 경우:

$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는 의 를 반 야 합 니 다 해 환 해야 합니다.usort올바르게 작동하는 방법:

비교 함수(예: float)에서 정수가 아닌 값을 반환하면 콜백 반환 값의 정수로 내부 캐스트가 발생합니다.따라서 0.99 및 0.1과 같은 값은 모두 0의 정수 값으로 캐스팅되며, 이 값은 동일한 값과 비교됩니다.

은 이은사용때명할중함다정니입요한야심해것할▁to다를 사용할 때 해야 할 한 함정입니다.usortPHP 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']); });

정렬에서 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");

사용합니다uasort▁this.

<?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);

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)
)

100,000개 레코드에서 테스트됨:시간(초)(funciton 마이크로타임으로 계산).키 위치를 정렬할 때 고유한 값에만 해당됩니다.

@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]);
    });
}

기본적으로 문자열 값에서 잘 작동하지만 모든 값이 숫자인 경우 숫자 비교 함수에 대한 콜백을 서브해야 합니다.

여기 오래전에 찾아서 조금 정리한 방법이 있습니다.이 기능은 매우 유용하며 개체를 수용하도록 빠르게 변경할 수도 있습니다.

/**
 * 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');

자체 비교 함수를 정의한 다음 usort를 사용할 수 있습니다.

//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
    )

)

전체 동적 함수 연관 배열 정렬을 위해 여기로 점프하여 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;
    }

많은 사람들이 라라벨과 함께 이것을 할 수 있는 방법을 찾고 있고 결국 여기까지 오게 됩니다.또한 일부 라라벨 질문은 이 질문에 중복되어 마감되고 있습니다.따라서 Laravel collect() 방법으로 쉽게 수행할 수 있는 방법을 공유했습니다.

$inventory = collect($inventory)->sortBy('price')->toArray();

내림차순의 경우

$inventory = collect($inventory)->sortBy('price')->reverse()->toArray();

아니면.

$inventory = collect($inventory)->('price')->reverse()->toArray();
$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

http://www.php.net/manual/en/function.sort.php 에서 다양한 정렬 플래그를 확인할 수 있습니다.

언급URL : https://stackoverflow.com/questions/1597736/sort-an-array-of-associative-arrays-by-column-value

반응형