[php] 하위 배열 값으로 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
                )
    )



답변

사용 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'];
});


답변

사용하다 usort

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


답변

나는에 의해 두 솔루션 사용 KennyTMAJ 빠른을 과 같은 많은 경우에이 문제에 도움을 줄 수있는 기능을 함께했다 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);

편집하다

첫 번째 부분은 다음을 사용하여 다시 작성할 수 있으며 uasort()함수는 더 짧아집니다 (우주선 연산자로 인해 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;
}


답변

위와 같은 기능을 사용하면 키가 제거됩니다. 키가 중요한 경우 다음 함수가이를 유지하지만 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');

높음에서 낮음으로 원하는 경우 정렬 대신 arsort를 사용하십시오.

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


답변

array_multisort (), array_map () 사용

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

print_r($array);

데모


답변

PHP 5.3 이상

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


답변