2011-08-21 57 views
0

我正在使用PHP 5.3.6如何在數組中創建一個關聯數組時引用數組中的項目

我在下面有下面的代碼。除了最後一行嘗試返回基於數組中位置的值而不是關聯名稱之外,一切正常。任何人都可以解釋爲什麼會發生這種情況,以及如何構建數組,以便我可以通過關聯名稱或位置編號引用項目?

謝謝。

<?php 
class myObject { 
    var $Property; 
    function myObject($property) { 
    $this->Property = $property; 
    } 
} 
$ListOfObjects['form_a'] = new myObject(1); 
$ListOfObjects['form_b'] = new myObject(2); 
$ListOfObjects['form_c'] = new myObject(3); 
$ListOfObjects['form_d'] = new myObject(4); 

echo "<pre>"; 
print_r($ListOfObjects); 
echo "</pre>"; 

echo "<hr />"; 
foreach ($ListOfObjects as $key => $val) { 
    echo "<li>" . $ListOfObjects[$key]->Property . "</li>"; 
} 

echo "<hr />"; 
echo "<li>" . $ListOfObjects['form_a']->Property . "</li>"; // Works ok. 

//Edit: ------------------------------------------------------------ 
//Edit: Everything above is for context only 
//Edit: I'm only interested in the line below and why it does not work 
//Edit: ------------------------------------------------------------ 

echo "<li>" . $ListOfObjects[0]->Property . "</li>"; //Does not work. 
?> 

回答

2
function value_from_index($a,$k){ 
    return array_slice($a,$k,1); 
} 
+0

我對這條線感興趣(不是循環):'echo「

  • 」。 $ ListOfObjects [0] - >屬性。 「
  • 」; //不起作用.' –

    +0

    'echo「

  • 」。 value_from_index($ ListOfObjects,0) - > Property。 「
  • 」;' – Trey

    +0

    我得到以下錯誤:'調用未定義的函數value_from_index()' –

    1

    如果你只是想一個數組的第一個/最後一個元素,嘗試end($array)的最後一個項目,而不破壞它,​​拿到第一。

    如果您在Flambino筆記中循環訪問數組,請不要使用重置並結束,這確實會導致一些意外行爲。

    對於其間的任何東西,你需要使用array_slice()

    +0

    只是不要在你用foreach循環循環的數組上使用'reset()'或'end()',否則會出現奇怪的行爲(如果我沒有弄錯) – Flambino

    0

    沒有這樣做的最好的方式,但effektive和可讀性:

    $i = 0; 
    $last = count($ListOfObjects); 
    
    foreach($ListOfObjects as $obj) { 
        if($i == 0) { 
         //do something with first object 
         $obj->property; 
        else if ($i == ($last-1)) { 
         //do something with last object 
         $obj->property; 
        } 
    } 
    
    0

    PHP數組不喜歡你的陣列從其他大多數知道編程語言,它們更像是有序散列表/有序字典 - 它們允許通過命名索引進行訪問,並在添加新項目時保留順序。如果你想允許使用數字索引訪問這樣的數組,你必須這樣定義它,或者使用其他答案中給出的一種迂迴方式。

    你的情況,你可以使用一個單一的代碼行通過索引允許訪問:

    $ListOfObjects += array_values($ListOfObjects); 
    

    這將與同一個,但與數字索引擴展您的陣列。由於對象始終按引用傳遞,因此可以通過編寫$ListOfObjects['form_b']$ListOfObjects[1]來訪問同一個對象。