PHP usort 사용자 정의 정렬을 사용해보기

Every Qiita #10
한가로이 독학 초학자의 매일 투고 챌린지 10 일째
이번에는...
전회 기사에서 교시 받은 소트에 관한 비망록입니다.
@tadsan 감사합니다!

마지막 다중 연상 배열 구조


$arrs = [
    ["fruit" => "apple" ,"num" => 1 ],
    ["fruit" => "banana" ,"num" => 3 ],
    ["fruit" => "melon" ,"num" => 5 ],
    ["fruit" => "orange" ,"num" => 4 ],
    ["fruit" => "peach" ,"num" => 2 ],
];

여기를 num을 기준으로 오름차순으로 정렬하는 것이 목표입니다.

마지막 구현의 흐름


  • asort를 사용하여 오름차순 정렬
  • asort를 다중 배열로 사용하는 경우 배열의 첫 번째 값이 비교 대상이됩니다.
  • fruit이 대상이므로 로마자 오름차순이 되어 버린다

  • num을 배열의 시작 부분에 배치
  • 다시 asort로 정렬

  • 아래 소스 코드
    //numとfruitの入れ替え
    $replace_arrs=[];
    foreach ($arrs as $key => $value) {
        $replace_arrs[] = array_reverse($arrs[$key]);
    }
    //numを基準に昇順ソート
    asort($replace_arrs);
    
    foreach ($replace_arrs as $value) {
        echo $value["num"].$value["fruit"]."<br>";
    }
    

    위에서도 num으로 오름차순 정렬할 수 있습니다만, 배열 구조가 바뀌고 있으므로 최적해가 아니었습니다・・・

    가르쳐 준 구현의 흐름


  • usort를 사용하여 사용자 정의로 정렬
  • 두 번째 인수로 num을 지정하고 오름차순 정렬

  • 아래 소스 코드
    usort($arrs, fn($a, $b) => $a['num'] <=> $b['num']);
    

    이것만으로 구조를 바꾸지 않고 스마트하게 정렬할 수 있는 것 같습니다. 대단한...

    해독


  • usort : 첫 번째 인수는 배열이고 두 번째 인수는 비교 함수로 전달됩니다. (비교 함수의 반환 값은 -1,0,1 중 하나여야 합니다.)
    배열의 모든 패턴을 비교해, -1이면 수시로 바꾸는 것 같습니다. 조건은 임의로 결정할 수 있습니다.
  • fn($a, $b) => $a['num'] <=> $b['num'] : 화살표 함수를 사용하고 우주선 연산자에서 num 값을 비교 처리합니다.
    위는 아래 코드와 동일합니다.
  • // アロー関数で下記を簡略可
    // 引数にはusort第一引数の配列が自動で全通り入ります
    function fn($a, $b){
    // 宇宙船演算子で下記を簡略可
      if($a['num'] == $b['num']{
        return 0;
      }
      return ($a['num'] < $b['num']) ? 1 : -1;
    }
    

    php의 내장 함수는 항상 계속 진화하고 있음을 깨달았습니다 ...
    로직을 생각하는 것은 역시 즐겁고 안쪽이 깊습니다
    가르쳐 주신 여러분 감사합니다! !

    좋은 웹페이지 즐겨찾기