복붙노트

어떻게 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. ==============================

    1.맞습니다. 찾고있는 함수는 array_multisort ()입니다.

    맞습니다. 찾고있는 함수는 array_multisort ()입니다.

    다음은 설명서에서 직접 취한 것으로 사례에 맞게 조정 된 예입니다.

    $price = array();
    foreach ($inventory as $key => $row)
    {
        $price[$key] = $row['price'];
    }
    array_multisort($price, SORT_DESC, $inventory);
    
  2. ==============================

    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. ==============================

    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. ==============================

    4.다른 사람들은 array_multisort ()의 사용을 올바르게 제안했지만, 어떤 이유로 array_column ()의 존재를 인정하지 않으므로 솔루션을 크게 단순화 할 수 있습니다. 그래서 제 제안은 다음과 같습니다 :

    다른 사람들은 array_multisort ()의 사용을 올바르게 제안했지만, 어떤 이유로 array_column ()의 존재를 인정하지 않으므로 솔루션을 크게 단순화 할 수 있습니다. 그래서 제 제안은 다음과 같습니다 :

    array_multisort(array_column($inventory, 'price'), SORT_DESC, $inventory);
    
  5. ==============================

    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. ==============================

    6.익명 함수와 함께 usort를 사용할 수 있습니다.

    익명 함수와 함께 usort를 사용할 수 있습니다.

    usort($inventory, function ($a, $b) { return strnatcmp($a['price'], $b['price']); });
    
  7. ==============================

    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. ==============================

    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. ==============================

    9.자신의 비교 함수를 정의한 다음 usort를 사용해보십시오.

    자신의 비교 함수를 정의한 다음 usort를 사용해보십시오.

  10. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    16.이 시도:

    이 시도:

    asort($array_to_sort, SORT_NUMERIC);
    

    참조 용 : http://php.net/manual/en/function.asort.php

    다양한 정렬 플래그를 참조하십시오. http://www.php.net/manual/en/function.sort.php

  17. 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