2011-06-06 36 views
5

下面这段代码旨在创建一个多级数组,然后将其打印出来,然后再打印出来,再打印出来,然后对数组进行排序。排序函数是否考虑多级数组中的叶节点?

$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 
       ) 
     ) 
) 

回答

3

查看PHP的comparison operator reference的数组部分,特别是数组比较转录。基本上PHP首先比较数组中的键的数量,然后检查数组是否具有相同的键(在这种情况下,0为内部数组),然后比较这些值。因为在那里有一个嵌套数组,所以它继续比较sort()中的叶节点,这导致在此情况下数组按第一个叶数组值排序(adg)。

shuffle()简单地重新排列你给它的数组的索引,而不管数组包含什么,因此它根本不接触内部数组。