2014-05-24 105 views
-2

我將C#代碼移植到PHP。PHP數組不可索引

但是,它似乎像PHP忽略數組引用。下面的代碼給出了最後一個元素3次。我怎樣才能解決這個問題?

class Participants 
{ 
    public $name; 
    public $country; 
    public $town; 

} 

class Test 
{ 
    public function __construct() 
    { 
     $this->List = array(new Participants()); 
    } 

    public function test() 
    {   
     $p = new Participants(); 

     $p->name = "Harry"; 
     $p->town = "Washington"; 
     $p->country = "USA"; 

     $List[0] = $p; 

     $p->name = "Janette"; 
     $p->town = "Amsterdam"; 
     $p->country = "Netherlands"; 

     $List[1] = $p; 

     $p->name = "Piotr"; 
     $p->town = "Moscow"; 
     $p->country = "Russia"; 

     $List[2] = $p; 

    echo $List[0]->name; 
    echo $List[1]->name; 
    echo $List[2]->name; 
     // this unfortunately ignores the index and echoes 3 times the last element. 

    } 
}//end Test Class 
+1

_或_...您創建了一個對象而不是三個,並將該數組的每個項目分配給相同的東西。只要算一下你使用'new'的次數,如果你來自C#背景,問題應該很清楚 – Clive

+1

@ user3416660我刪除了關於移位寄存器等的段落,因爲它是不相關的和不正確的。請保持您的問題簡短並且重要。你也是構造函數'$ this-> List = array(new Participants());''不會做你認爲它做的事。在PHP中,您不需要在數組中聲明值的類型。 '$ this-> List = array();'就夠了。或者甚至更好地把它變成一個類變量。 – dtech

+0

嘗試了這一點,但它不能解決問題。使用舊的構造函數,count()函數至少返回了正確數量的數組元素。使用你縮短的構造函數,count函數返回零。 – user3416660

回答

2

數組在PHP實際上是有序的包含HashMap和他們可轉位。你的問題與「索引被忽略」無關。您的問題是$List[0],$List[1]$List[2]都是對相同對象的引用。

+0

感謝Filype。然而,這種結構已經在C#中工作了。當函數test()只被調用一次時,實例$ p也只創建一次,在這個調用中,各種數組元素都被索引訪問。但是如果你說PHP數組畢竟是可索引的,那麼正確的語法是:$ List [0] - > name? – user3416660

+0

如果您想要數組中的第一個對象的名稱屬性,則_is_是正確的語法 – Clive

2

對象是可變的,你只能做出1個獨特的對象,並改變名稱/城鎮/國家3次。

當您指定$p$List[0]不作對象的副本,而是給$List[0]同一個對象作爲$p,然後您可以繼續改變參考。

如果你想3個對象,你需要做3個對象:

$p = new Participants(); 
    $p->name = "Harry"; 
    $p->town = "Washington"; 
    $p->country = "USA"; 
    $List[0] = $p; 

    $p = new Participants(); 
    $p->name = "Janette"; 
    $p->town = "Amsterdam"; 
    $p->country = "Netherlands"; 
    $List[1] = $p; 

    $p = new Participants(); 
    $p->name = "Piotr"; 
    $p->town = "Moscow"; 
    $p->country = "Russia"; 
    $List[2] = $p; 

這個數據與在幾乎所有OOP語言BTW,包括C#。不同的是,在C#中,您可以定義一個值類型(結構或枚舉),它在分配時確實會生成完整副本。我的猜測是C#Participants是一個結構。

+0

您是一名救星dtech!我完全忽略了這一點,非常感謝。是的,你是完全正確的,我來自C#中的一個結構,因此這不是一個問題。 – user3416660