2016-02-23 47 views
1

我有這樣的對象,表示與數 我想從另一個陣列屬性添加到PHP pbject

印刷對象$oColors添加的顏色代碼屬性的物體顏色:

stdClass Object 
    (
     [black] => 2207 
     [blue] => 783 
     [red] => 672 
     [white] => 555 
     [green] => 463 
    ) 

和我試圖通過它們循環並將它們映射到另一個對象陣列,如下所示:

foreach ($oColors as $color => $count) { 
    if (array_key_exists($color, $oColorsMapper)) { 
     $oColors->$color['code']= $oColorsMapper->$color->code; 
    } 
} 

但打印結果顯示目標仍然是相同的

我究竟做錯了感謝

+0

您可以用'array_merge'。你可以只顯示樣本你想要的結果數組是 – Nehal

+0

是函數內的'foreach'嗎? – drosam

+0

是的,似乎你的foreach裏面的函數,你忘記與& –

回答

0

的問題是,該鍵不是陣列。他們是字符串。因此,解決辦法是這樣的:

foreach ($oColors as $color => $count) { 
    if (array_key_exists($color, $oColorsMapper)) { 
     $oColors->$color = array(
      'count' => $count, 
      'code' => $oColorsMapper->$color->code 
     ); 
    } 
} 

舉個簡單的例子:

$arr = (object) array('test' => 43, 'test1' => 435); 

function test($obj) { 
    foreach ($obj as $key => $val) { 
     $obj->$key = array($val); 
    } 
} 

test($arr); 

var_dump($arr); 

將輸出:

object(stdClass)#1 (2) { 
    ["test"]=> 
    array(1) { 
    [0]=> 
    int(43) 
    } 
    ["test1"]=> 
    array(1) { 
    [0]=> 
    int(435) 
    } 
} 
0

@sisimh 您的問題是通過可變進功能,無需參考。 默認情況下,函數參數是按值傳遞的(所以如果函數中參數的值被改變,它不會在函數之外被改變)。要允許函數修改它的參數,它們必須通過引用傳遞。更多信息u能得到here

所以,如果你有功能:

function changeColors ($oColors) { 
    ... 
} 

你應該改變$ oColors到& $ oColors,像這樣:

function changeColors (&$oColors) { 

接下來的一點是,$顏色從你的例子中,foreach部分不是一個數組。這是一個關鍵的價值(在大多數情況下它有一個字符串類型)。 Perhabs,你犯了錯誤,['code']應該缺席。

我的另一個注意點是array_key_exists。在大多數情況下,最好使用isset而不是array_key_exists。這是更快的方式。

例如:

function changeColors (&$oColors) { 
    ... 
    foreach ($oColors as $color => $count) { 
     if (isset($oColorsMapper->$color)) { 
      $oColors->$color = $oColorsMapper->$color->code; 
     } 
    } 
    ... 
}