programing

하위 배열 값별로 PHP 배열 정렬

goodcopy 2022. 11. 26. 13:18
반응형

하위 배열 값별로 PHP 배열 정렬

어레이 구조는 다음과 같습니다.

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

를 사용합니다.

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 7.0 에서는, 오버플로/트랜케이션의 문제를 막기 위해서, 뺄셈 대신에 우주선 연산자를 사용합니다.

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

사용하다usort

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

는 케니의 두 가지 해결책을 모두 사용했다.TM AJ Quick은 ASC 또는 DESC 정렬사용하거나 키를 보존하거나 어레이의 하위 항목으로 개체를 사용하는 경우 등 많은 경우에 이 문제에 도움이 되는 기능을 고안했습니다.

이 기능은 다음과 같습니다(우주선 오퍼레이터로 인해 PHP7 이상에서 작동합니다).

/**
 * @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 = [];
        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);

편집

첫 번째 부분은 를 사용하여 다시 쓸 수 있고, 기능은 더 짧아집니다(우주선 오퍼레이터로 인해 PHP7 이상에서 사용할 수 있습니다.

/**
 * @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;
}

array_multisort() 및 array_map() 사용

array_multisort(array_map(function($element) {
      return $element['optionNumber'];
  }, $array), SORT_ASC, $array);

print_r($array);

데모

위와 같은 기능을 사용하면 키가 제거됩니다.키가 중요한 경우 다음 기능이 키를 유지합니다.하지만 포어치 루프는 매우 비효율적이야

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/

PHP 5.3+

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

가장 현대적이고 간결한 두 가지 접근방식은 다음과 같습니다.

  1. usort()화살표 기능 구문과 우주선(3방향 비교) 연산자. (데모)

    usort($array, fn($a, $b) =>
        $a['optionNumber'] <=> $b['optionNumber']
    );
    

    $a <=> $b오름차순 정렬을 제공합니다.$b <=> $a는 내림차순 정렬을 제공합니다.

  2. array_multisort()와 함께array_column()호출하여 비교할 값을 분리합니다.(데모)

    array_multisort(
        array_column($array, 'optionNumber'),
        $array
    );
    

    생략 시 오름차순 방향이 기본/암시 방향이 되므로 정렬 방향 플래그를 포함할 필요가 없습니다.


위의 두 방법 모두 타깃 어레이 열이 모든 행에 존재해야 합니다.그렇지 않으면 접근법이 실패, 중단, 오류가 발생합니다.

한 줄의 솔루션:array_multisort그리고.array_column.

//your array
$yourarray = 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"
                  )
);

//access optionNumber in the child arrays using array_column
array_multisort(array_column($yourarray, 'optionNumber'), SORT_ASC, $yourarray);

//print out preformatted
echo "<pre>"; print_r($images); echo "</pre>";

언급URL : https://stackoverflow.com/questions/2477496/php-sort-array-by-subarray-value

반응형