updated: 2020/10/23
php@7.2
$products[0] =
$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: