복붙노트

PHP는 배열을 SubArray 값으로 정렬합니다.

PHP

PHP는 배열을 SubArray 값으로 정렬합니다.

배열의 다음 구조가 있습니다.

Array
        (
            [0] => Array
                (
                    [configuration_id] => 10
                    [id] => 1
                    [optionNumber] => 3
                    [optionActive] => 1
                    [lastUpdated] => 2010-03-17 15:44:12
                )

            [1] => Array
                (
                    [configuration_id] => 9
                    [id] => 1
                    [optionNumber] => 2
                    [optionActive] => 1
                    [lastUpdated] => 2010-03-17 15:44:12
                )

            [2] => Array
                (
                    [configuration_id] => 8
                    [id] => 1
                    [optionNumber] => 1
                    [optionActive] => 1
                    [lastUpdated] => 2010-03-17 15:44:12
                )
    )

optionNumber를 기반으로 증분 방식으로 배열을 정렬하는 가장 좋은 방법은 무엇입니까?

결과는 다음과 같습니다.

Array
        (
            [0] => Array
                (
                    [configuration_id] => 8
                    [id] => 1
                    [optionNumber] => 1
                    [optionActive] => 1
                    [lastUpdated] => 2010-03-17 15:44:12
                )

            [1] => Array
                (
                    [configuration_id] => 9
                    [id] => 1
                    [optionNumber] => 2
                    [optionActive] => 1
                    [lastUpdated] => 2010-03-17 15:44:12
                )

            [2] => Array
                (
                    [configuration_id] => 10
                    [id] => 1
                    [optionNumber] => 3
                    [optionActive] => 1
                    [lastUpdated] => 2010-03-17 15:44:12
                )
    )

해결법

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

    1.usort를 사용하십시오.

    usort를 사용하십시오.

    function cmp_by_optionNumber($a, $b) {
      return $a["optionNumber"] - $b["optionNumber"];
    }
    
    ...
    
    usort($array, "cmp_by_optionNumber");
    

    PHP 5.3 이상에서는 다음과 같이 익명 함수를 사용해야합니다.

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

    위의 두 코드는 $ a [ 'optionNumber']가 정수라고 가정합니다. @St를 사용하십시오. John Johnson의 솔루션입니다.

    PHP ≥7.0에서는 뺄셈 대신 우주선 연산자 <=>를 사용하여 오버 플로우 / 잘림 문제를 방지하십시오.

    usort($array, function ($a, $b) {
        return $a['optionNumber'] <=> $b['optionNumber'];
    });
    
  2. ==============================

    2.usort 사용

    usort 사용

     usort($array, 'sortByOption');
     function sortByOption($a, $b) {
       return strcmp($a['optionNumber'], $b['optionNumber']);
     }
    
  3. ==============================

    3.KennyTM과 AJ Quick의 두 가지 솔루션을 모두 사용했으며 ASC 또는 DESC 정렬 또는 유지 키 사용과 같은 많은 경우 또는 배열의 자식으로 객체가있는 경우이 문제를 해결하는 데 도움이되는 함수를 만들었습니다.

    KennyTM과 AJ Quick의 두 가지 솔루션을 모두 사용했으며 ASC 또는 DESC 정렬 또는 유지 키 사용과 같은 많은 경우 또는 배열의 자식으로 객체가있는 경우이 문제를 해결하는 데 도움이되는 함수를 만들었습니다.

    다음은이 함수입니다.

    /**
     * @param array $array
     * @param string $value
     * @param bool $asc - ASC (true) or DESC (false) sorting
     * @param bool $preserveKeys
     * @return array
     * */
    function sortBySubValue($array, $value, $asc = true, $preserveKeys = false)
    {
        if ($preserveKeys) {
            $c = array();
            if (is_object(reset($array))) {
                foreach ($array as $k => $v) {
                    $b[$k] = strtolower($v->$value);
                }
            } else {
                foreach ($array as $k => $v) {
                    $b[$k] = strtolower($v[$value]);
                }
            }
            $asc ? asort($b) : arsort($b);
            foreach ($b as $k => $v) {
                $c[$k] = $array[$k];
            }
            $array = $c;
        } else {
            if (is_object(reset($array))) {
                usort($array, function ($a, $b) use ($value, $asc) {
                    return $a->{$value} == $b->{$value} ? 0 : ($a->{$value} - $b->{$value}) * ($asc ? 1 : -1);
                });
            } else {
                usort($array, function ($a, $b) use ($value, $asc) {
                    return $a[$value] == $b[$value] ? 0 : ($a[$value] - $b[$value]) * ($asc ? 1 : -1);
                });
            }
        }
    
        return $array;
    }
    

    용법:

    sortBySubValue($array, 'optionNumber', true, false);
    

    편집하다

    첫 번째 부분은 uasort ()를 사용하여 다시 작성할 수 있으며 함수는 더 짧아집니다.

    /**
     * @param array $array
     * @param string $value
     * @param bool $asc - ASC (true) or DESC (false) sorting
     * @param bool $preserveKeys
     * @return array
     * */
    function sortBySubValue($array, $value, $asc = true, $preserveKeys = false)
    {
        if (is_object(reset($array))) {
            $preserveKeys ? uasort($array, function ($a, $b) use ($value, $asc) {
                return $a->{$value} == $b->{$value} ? 0 : ($a->{$value} - $b->{$value}) * ($asc ? 1 : -1);
            }) : usort($array, function ($a, $b) use ($value, $asc) {
                return $a->{$value} == $b->{$value} ? 0 : ($a->{$value} - $b->{$value}) * ($asc ? 1 : -1);
            });
        } else {
            $preserveKeys ? uasort($array, function ($a, $b) use ($value, $asc) {
                return $a[$value] == $b[$value] ? 0 : ($a[$value] - $b[$value]) * ($asc ? 1 : -1);
            }) : usort($array, function ($a, $b) use ($value, $asc) {
                return $a[$value] == $b[$value] ? 0 : ($a[$value] - $b[$value]) * ($asc ? 1 : -1);
            });
        }
        return $array;
    }
    
  4. ==============================

    4.위와 같은 기능을 사용할 때 키가 제거됩니다. 키가 중요하다면, 다음 함수는 그것을 유지할 것입니다 ...하지만 foreach 루프는 꽤 비효율적입니다.

    위와 같은 기능을 사용할 때 키가 제거됩니다. 키가 중요하다면, 다음 함수는 그것을 유지할 것입니다 ...하지만 foreach 루프는 꽤 비효율적입니다.

    function subval_sort($a,$subkey) {
        foreach($a as $k=>$v) {
            $b[$k] = strtolower($v[$subkey]);
        }
        asort($b);
        foreach($b as $key=>$val) {
            $c[$key] = $a[$key];
        }
        return $c;
    }
    $array = subval_sort($array,'optionNumber');
    

    높은 곳에서 낮은 곳으로 원하면 asort 대신 arsort를 사용하십시오.

    코드 크레딧 : http://www.firsttube.com/read/sorting-a-multi-dimensional-array-with-php/

  5. ==============================

    5.PHP 5.3 이상

    PHP 5.3 이상

    usort($array, function($a,$b){ return $a['optionNumber']-$b['optionNumber'];} );
    
  6. from https://stackoverflow.com/questions/2477496/php-sort-array-by-subarray-value by cc-by-sa and MIT license