2011-06-06 33 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()簡單地重新排列你給它的數組的索引,而不管數組包含什麼,因此它根本不接觸內部數組。