2013-10-29 34 views
3

我有兩個對象數組。PHP:使用另一個未排序的對象數組更新對象數組值

第一陣列$x

[0] => stdClass Object 
    (
     [id] => 54 
     [value] => test54 
     [something] => testtest54 
    ) 

[1] => stdClass Object 
    (
     [id] => 21 
     [value] => test21 
     [something] => testtest21 
    ) 
... 

二陣列$y

[0] => stdClass Object 
    (
     [id] => 21 
     [value] => test21_new_value 
    ) 

[1] => stdClass Object 
    (
     [id] => 54 
     [value] => test54_new_value 
    ) 
... 

我想更新我的第一陣列$x導入第二陣列的($y)領域具有相同idvalue,我想要:

[0] => stdClass Object 
    (
     [id] => 54 
     [value] => test54_new_value 
     [something] => testtest54 
    ) 

[1] => stdClass Object 
    (
     [id] => 21 
     [value] => test21_new_value 
     [something] => testtest21 
    ) 
... 

我可以做這樣的事情:

foreach($x as $k => $v) { 
    foreach($y as $k2 => $v2) { 
     if ($v->id === $v2->id) $x[$k]->value = $v2->value; 
    } 
} 

但我不喜歡這樣,因爲我走在陣列$y每個$x(如果我有$y$x 100項和100項,它循環100 * 100次)。我認爲有一種更高效,優雅或最優化的方式來做到這一點,但我不知道該怎麼做(我沒有找到對這個特定問題的精確回答,所以我在這裏問)。

回答

2

當然。通常你會使用這一個associative array(的鍵是唯一的ID),因爲這將意味着(100 + 100)迭代,而(100 * 100):

<?php 
    $assocX = array(); 
    foreach ($x as $v) { 
     $assocX[$v->id] = $v; 
    } 

    foreach ($y as $v) { 
     $v->something = $assocX[$v->id]->something; 
    } 
?> 

如果您不能確保值$x存在,你也可以檢查這個(「沒有價值」將被轉換爲NULL):

<?php 
    $assocX = array(); 
    foreach ($x as $v) { 
     $assocX[$v->id] = $v; 
    } 

    foreach ($y as $v) { 
     $v->something = (isset($assocX[$v->id]) ? $assocX[$v->id]->something : null); 
    } 
?> 
+0

好非常感謝!實際上,我認爲'&'對於對象數組不是必需的。 $ v已經是一個對象的引用(我剛剛嘗試過一個循環,但也許我錯了,或者我不明白) –

+0

@ rap-2-h你說得對。對象總是通過引用傳遞的(忘記了 - 它遲到了!):) – h2ooooooo