下面的这段代码旨在创建一个多级数组,打印它,然后对它进行混洗,再次打印它,并对数组进行排序。
$arr=array(
array(
array('a','b','c')
),
array(
array('d','e','f')
),
array(
array('g','h','i')
),
);
print_r($arr);
shuffle($arr);
print_r($arr);
sort($arr);
print_r($arr);
现在,我观察到的奇怪的事情是,当使用shuffle()
时,它只将正在被打乱的数组的索引打乱,而不将最内部的元素a,b,c
打乱,但当使用sort()
函数时,它将数组重新排序为正常状态,并且叶节点按字母顺序返回。为什么会发生这种情况?
以下是示例输出:*原始阵列*
Array
(
[0] => Array
(
[0] => Array
(
[0] => a
[1] => b
[2] => c
)
)
[1] => Array
(
[0] => Array
(
[0] => d
[1] => e
[2] => f
)
)
[2] => Array
(
[0] => Array
(
[0] => g
[1] => h
[2] => i
)
)
)
无序阵列
Array
(
[0] => Array
(
[0] => Array
(
[0] => g
[1] => h
[2] => i
)
)
[1] => Array
(
[0] => Array
(
[0] => a
[1] => b
[2] => c
)
)
[2] => Array
(
[0] => Array
(
[0] => d
[1] => e
[2] => f
)
)
)
排序阵列
Array
(
[0] => Array
(
[0] => Array
(
[0] => a
[1] => b
[2] => c
)
)
[1] => Array
(
[0] => Array
(
[0] => d
[1] => e
[2] => f
)
)
[2] => Array
(
[0] => Array
(
[0] => g
[1] => h
[2] => i
)
)
)
请参阅PHP比较运算符引用的数组部分,尤其是数组比较转录。基本上,PHP首先比较数组中的键数量,然后检查数组是否具有相同的键(在本例中,内部数组为0
),然后比较值。因为那里有一个嵌套数组,所以它会继续比较sort()
中的叶节点,这导致在这种情况下,该数组按照叶数组的第一个值(a
、d
和g
)进行排序。
shuffle()
只是重新排序您给它的数组的索引,而不管该数组包含什么,因此它根本不会触及内部数组。