'톰', '나이' => 18 ), array('na"/> '톰', '나이' => 18 ), array('na">
문제 설명
PHP에서는 2차원 배열의 경우 특정 키 값에 따라 정렬해야 하는 경우가 종종 있습니다. 보통 array_multisort() 함수를 사용하여 정렬하는데 실패하는 경우가 있습니다.
예: 2차원 배열 $arr이 있는데, 키 값 "name"에 따라 내림차순으로 정렬해야 합니다. 코드는 다음과 같습니다.
$arr = array( array('name' => 'Tom', 'age' => 18), array('name' => 'Jerry', 'age' => 20), array('name' => 'Bob', 'age' => 25), array('name' => 'Alice', 'age' => 22), ); // 按照'name'进行降序排序 array_multisort(array_column($arr, 'name'), SORT_DESC, $arr);
그러나 경우에 따라 위 코드를 사용하는 경우도 있습니다. 정렬이 실패하게 되는 원인과 해결 방법은 다음과 같습니다. 다음은 모든 사람을 위해 분석됩니다.
Troubleshooting
이러한 문제에서 일반적으로 가장 좋은 방법은 정렬할 배열을 인쇄하여 정렬된 키 값이 정의되지 않았는지, 데이터 형식이 잘못되었는지 또는 기타 문제가 있는지 관찰하는 것입니다. 인쇄된 배열의 형식이 올바른 경우 코드 디버깅을 시도할 수 있습니다.
다음으로 var_dump() 함수를 사용하여 $arr 배열을 인쇄하고 다음을 확인합니다.
// 打印一下原数组,查看键名和键值 var_dump($arr);
출력 결과:
array(4) { [0]=> array(2) { ["name"]=> string(3) "Tom" ["age"]=> int(18) } [1]=> array(2) { ["name"]=> string(5) "Jerry" ["age"]=> int(20) } [2]=> array(2) { ["name"]=> string(3) "Bob" ["age"]=> int(25) } [3]=> array(2) { ["name"]=> string(5) "Alice" ["age"]=> int(22) } }
키 이름과 키 값의 형식이 올바른 것을 확인할 수 있지만 정렬은 왜 수행됩니까? 실패하다? ?
문제 분석
위의 코드를 다시 보면 array_multisort() 함수를 사용할 때 array_column() 함수를 사용하여 정렬할 키 값을 추출하는 것을 알 수 있습니다. .
array_column() 함수는 키 이름에 해당하는 값을 1차원 배열로 추출할 수 있지만, 배열이 다차원인 경우 전체를 변환하는 대신 첫 번째 차원만 1차원 배열로 처리합니다. 다차원 배열을 1차원 배열로 변환합니다. 이로 인해 array_multisort() 함수를 사용할 때 인덱스 데이터를 잘못 참조하게 될 수 있습니다. 아래에서는 이 문제에 대해 설명합니다.
변수 $arr는 2차원 배열입니다. array_column() 함수를 사용하여 키 이름이 "name"인 값을 추출합니다.
// 提取出键名为'name'的值 $name = array_column($arr, 'name'); var_dump($name);
출력 결과:
array(4) { [0]=> string(3) "Tom" [1]=> string(5) "Jerry" [2]=> string(3) "Bob" [3]=> string(5) "Alice" }
위와 같습니다. , 우리는 1차원 배열만 얻었기 때문에 정렬 중에 다른 키 이름에 해당하는 값이 손실됩니다. 따라서 다차원 배열을 1차원 배열로 변환한 후 array_multisort() 함수를 사용하여 정렬할 수 있습니다.
해결 방법
다차원 배열을 1차원 배열로 변환하는 방법에는 두 가지가 있습니다. 즉, array_walk_recursive() 함수나 foreach()를 사용하여 다차원 배열을 반복하는 것입니다. 여기서는 array_walk_recursive() 함수를 예로 들어 설명하겠습니다.
array_walk_recursive() 함수를 사용하여 다차원 배열을 1차원 배열로 변환하는 방법을 살펴보겠습니다.
// 定义一个函数将多维数组转换为一维数组 function array_multi2single(&$data){ static $result_array = array(); array_walk_recursive($data, function($value, $key) use(&$result_array){ $result_array[$key] = $value; }); $data = $result_array; } // 将多维数组转换为一维数组 array_multi2single($arr);
변환된 $arr 배열은 다음과 같습니다.
array(8) { ["name"]=> string(5) "Alice" ["age"]=> int(22) [0]=> string(3) "Tom" [1]=> string(5) "Jerry" [2]=> string(3) "Bob" [3]=> string(5) "Alice" [4]=> int(18) [5]=> int(20) }
다차원 배열을 변환한 후 배열을 1차원 배열로 변환하려면 array_multisort() 함수를 재사용하여 배열을 정렬할 수 있습니다.
// 将多维数组转换为一维数组 array_multi2single($arr); // 按照'name'进行降序排序 array_multisort(array_column($arr, 'name'), SORT_DESC, $arr);
정렬된 배열은 다음과 같습니다.
array(4) { [0]=> array(2) { ["name"]=> string(5) "Jerry" ["age"]=> int(20) } [1]=> array(2) { ["name"]=> string(3) "Bob" ["age"]=> int(25) } [2]=> array(2) { ["name"]=> string(5) "Alice" ["age"]=> int(22) } [3]=> array(2) { ["name"]=> string(3) "Tom" ["age"]=> int(18) } }
다차원 배열 변환을 완료한 후 array_multisort() 함수를 재사용합니다. 배열을 정렬하면 정렬이 정상적으로 수행될 수 있습니다.
위 내용은 PHP가 2차원 배열을 재정렬하지 못하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!