下面这段代码用于创建一个多级数组,打印它,然后将其洗牌,再次打印,并对数组进行排序。
$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
)
)
)
答案 0 :(得分:3)
参见PHP comparison operator reference的数组部分,尤其是数组比较转录。基本上PHP首先比较数组中的键数量,然后检查数组是否具有相同的键(在这种情况下,内部数组为0
),然后比较这些值。因为那里有一个嵌套数组,所以它继续比较sort()
中的叶节点,这导致数组在这种情况下被叶子数组的第一个值排序(a
,{{1 }和d
)。
g
只是重新排序你给它的数组的索引,而不管数组包含什么,因此它根本不会触及内部数组。