您的位置:首页 > 技术中心 > PHP教程 >

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

时间:2023-04-18 10:10

问题描述

在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对二维数组重新排序失败怎么回事的详细内容,更多请关注Gxl网其它相关文章!

热门排行

今日推荐

热门手游