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

array array_replace_recursive ( array &$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
)

Ayrıca Bakınız

  • array_replace() - İlk dizinin elemanlarını aktarılan dizilerden günceller

add a note add a note

User Contributed Notes 3 notes

up
3
msahagian at dotink dot org
1 year ago
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;
    }
?>
up
0
Gregor at der-meyer dot de
4 years ago
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());
  }
?>
up
0
kyle [dot] florence [@t] gmail [dot] com
4 years ago
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;
}

?>
To Top