복붙노트

값으로 다차원 배열 정렬

PHP

값으로 다차원 배열 정렬

이 배열을 "order"키의 값으로 어떻게 정렬 할 수 있습니까? 값은 현재 순차적이지만 항상 같지는 않습니다.

Array
(
    [0] => Array
        (
            [hashtag] => a7e87329b5eab8578f4f1098a152d6f4
            [title] => Flower
            [order] => 3
        )

    [1] => Array
        (
            [hashtag] => b24ce0cd392a5b0b8dedc66c25213594
            [title] => Free
            [order] => 2
        )

    [2] => Array
        (
            [hashtag] => e7d31fc0602fb2ede144d18cdffd816b
            [title] => Ready
            [order] => 1
        )
)

해결법

  1. ==============================

    1.

    usort를 사용해보십시오. PHP 5.2 또는 이전 버전을 사용하는 경우 먼저 정렬 함수를 정의해야합니다.

    function sortByOrder($a, $b) {
        return $a['order'] - $b['order'];
    }
    
    usort($myArray, 'sortByOrder');
    

    PHP 5.3부터 익명 함수를 사용할 수 있습니다 :

    usort($myArray, function($a, $b) {
        return $a['order'] - $b['order'];
    });
    

    마지막으로 PHP 7에서는 "우주선 연산자"를 사용할 수 있습니다 :

    usort($myArray, function($a, $b) {
        return $a['order'] <=> $b['order'];
    });
    

    이것을 다차원 정렬로 확장하려면, 첫 번째가 0 인 경우 두 번째 / 세 번째 정렬 요소를 참조하십시오. 아래에서 가장 잘 설명합니다. 하위 요소를 정렬 할 때도 사용할 수 있습니다.

    usort($myArray, function($a, $b) {
        $retval = $a['order'] <=> $b['order'];
        if ($retval == 0) {
            $retval = $a['suborder'] <=> $b['suborder'];
            if ($retval == 0) {
                $retval = $a['details']['subsuborder'] <=> $b['details']['subsuborder'];
            }
        }
        return $retval;
    });
    

    키 연관을 유지해야하는 경우 uasort ()를 사용하십시오. 매뉴얼의 배열 정렬 함수 비교를 참조하십시오.

  2. ==============================

    2.

    function aasort (&$array, $key) {
        $sorter=array();
        $ret=array();
        reset($array);
        foreach ($array as $ii => $va) {
            $sorter[$ii]=$va[$key];
        }
        asort($sorter);
        foreach ($sorter as $ii => $va) {
            $ret[$ii]=$array[$ii];
        }
        $array=$ret;
    }
    
    aasort($your_array,"order");
    
  3. ==============================

    3.

    나는이 함수를 사용한다 :

    function array_sort_by_column(&$arr, $col, $dir = SORT_ASC) {
        $sort_col = array();
        foreach ($arr as $key=> $row) {
            $sort_col[$key] = $row[$col];
        }
    
        array_multisort($sort_col, $dir, $arr);
    }
    
    
    array_sort_by_column($array, 'order');
    
  4. ==============================

    4.

    나는 보통 usort를 사용하고, 나 자신의 비교 함수를 전달한다. 이 경우 매우 간단합니다.

    function compareOrder($a, $b)
    {
      return $a['order'] - $b['order'];
    }
    usort($array, 'compareOrder');
    
  5. ==============================

    5.

    $sort = array();
    $array_lowercase = array_map('strtolower', $array_to_be_sorted);
    array_multisort($array_lowercase, SORT_ASC, SORT_STRING, $alphabetically_ordered_array);
    

    이것은 대문자와 소문자 모두를 처리합니다.

  6. ==============================

    6.

    "title"키의 값으로 배열을 정렬하려면 다음을 사용하십시오.

    uasort($myArray, function($a, $b) {
        return strcmp($a['title'], $b['title']);
    });
    

    strcmp는 문자열을 비교합니다.

    uasort ()는 배열 키가 정의 된대로 유지합니다.

  7. ==============================

    7.

    하자 보자 : PHP는 모든 배열 정렬 시나리오를 제대로 처리 할 수있는 간단한 상자 기능을 가지고 있지 않습니다.

    이 루틴은 직관적이며 빠른 디버깅과 유지 보수를 의미합니다.

    // automatic population of array
    $tempArray = array();
    $annotations = array();
    // ... some code
    // SQL $sql retrieves result array $result 
    // $row[0] is the ID, but is populated out of order (comes from 
    // multiple selects populating various dimensions for the same DATE 
    // for example
    while($row = mysql_fetch_array($result)) {
        $needle = $row[0];
        arrayIndexes($needle);  // create a parallel array with IDs only
        $annotations[$needle]['someDimension'] = $row[1]; // whatever
    }
    asort($tempArray);
    foreach ($tempArray as $arrayKey) {
        $dataInOrder = $annotations[$arrayKey]['someDimension']; 
        // .... more code
    }
    
    function arrayIndexes ($needle) {
        global $tempArray;
        if (!in_array($needle,$tempArray)) {
            array_push($tempArray,$needle);
        }
    }
    
  8. ==============================

    8.

    이를 달성하기위한 한 가지 접근 방법은 다음과 같습니다.

        $new = [
                  [
                    'hashtag' => 'a7e87329b5eab8578f4f1098a152d6f4',
                    'title' => 'Flower',
                    'order' => 3,
                  ],
    
                  [
                    'hashtag' => 'b24ce0cd392a5b0b8dedc66c25213594',
                    'title' => 'Free',
                    'order' => 2,
                  ],
    
                  [
                    'hashtag' => 'e7d31fc0602fb2ede144d18cdffd816b',
                    'title' => 'Ready',
                    'order' => 1,
                  ],
        ];
    
        $keys = array_column($new, 'order');
    
        $result = array_multisort($keys, SORT_ASC, $new);
    

    결과:

        Array
        (
            [0] => Array
                (
                    [hashtag] => e7d31fc0602fb2ede144d18cdffd816b
                    [title] => Ready
                    [order] => 1
                )
    
            [1] => Array
                (
                    [hashtag] => b24ce0cd392a5b0b8dedc66c25213594
                    [title] => Free
                    [order] => 2
                )
    
            [2] => Array
                (
                    [hashtag] => a7e87329b5eab8578f4f1098a152d6f4
                    [title] => Flower
                    [order] => 3
                )
    
        )
    
  9. from https://stackoverflow.com/questions/2699086/sort-multi-dimensional-array-by-value by cc-by-sa and MIT lisence