Nice that this function finally found its was to the PHP core! If you want to use it also with older PHP versions before 5.3.0, you can define it this way:
<?php
if (!function_exists('array_replace_recursive'))
{
function array_replace_recursive($array, $array1)
{
function recurse($array, $array1)
{
foreach ($array1 as $key => $value)
{
// create new key in $array, if it is empty or not an array
if (!isset($array[$key]) || (isset($array[$key]) && !is_array($array[$key])))
{
$array[$key] = array();
}
// overwrite the value in the base array
if (is_array($value))
{
$value = recurse($array[$key], $value);
}
$array[$key] = $value;
}
return $array;
}
// handle the arguments, merge one by one
$args = func_get_args();
$array = $args[0];
if (!is_array($array))
{
return $array;
}
for ($i = 1; $i < count($args); $i++)
{
if (is_array($args[$i]))
{
$array = recurse($array, $args[$i]);
}
}
return $array;
}
}
?>
I called this function array_merge_recursive_overwrite() in my older projects, but array_replace_recursive() sounds quite better while they do the same.
If you implemented such a compatible function before and don't want to refactor all your code, you can update it with the following snippet to use the native (and hopefully faster) implementation of PHP 5.3.0, if available. Just start your function with these lines:
<?php
// as of PHP 5.3.0 array_replace_recursive() does the work for us
if (function_exists('array_replace_recursive'))
{
return call_user_func_array('array_replace_recursive', func_get_args());
}
?>
array_replace_recursive
(PHP 5 >= 5.3.0)
array_replace_recursive — İlk dizinin elemanlarını aktarılan dizilerden ardışık olarak günceller
Açıklama
&$disi
, array &$dizi1
[, array &$dizi2
[, array &$...
]] )
dizi
dizisinin değerlerini belirtilen diğer
dizilerin değerleriyle günceller. İlk dizideki bir anahtar ikinci dizide
mevcutsa ilk dizideki değer ikinciden güncellenir. İkinci dizide olup ilk
dizide olmayan anahtarlar ilk dizide oluşturulur. Sadece ilk dizide
bulunan anahtarların değerlerine dokunulmaz. Birden fazla güncelleyici
dizi belirtilmişse diziler sırayla işlenir; yani daima sonraki dizideki
değerler daima üste yazar.
array_replace_recursive() ardışık işlem yapar: alt dizilerdeki değerleri de aynı şekilde günceller.
İlk dizideki değer sayıl bir değerse, ikinci dizideki sayıl veya dizi değerle güncellenir. İlk ve ikinci dizideki değerlerin ikisi de dizi ise güncelleme işlemi bu alt dizilere ardışık olarak uygulanır.
Değiştirgeler
-
dizi
-
Elemanları güncellenecek dizi.
-
dizi1
-
İlk diziyi güncelleyecek dizi.
Dönen Değerler
Bir hata durumunda NULL
aksi takdirde bir dizi döner.
Örnekler
Örnek 1 - array_replace_recursive() örneği
<?php
$esas = array('kışlık' => array( "portakal"),
'yazlık' => array("karpuz", "kavun"), );
$ikame = array('kışlık' => array('mandalina'),
'yazlık' => array('üzüm'));
$sepet = array_replace_recursive($esas, $ikame);
print_r($sepet);
$sepet = array_replace($esas, $ikame);
print_r($sepet);
?>
Yukarıdaki örneğin çıktısı:
Array ( [kışlık] => Array ( [0] => mandalina ) [yazlık] => Array ( [0] => üzüm [1] => kavun ) ) Array ( [kışlık] => Array ( [0] => mandalina ) [yazlık] => Array ( [0] => üzüm ) )
Örnek 2 - array_replace_recursive()ve ardışık işlem
<?php
$esas = array('kışlık' => array("portakal"),
'yazlık' => array("kavun", "karpuz"),
'diğer' => 'avakado' );
$ikame = array('kışlık' => 'mandalina',
'yazlık' => array('üzüm'),
'diğer' => array('ananas'));
$ikame2 = array('kışlık' => array('nar'),
'yazlık' => array('üzüm'),
'diğer' => 'muz');
$sepet = array_replace_recursive($esas, $ikame, $ikame2);
print_r($sepet);
?>
Yukarıdaki örneğin çıktısı:
Array ( [kışlık] => Array ( [0] => nar ) [yazlık] => Array ( [0] => üzüm [1] => karpuz ) [diğer] => muz )

This might help out people who don't have 5.3 running:
<?php
// Joins two or more arrays together recursively; key/value pairs of the first
// array are replaced with key/value pairs from the subsequent arrays. Any
// key/value pair not present in the first array is added to the final array
function array_join()
{
// Get array arguments
$arrays = func_get_args();
// Define the original array
$original = array_shift($arrays);
// Loop through arrays
foreach ($arrays as $array)
{
// Loop through array key/value pairs
foreach ($array as $key => $value)
{
// Value is an array
if (is_array($value))
{
// Traverse the array; replace or add result to original array
$original[$key] = array_join($original[$key], $array[$key]);
}
// Value is not an array
else
{
// Replace or add current value to original array
$original[$key] = $value;
}
}
}
// Return the joined array
return $original;
}
?>
This is a fairly concise version which does not rely on traditional recursion:
<?php
function array_replace_recursive($base, $replacements)
{
foreach (array_slice(func_get_args(), 1) as $replacements) {
$bref_stack = array(&$base);
$head_stack = array($replacements);
do {
end($bref_stack);
$bref = &$bref_stack[key($bref_stack)];
$head = array_pop($head_stack);
unset($bref_stack[key($bref_stack)]);
foreach (array_keys($head) as $key) {
if (isset($key, $bref) && is_array($bref[$key]) && is_array($head[$key])) {
$bref_stack[] = &$bref[$key];
$head_stack[] = $head[$key];
} else {
$bref[$key] = $head[$key];
}
}
} while(count($head_stack));
}
return $base;
}
?>