踩坑:array_reverse 转换改变了数值键问题
起因:应用中,有一个数据是使用数组的键名来unset删除的,大概是这样 unset($arr[$key]) ,但是点击删除,并没被删除
经过我debug后,发现是array_reverse函数的问题,下面我复现一下错误:
$arr = [
"aaa" => 111,
"bbb" => 222,
"2021" => 333,
"ccc" => 444
];
$arr1 = array_reverse($arr);
var_dump($arr1);
/*array(4) {
["ccc"]=>
int(444)
[0]=>
int(333)
["bbb"]=>
int(222)
["aaa"]=>
int(111)
}*/
//可以看到 "2021" => 333 变为 0=> 333 了
foreach($arr1 as $k => $v) {
if($v==333) unset($arr[$k]); //此时$k为0,源数组中并不存在这个键,无法删除,且这里不会报错的
}
var_dump($arr);
/*
array(4) {
["aaa"]=>
int(111)
["bbb"]=>
int(222)
[2021]=>
int(333)
["ccc"]=>
int(444)
}
*/
我们再看看有多个数值键的情况:
可以得出,array_reverse对数值键,会转为初始从0开始的索引,多个就是按顺序 0,1,2,… ; 这里要特别注意 ;数值键是会改变的;
本作品采用《CC 协议》,转载必须注明作者和本文链接
sssssss
array_reverse()第二个参数设为true,就不会更改数字键了
这不是坑, 用函数之前先看看文档吧 :joy: PHP函数 array_reverse