问题描述
在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);但是,对于某些情况下,用上面的代码会导致排序失败,原因及解决方法是什么呢? 下文将为大家分析。
排查问题
在这样的问题中,一般情况下最好的方法是先打印出要排序的数组,观察到底是不是排序的键值没有定义、数据格式错误或其他问题。如果打印出的数组格式正确,可以试着进行代码调试。
立即学习“PHP免费学习笔记(深入)”;
下面,我们使用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中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号