首先进行描述问题:
一个平常的二维数组,如下面这个数组
$arr = [
"a" => [
"1" => "5",
"5" => "25",
"4" => "8",
"3" => "13",
],
"b" => [
"9" => "10",
"6" => "19",
"8" => "21",
"7" => "29",
]
];
我现在需要将这个二维数组里面的一维关联数组进行按照键值排序,因为要改变数组内部值所以我使用了传引用
foreach ($arr as $key => & $value) {
ksort($value);
}
完成排序操作之后我打印数组,此时数组是这样的
Array ( [a] => Array ( [1] => 5 [3] => 13 [4] => 8 [5] => 25 ) [b] => Array ( [6] => 19 [7] => 29 [8] => 21 [9] => 10 ) )
它已经成功进行了排序,然后我饿们再次循环数组进行使用的时候,我们就需要注意问题了
foreach ($arr as $key => $value) {
echo "<pre>";
var_dump($value);
}
很简单的foreach遍历循环,然而在数组里面进行使用数组时,下标a的数组和下标b的数组的值都是下标a指向的数组
array(4) { [1]=> string(1) "5" [3]=> string(2) "13" [4]=> string(1) "8" [5]=> string(2) "25" }
array(4) { [1]=> string(1) "5" [3]=> string(2) "13" [4]=> string(1) "8" [5]=> string(2) "25" }
这时问题就来了,为什么会这样呢?其实就是我们在上面对数组进行了引用传递,然后在下面再次循环的时候引用传递还在对此数组产生作用,在循环第二次的时候就解析成了传引用,所以下标b出现的数组就是下标a的
想要解决这个问题也很简单,只需要再次循环时再加上一个&引用符,或者将上虞个引用符销毁就行了
上述问题属于个人碰见的坑所以将它分享出来,勿喷,谢谢