php对二维数组重新排序失败怎么回事

PHPz
PHPz原创
2023-04-18 09:27:4923浏览

问题描述

在php中,对于一个二维数组,有时候需要按照某个键值进行排序,我们一般会使用array_multisort()函数进行排序,但有些情况下排序却失败了。
例如:存在一个二维数组$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);

但是,对于某些情况下,用上面的代码会导致排序失败,原因及解决方法是什么呢? 下文将为大家分析。

排查问题

在这样的问题中,一般情况下最好的方法是先打印出要排序的数组,观察到底是不是排序的键值没有定义、数据格式错误或其他问题。如果打印出的数组格式正确,可以试着进行代码调试。

下面,我们使用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()函数可以提取出一维数组中的某个键名对应的值,但如果数组是多维的,它只会将第一维当做一维数组,而不是将整个多维数组转换为一维数组。这就会导致在使用array_multisort()函数时错误地引用了索引数据。下面我们针对这个问题进行说明。

变量$arr是一个二维数组,我们使用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"
}

如上所示,我们只得到了一个一维数组,这就会导致在排序时,其他键名对应的值就丢失了。于是,我们可以尝试将多维数组转换为一维数组,再使用array_multisort()函数来进行排序。

解决方案

有两种方法可以将多维数组转换为一维数组,即使用array_walk_recursive()函数或foreach()循环遍历多维数组。这里我们将以array_walk_recursive()函数为例进行说明。

下面我们来看一下如何使用array_walk_recursive()函数将多维数组转换为一维数组:

// 定义一个函数将多维数组转换为一维数组
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)
}

将多维数组转换为一维数组之后,我们可以重新使用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对二维数组重新排序失败怎么回事的详细内容,更多请关注php中文网其它相关文章!

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。