array_replace_recursive

(PHP 5 >= 5.3.0)

array_replace_recursive渡された配列の要素を再帰的に置き換える

説明

array array_replace_recursive ( array $array1 , array $array2 [, array $... ] )

array_replace_recursive() は、 最初の配列の値をそれ以降の配列の同じ要素の値で置き換えます。 最初の配列のキーと同じキーが 2 番目の配列にあれば、 2 番目の配列の値が最初の配列の値を上書きします。 2 番目の配列に存在するキーが最初の配列に存在しなければ、 そのキーが新たに最初の配列内に作られます。 最初の配列にしか存在しないキーについては何も変わりません。 置き換え用の配列が複数渡された場合は渡した順に処理を行い、 後から渡した配列の値のほうが優先されます。

array_replace_recursive() は再帰的な処理を行います。 配列を再帰的にたどり、内部の値に対しても同じ手順で処理します。

array1 の値がスカラーの場合は、 array2 の値がスカラーであるか配列であるかにかかわらずそれで置き換えられます。 array1 の値と array2 の値が両方配列である場合は、array_replace_recursive() が対応する値を再帰的に処理します。

パラメータ

array1

要素を置き換えたい配列。

array2

置き換えたい要素を含む配列。

...

オプション。置き換えたい要素を含む、さらに別の配列。

返り値

配列を返します。エラーが発生した場合は NULL を返します。

例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
)

参考

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