PHP: Update deeply nested array value using foreach

updated: 2020/10/23

 

php@7.2

 

$products[0] =

f:id:monteecristoo:20200107213210p:plain

$productsは上記のようなものの集合とし。$products[1], $products[n]と続いてくものとする。

name と colorのcolor["path"]をそれぞれアップデートしたい場合

 

foreach($products as $product) {

  $product["name"] = "NEW_VALUE";

}

return $products;

 

1段のネストなら上記でアップデートできるが2段ネストされた配列を含むcolorを上記のように処理するとエラーが出る

foreach($products as $product) {

  $product["name"] = "NEW_VALUE";

  foreach($product["color"] as $color) {

    $color["path"] = "NEW_COLOR_PATH";

  }

}

return $products;

  >>> $product["color"]は更新されない。

-------------------------------------------------------------------------------------------------

foreach($products as $product) {

  $product["name"] = "NEW_VALUE";

  foreach($product["color"] as $key => $color) {

    $color["path"] = "NEW_COLOR_PATH";

    $product[$key] = $color;

  }

}

return $products;

  >>> error: Indirect modification of overloaded element of....

--------------------------------------------------------------------------------------------------

solution)

foreachが2段続くと2段目は値の更新ではなく、新規の値を定義した扱いなので、

新規定義した値を代入する。

 

foreach($products as $key1 => $product) {

  $product["name"] = "NEW_VALUE";

  $colors = $product["color"];

  foreach($colors as $key2 => $color) {

    $color["path"] = "NEW_COLOR_PATH";

    $colors[$key2] = $color;

  }

  $product[$key1]["color"] = $colors;

}

return $products;

 

ref:

https://stackoverflow.com/questions/16960626/indirect-modification-of-overloaded-element-of-simplexmlelement-has-no-effect