'톰', '나이' => 18 ), array('na"/> '톰', '나이' => 18 ), array('na">

 >  기사  >  백엔드 개발  >  PHP가 2차원 배열을 재정렬하지 못하는 이유는 무엇입니까?

PHP가 2차원 배열을 재정렬하지 못하는 이유는 무엇입니까?

PHPz
PHPz원래의
2023-04-18 09:06:09702검색

문제 설명

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.