개발! 딱 깔끔하고 센스있게!

PHP array multiisort 가 예상 한 다 차원 배열 에 정렬 하지 않 음 본문

개발 스크랩 메모/PHP

PHP array multiisort 가 예상 한 다 차원 배열 에 정렬 하지 않 음

렉사이 2020. 11. 29. 22:39

나 는 array multiisort 함 수 를 사용 하여 다 차원 배열 을 정렬 하려 고 시도 하고 있다.

나 는 다 차원 배열 이 $sort 에서 가 치 를 사용 하여 자신 을 정렬 하 기 를 바란다.

$sort 는 다 차원 배열 의 volume 요소 와 관련된다.

다음 순서 로 구성 되 기 를 원 합 니 다:

'name' = > 8, 'name' = > 6, 'name' = 7, 'name' = > 9, 'name' = 10, 'name' = > 10,

돌아 온 주문 이 예상 에 부합 되 지 않 습 니 다.

아마도 내 가 여러 개의 포트 들 의 작업 원 리 를 오해 한 것 같다.

Array ( [test1] => Array ( [volume] => 67 [edition] => 2 [name] => 6 [num] => 2 ) [test2] => Array ( [volume] => 86 [edition] => 1 [name] => 7 [type] => 2 ) [test3] => Array ( [volume] => 85 [edition] => 6 [name] => 8 [type] => 2 ) [test4] => Array ( [volume] => 98 [edition] => 2 [name] => 9 [type] => 2 ) [test5] => Array ( [volume] => 86 [edition] => 6 [name] => 10 [type] => 2 ) [test6] => Array ( [volume] => 67 [edition] => 7 [name] => 11 [type] => 2 ) ) $sort = array(85, 67, 86, 98, 86, 67); array_multisort($sort, $data); 

이것 은 원본 배열 입 니 다:

$data['test1'] = array('volume' => 67, 'edition' => 2, 'name' => 6, 'num' => 2,); $data['test2'] = array('volume' => 86, 'edition' => 1, 'name' => 7, 'type' => 2,); $data['test3'] = array('volume' => 85, 'edition' => 6, 'name' => 8, 'type' => 2,); $data['test4'] = array('volume' => 98, 'edition' => 2, 'name' => 9, 'type' => 2,); $data['test5'] = array('volume' => 86, 'edition' => 6, 'name' => 10, 'type' => 2,); $data['test6'] = array('volume' => 67, 'edition' => 7, 'name' => 11, 'type' => 2,); 

대답 하 다.

areray Multisort 를 사용 하여 열 에 따라 정렬 할 수 있 습 니 다.

이것 은 예제 입 니 다.

"모든" 열 을 쉽게 정렬 할 수 있 습 니 다:

 67, 'edition' => 2, 'name' => 6, 'type' => 2); $data['test2'] = array('volume' => 86, 'edition' => 1, 'name' => 7, 'type' => 2); $data['test3'] = array('volume' => 85, 'edition' => 6, 'name' => 8, 'type' => 2); $data['test4'] = array('volume' => 98, 'edition' => 2, 'name' => 9, 'type' => 2); $data['test5'] = array('volume' => 86, 'edition' => 6, 'name' => 10, 'type' => 2); $data['test6'] = array('volume' => 67, 'edition' => 7, 'name' => 11, 'type' => 2); //Create index rows foreach ($data as $row) { foreach ($row as $key => $value){ ${$key}[] = $value; //Creates $volume, $edition, $name and $type arrays. } } //ex: sort by edition asc, then by name DESC: array_multisort($edition, SORT_ASC, $name, SORT_DESC, $data); echo "
"; print_r($data); echo "
"; ?>

가 져 올 수 있 습 니 다 (먼저 버 전 ASC, 그리고 이름 대로 DESC):(이름 ASC 로 정렬 하여 test 4 와 test 1 of c 를 교환 합 니 다.

)

Array ( [test2] => Array ( [volume] => 86 [edition] => 1 [name] => 7 [type] => 2 ) [test4] => Array ( [volume] => 98 [edition] => 2 [name] => 9 [type] => 2 ) [test1] => Array ( [volume] => 67 [edition] => 2 [name] => 6 [type] => 2 ) [test5] => Array ( [volume] => 86 [edition] => 6 [name] => 10 [type] => 2 ) [test3] => Array ( [volume] => 85 [edition] => 6 [name] => 8 [type] => 2 ) [test6] => Array ( [volume] => 67 [edition] => 7 [name] => 11 [type] => 2 ) ) 

원한 다 면, 여러 열 을 추가 할 수 있다.

나 는 이것 이 도움 이 되 길 희망 한다.

편집: 질문아니요, 배열 의 다 중 정렬 은 미리 정 해진 순서대로 배열 을 정렬 하 는 데 사용 되 지 않 습 니 다.

areray mltrisort 의 역할 은:이것 은 지정 한 조건 (asc 또는 desc) 에 따라 배열 을 정렬 하고, 다른 배열 의 항목 을 상하 로 이동 하 며, 그 어떠한 배열 의 정렬 에 도 위반 되 지 않 습 니 다.

기본 예제:

$letters = array("b","a","c"); $numbers = array(5,4,2); 

array multiisort 호출 ($letters, $numbers) a, b, c 와 (a 가 위로, b 가 아래로 이동 함) 4, 5, 2

예 를 들 어:

$letters = array("b","a","a"); $numbers = array(5,4,2); 

우선 똑 같은 정렬 방법 을 사용 합 니 다.

(a, a, b - > 4, 2, 5) 하지만 나중에 array multiort 는 이 두 가 지 를 서열 2 와 4 로 바 꿀 수 있 습 니 다.

최종 결과: a, a, b - > 2, 4, 5

질문

미리 정 의 된 순서 로 정렬 하려 면 다음 과 같은 동작 을 수행 할 수 있 습 니 다.

1.) 주문 서 를 정의 하 는 것 은 $order = array ("a", "z", "b" 입 니 다.

2.) 사용자 함수 로 usort 호출 하기

3.) sort 함수 에서 areray friep 와 assoc access 를 사용 하여 실제 위 치 를 가 져 옵 니 다:

$items = array("a","b","z","a","z","z"); uasort($items, "sortByPredefinedOrder"); function sortByPredefinedOrder($leftItem, $rightItem){ $order = array("a","z","b","x"); //defined somewhere $flipped = array_flip($order); //so we can access "position by value" $leftPos = $flipped[$leftItem]; $rightPos = $flipped[$rightItem]; return $leftPos >= $rightPos; } print_r($items); //Array ( [0] => a [3] => a [2] => z [4] => z [5] => z [1] => b ) 

다 차원 입력 에 사용 가능

 $leftPos = $flipped[$leftItem["volume"]]; $rightPos = $flipped[$rightItem["volume"]]; 

근 데 오 피 스 텔 은미리 정 의 된 순서 배열 의 값 을 예측 하고, index Outbound Exception 을 사용 할 것 입 니 다.

Comments