programing

값을 기준으로 다차원 어레이를 정렬하는 방법

copysource 2022. 12. 10. 14:20
반응형

값을 기준으로 다차원 어레이를 정렬하는 방법

이 어레이를 "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
        )
)

이용하다.아직 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'];
});

마지막으로, PHP 7.4에서는 화살표 기능으로 비트를 정리할 수 있습니다.

usort($myArray, fn($a, $b) => $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()- 매뉴얼에서 배열 정렬 기능 비교를 참조하십시오.

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

다음 기능을 사용합니다.

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

편집 이 답변은 최소 10년 이상 된 것으로, 현재 더 나은 솔루션이 있을 가능성이 높지만, 몇 가지 코멘트를 통해 요청하신 대로 몇 가지 추가 정보를 추가합니다.

은 ★★★★★★★★★★★★★★★★★★★★★★★★★★★array_multisort()는 여러 어레이를 정렬할 수 있습니다.「 」:

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

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

번째 번째$sort_col는 2차원 배열로, 값은 정렬 기준이 되고 키는 입력 배열과 일치합니다. 이 에서는, 「키」를 선택합니다.$sort_col "order"을 사용하다

Array
(
    [0] => 3,
    [1] => 2
)

array_multisort() 배열 순서로 )을 합니다.1, 0.) 이면, 2차원 배열입니다. 입력 라서음음음음음음음음음음음음음음음음음 the the the the the 됩니다.$rest같은 결과를 .키가 일치하면 키도 같은 순서로 정렬되어 원하는 결과를 얻을 수 있습니다.

주의:

  • 제공된 배열이 수정되도록 참조에 의해 전달됩니다.
  • array_multisort()의 어레이가 , 할 수 있습니다.

를 위해서는 '복수 또는 다차원 배열 정렬' 방식을 사용할 수 있습니다.메서드 파라미터는

  • $keys - 정렬되는 배열
  • SORT_ASC - 정렬 순서(오름차순)
  • 정렬 플래그(일반적으로 항목(유형을 변경하지 않음) 또는 숫자 또는 문자열로 정렬)
  • $new - "신규"의 동등한
    어레이를 비교합니다.

'sort flags'는 기본적으로 SORT_REGUAL이며 생략됩니다.

$new = [
    [
        'hashtag' => 'a7e87329b5eab8578f4f1098a152d6f4',
        'title' => 'Flower',
        'order' => 3,
    ],
    [
        'hashtag' => 'b24ce0cd392a5b0b8dedc66c25213594',
        'title' => 'Free',
        'order' => 2,
    ],
    [
        'hashtag' => 'e7d31fc0602fb2ede144d18cdffd816b',
        'title' => 'Ready',
        'order' => 1,
    ],
];
$keys = array_column($new, 'order');
array_multisort($keys, SORT_ASC, $new);
var_dump($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
        )
)

저는 주로 유소르트를 사용하고, 저만의 비교 기능을 통과합니다.이 경우 매우 간단합니다.

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

우주선 연산자를 사용하는 PHP 7에서:

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

배열을 "title" 키 값으로 정렬하려면 다음을 사용합니다.

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

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

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

사용하다array_multisort(),array_map()

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

print_r($array);

데모

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

이렇게 하면 대문자와 소문자가 모두 처리됩니다.

가장 유연한 접근방식은 다음 방법을 사용하는 것입니다.

Arr::sortByKeys(array $array, $keys, bool $assoc = true): array

이유는 다음과 같습니다.

  • 임의의 키로 정렬할 수 있습니다(또한 다음과 같이 중첩됨).'key1.key2.key3'또는['k1', 'k2', 'k3'])

  • 어소시에이티브 어레이와 비어소시에이티브 어레이 모두에서 동작합니다).$assoc플래그)

  • 참조를 사용하지 않고 정렬된 새 배열이 반환됩니다.

고객님의 경우 다음과 같이 간단합니다.

$sortedArray = Arr::sortByKeys($array, 'order');

이 메서드는 이 라이브러리의 일부입니다.

PHP 7.4 이상에서 작동하는 "화살표 함수" 구문:

uasort($yourArray, fn($a, $b) => $a['order'] <=> $b['order']);

예쁜 활자

echo '<pre>';
print_r($yourArray);

승인된 답변에 따라 다음을 사용할 수 있습니다.

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

둘 이상의 열을 기준으로 정렬해야 하는 경우 다음을 수행합니다.

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

이 값은 데이터의 열 수에 관계없이 확장할 수 있습니다.이는 PHP에서 어레이를 직접 비교할 수 있다는 사실에 의존합니다.위의 예에서는 먼저 어레이를 정렬합니다.column1그리고 나서column2단, 다음과 같은 임의의 순서로 열을 정렬할 수 있습니다.

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

한 열을 오름차순으로 정렬하고 다른 열을 내림차순으로 정렬해야 하는 경우 내림차순 열을 연산자의 다른 쪽과 바꿉니다.<=>:

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

키에 따라 정렬해야 하는 경우 다음을 사용하는 것이 가장 좋습니다.

usort($array, build_sorter('order'));

function build_sorter($key) {
   return function ($a, $b) use ($key) {
      return strnatcmp($a[$key], $b[$key]);
   };
}

이 솔루션은 다차원 정렬을 위한 기억하기 쉬운 표기법을 사용하는 usort()용입니다.PHP 7부터 사용할 수 있는 우주선 오퍼레이터 <=>를 사용하고 있습니다.

usort($in,function($a,$b){
  return $a['first']   <=> $b['first']  //first asc
      ?: $a['second']  <=> $b['second'] //second asc
      ?: $b['third']   <=> $a['third']  //third desc (a b swapped!)
      //etc
  ;
});

예:

$in = [
  ['firstname' => 'Anton', 'surname' => 'Gruber', 'birthdate' => '03.08.1967', 'rank' => 3],
  ['firstname' => 'Anna', 'surname' => 'Egger', 'birthdate' => '04.01.1960', 'rank' => 1],
  ['firstname' => 'Paul', 'surname' => 'Mueller', 'birthdate' => '15.10.1971', 'rank' => 2],
  ['firstname' => 'Marie', 'surname' => 'Schmidt ', 'birthdate' => '24.12.1963', 'rank' => 2],
  ['firstname' => 'Emma', 'surname' => 'Mueller', 'birthdate' => '23.11.1969', 'rank' => 2],
];

첫 번째 작업:순위별, 성별 순서

usort($in,function($a,$b){
  return $a['rank']      <=> $b['rank']     //first asc
      ?: $a['surname']   <=> $b['surname']  //second asc
  ;
});

두 번째 작업:순위별 순서: 등급별, 성별, 이름별 순서

usort($in,function($a,$b){
  return $b['rank']      <=> $a['rank']       //first desc
      ?: $a['surname']   <=> $b['surname']    //second asc
      ?: $a['firstname'] <=> $b['firstname']  //third asc
  ;
});

세 번째 작업:순위별 순서 설명, 생년월일 확인

이 표기법에서는 날짜를 정렬할 수 없습니다.strtotime으로 변환됩니다.

usort($in,function($a,$b){
  return $b['rank']      <=> $a['rank']       //first desc
      ?: strtotime($a['birthdate']) <=> strtotime($b['birthdate'])    //second asc
  ;
});

사용할 수 있습니다.usort및 콜백 함수가 있는 사용자 정의 정렬 함수:

usort($new, fn($a, $b) => $a['order'] - $b['order']);

TRICK: 사용 가능a > b또는a - b또는a <=> b오름차순으로 정렬합니다.내림차순의 경우 교환 위치만a그리고.b.

이것이 도움이 되었습니다.

    $columns = array_column($data, "order");
    array_multisort($columns, SORT_ASC, $data);

이름 오름차순 정렬

현실을 직시합시다.PHP에는 모든 어레이 정렬 시나리오를 적절히 처리하는 간단한 기본 제공 기능이 없습니다.

이 루틴은 직관적이기 때문에 디버깅과 유지보수가 빨라집니다.

// Automatic population of the 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);
    }
}

언급URL : https://stackoverflow.com/questions/2699086/how-to-sort-a-multi-dimensional-array-by-value

반응형