array_replace_recursive
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
array_replace_recursive — 渡された配列の要素を再帰的に置き換える
説明
array_replace_recursive() は、
array
の値をそれ以降の配列の同じ要素の値で置き換えます。
最初の配列のキーと同じキーが 2 番目の配列にあれば、
2 番目の配列の値が最初の配列の値を上書きします。
2 番目の配列に存在するキーが最初の配列に存在しなければ、
そのキーが新たに最初の配列内に作られます。
最初の配列にしか存在しないキーについては何も変わりません。
置き換え用の配列が複数渡された場合は渡した順に処理を行い、
後から渡した配列の値のほうが優先されます。
array_replace_recursive() は再帰的な処理を行います。 配列を再帰的にたどり、内部の値に対しても同じ手順で処理します。
最初の配列の値がスカラーの場合は、 2 番目の配列の値がスカラーであるか配列であるかにかかわらずそれで置き換えられます。 最初の配列の値と 2番目の配列 の値が両方配列である場合は、array_replace_recursive() が対応する値を再帰的に処理します。
パラメータ
array
-
要素を置き換えたい配列。
replacements
-
置き換えたい要素を含む配列。
戻り値
配列を返します。
例
例1 array_replace_recursive() の例
<?php
$base = array('citrus' => array( "orange") , 'berries' => array("blackberry", "raspberry"), );
$replacements = array('citrus' => array('pineapple'), 'berries' => array('blueberry'));
$basket = array_replace_recursive($base, $replacements);
print_r($basket);
$basket = array_replace($base, $replacements);
print_r($basket);
?>
上の例の出力は以下となります。
Array ( [citrus] => Array ( [0] => pineapple ) [berries] => Array ( [0] => blueberry [1] => raspberry ) ) Array ( [citrus] => Array ( [0] => pineapple ) [berries] => Array ( [0] => blueberry ) )
例2 array_replace_recursive() での再帰的な挙動の例
<?php
$base = array('citrus' => array("orange") , 'berries' => array("blackberry", "raspberry"), 'others' => 'banana' );
$replacements = array('citrus' => 'pineapple', 'berries' => array('blueberry'), 'others' => array('litchis'));
$replacements2 = array('citrus' => array('pineapple'), 'berries' => array('blueberry'), 'others' => 'litchis');
$basket = array_replace_recursive($base, $replacements, $replacements2);
print_r($basket);
?>
上の例の出力は以下となります。
Array ( [citrus] => Array ( [0] => pineapple ) [berries] => Array ( [0] => blueberry [1] => raspberry ) [others] => litchis )
User Contributed Notes 1 note
Note that function will NOT replace a sub-tree from you $array1 if its value in $array2 is an empty array.
Even tho the key for this dimension is technically 'set'.
(I suppose it treats it as just another recursive level to dive in, finding no key to compare, backtracking while leaving this sub-tree alone)
For example:
$array1 = ['first' => ['second' => 'hello']];
$array2 = ['first' => []];
$result = array_replace_recursive($array1, $array2);
$result is still: ['first' => ['second' => 'hello']].