2016-02-23 2 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 Ваша проблема проходящая переменной в функцию без ссылки. По умолчанию аргументы функции передаются по значению (так что, если значение аргумента внутри функции изменяется, оно не изменяется вне функции). Чтобы позволить функции изменять свои аргументы, они должны передаваться по ссылке. Более подробную информацию вы можете получить here

Итак, если у вас есть функция:

function changeColors ($oColors) { 
    ... 
} 

Вы должны изменить $ oColors в & $ oColors, как это:

function changeColors (&$oColors) { 

Следующая точка в том, что $ цвет из вашего примера с секцией foreach не является массивом. Это ключевое значение (в большинстве случаев он имеет строковый тип). Перхабс, вы допустили ошибку, и ['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; 
     } 
    } 
    ... 
} 
Смежные вопросы