2010-12-07 103 views
5

在php 5.3中,數組的處理方式已經改變。php 5.3陣列兼容性

例陣列:

<?php $a = array ('foo' => 1, 'bar' => 2, 'foo' => 3); ?> 

使用到超過寫入與最後一個陣列中,得到 '富':

array(
    'foo' => 3, 
    'bar' => 2 
) 
現在

在5.3它返回

array(
    'foo' => 1, 
    'bar' => 2 
) 

我正在測試一個PHP v5.2.11,所以我無法測試這個我的自我這個例子是從php.net網站:http://php.net/manual/en/language.types.array.php和搜索5.3

的頁面將通過

<?php 
    $a['foo'] = 1; 
    $a['bar'] = 2; 
    $a['foo'] = 3; 
?> 

設定值的方法提供了針對此問題的向後兼容補丁? 在新版本的php中處理數組時有沒有其他要注意的事情?

+1

這會歸類爲未定義的行爲。但順便說一句,5.3仍然覆蓋最後一個值。 – mario 2010-12-07 00:54:33

+0

「這個例子是從php.net網站」 - 你可以鏈接到它? – salathe 2010-12-07 07:50:37

回答

0

我想你應該使用數組的唯一鍵。

<?php $a = array ('foo' => 1, 'bar' => 2); ?> 

然後更新foo的值。

<?php $a['foo'] = 3; ?> 
+0

這不是重點,在其他情況下確實存在一個錯誤,這不是一個記錄的變化。 – RobertPitt 2010-12-07 09:34:17

2

從手冊:

注意,當兩個相同的索引被定義,最後覆蓋第一個。

所以,除非你已經在某種程度上引發了PHP錯誤(不太可能),那麼還有別的事情,你缺失。

並回答你的問題,是的,通過賦值操作符覆蓋鍵的作品。但是,在開始更改代碼之前,我會檢查以確定問題是您當前的想法,因爲手冊確實聲稱後者的鍵會覆蓋前者。

更新: @ sberry2A的鏈接確實揭示了PHP 5.3的錯誤地方(即,不執行手冊中的說明)。

class Foo 
{ 
    const A = 1; 
    const B = 1; 

    public static $bar = array(self::A => 1, self::B => 2); 
} 

人們會期望的Foo::$bar[1]2,但它仍然1。但是,以下工作正常:

class Foo 
{ 
    const A = 1; 
    const B = 1; 

    public static function bar() 
    { 
    return array(self::A => 1, self::B => 2); 
    } 
} 

所以它只是具有相同值的不同常量索引的靜態屬性數組的特定情況。這是PHP 5.3.3中唯一可以觸發這種行爲的方法,但也許還有其他方法可以......顯然不能依賴某種行爲。