array_replace

(PHP 5 >= 5.3.0)

array_replaceЗамена элементов массива элементами других переданных массивов

Описание

array array_replace ( array $array , array $array1 [, array $... ] )

array_replace() замещает значения первого массива array соответствующими по ключам значениями из других переданных массивов. Если ключ из первого массива присутствует во втором массиве, его значение заменяется на значение из второго массива. Если ключ есть во втором массиве, но отсутствует в первом - он будет создан в первом массиве. Если ключ присутствует только в первом массиве, то сохранится как есть. Если для замены передано несколько массивов, они будут обработаны в порядке передачи и более поздние массивы будут перезаписывать значения из предыдущих.

array_replace() не рекурсивная: значения первого массива будут заменены вне зависимости от типа значений второго массива, даже если это будут вложенные массивы.

Список параметров

array

Массив, элементы которого требуется заменить.

array1

Массив, элементами которого будут заменяться элементы первого массива.

...

Еще массивы, из которых будут браться элементы для замены. Значения следующего массива затирают значения предыдущего.

Возвращаемые значения

Возвращает массив (array) или NULL в случае ошибки.

Примеры

Пример #1 Пример использования array_replace()

<?php
$base 
= array("orange""banana""apple""raspberry");
$replacements = array(=> "pineapple"=> "cherry");
$replacements2 = array(=> "grape");

$basket array_replace($base$replacements$replacements2);
print_r($basket);
?>

Результат выполнения данного примера:

Array
(
    [0] => grape
    [1] => banana
    [2] => apple
    [3] => raspberry
    [4] => cherry
)

Смотрите также

  • array_replace_recursive() - Рекурсивно заменяет элементы первого массива элементами переданных массивов

Коментарии

a little enhancement to dyer85 at gmail dot com's function below: 
<?php
if (!function_exists('array_replace'))
{
  function 
array_replace( array &$array, array &$array1$filterEmpty=false )
  {
   
$args func_get_args();
   
$count func_num_args()-1;

    for (
$i 0$i $count; ++$i) {
      if (
is_array($args[$i])) {
        foreach (
$args[$i] as $key => $val) {
            if (
$filterEmpty && empty($val)) continue;
           
$array[$key] = $val;
        }
      }
      else {
       
trigger_error(
         
__FUNCTION__ '(): Argument #' . ($i+1) . ' is not an array',
         
E_USER_WARNING
       
);
        return 
NULL;
      }
    }

    return 
$array;
  }

?>

this will allow you to "tetris-like" merge arrays:

<?php

$a
= array(
   
=> "foo",
   
=> "",
   
=> "baz"
);
$b= array(
   
=> "",
   
=> "bar",
   
=> ""
);

print_r(array_replace($a,$btrue));

?>
results in: 
Array
(
    [0] => foo
    [1] => bar
    [2] => baz
)
2009-11-06 06:19:58
http://php5.kiev.ua/manual/ru/function.array-replace.html
To get exactly same result like in PHP 5.3, the foreach loop in your code should look like:

<?php
...
$count func_num_args();

for (
$i 1$i $count$i++) {
   ...
}
...
?>

Check on this code:

<?php
$base 
= array('id' => NULL'login' => NULL'credit' => NULL);
$arr1 = array('id' => 2'login' => NULL'credit' => 5);
$arr2 = array('id' => NULL'login' => 'john.doe''credit' => 100);
$result array_replace($base$arr1$arr2);

/*
correct output:

array(3) {
   "id" => NULL
   "login" => string(8) "john.doe"
   "credit" => int(100)
}

your output:

array(3) {
   "id" => int(2)
   "login" => NULL
   "credit" => int(5)
}
*/
?>

Function array_replace "replaces elements from passed arrays into the first array" -- this means replace from top-right to first, then from top-right - 1 to first, etc, etc...
2009-12-10 21:01:59
http://php5.kiev.ua/manual/ru/function.array-replace.html
I would like to add to my previous note about my polecat_array_replace function that if you want to add a single dimensional array to a multi, all you must do is pass the matching internal array key from the multi as the initial argument as such:

$array1 = array( "berries" => array( "strawberry" => array( "color" => "red", "food" => "desserts"), "dewberry" = array( "color" => "dark violet", "food" => "pies"), );

$array2 = array( "food" => "wine");

$array1["berries"]["dewberry"] = polecat_array_replace($array1["berries"]["dewberry"], $array2);
 
This is will replace the value for "food" for "dewberry" with "wine".

The function will also do the reverse and add a multi to a single dimensional array or even a 2 tier array to a 5 tier as long as the heirarchy tree is identical.

I hope this helps atleast one person for all that I've gained from this site.
2010-11-29 11:57:30
http://php5.kiev.ua/manual/ru/function.array-replace.html
I got hit with a noob mistake. :)

When the function was called more than once, it threw a function redeclare error of course.  The enviroment I was coding in never called it more than once but I caught it in testing and here is the fully working revision.  A simple logical step was all that was needed.

With PHP 5.3 still unstable for Debian Lenny at this time and not knowing if array_replace would work with multi-dimensional arrays, I wrote my own.  Since this site has helped me so much, I felt the need to return the favor. :) 

<?php
       
// Polecat's Multi-dimensional array_replace function
        // Will take all data in second array and apply to first array leaving any non-corresponding values untouched and intact 
       
function polecat_array_replace( array &$array1, array &$array2 ) {
           
// This sub function is the iterator that will loop back on itself ad infinitum till it runs out of array dimensions
           
if(!function_exists('tier_parse')){
                function 
tier_parse(array &$t_array1, array&$t_array2) {
                    foreach (
$t_array2 as $k2 => $v2) {
                        if (
is_array($t_array2[$k2])) {
                           
tier_parse($t_array1[$k2], $t_array2[$k2]);
                        } else {
                           
$t_array1[$k2] = $t_array2[$k2];
                        }
                    }
                    return 
$t_array1;
                }
            }
           
            foreach (
$array2 as $key => $val) {
                if (
is_array($array2[$key])) {
                   
tier_parse($array1[$key], $array2[$key]);
                } else {
                   
$array1[$key] = $array2[$key];
                }
            }
            return 
$array1;
        }
?>

[I would also like to note] that if you want to add a single dimensional array to a multi, all you must do is pass the matching internal array key from the multi as the initial argument as such:

<?php
$array1 
= array( "berries" => array( "strawberry" => array( "color" => "red""food" => "desserts"), "dewberry" = array( "color" => "dark violet""food" => "pies"), );

$array2 = array( "food" => "wine");

$array1["berries"]["dewberry"] = polecat_array_replace($array1["berries"]["dewberry"], $array2);
?>

This is will replace the value for "food" for "dewberry" with "wine".

The function will also do the reverse and add a multi to a single dimensional array or even a 2 tier array to a 5 tier as long as the heirarchy tree is identical.

I hope this helps atleast one person for all that I've gained from this site.
2010-11-29 12:02:51
http://php5.kiev.ua/manual/ru/function.array-replace.html
Instead of calling this function, it's often faster and simpler to do this instead:

<?php
$array_replaced 
$array2 $array1;
?>

If you need references to stay intact:

<?php
$array2 
+= $array1;
?>
2011-05-27 14:42:03
http://php5.kiev.ua/manual/ru/function.array-replace.html
Автор:
<?php
// we wanted the output of only selected array_keys from a big array from a csv-table
// with different order of keys, with optional suppressing of empty or unused values

$values = array
(
   
'Article'=>'24497',
   
'Type'=>'LED',
   
'Socket'=>'E27',
   
'Dimmable'=>'',
   
'Wattage'=>'10W'
);

$keys array_fill_keys(array('Article','Wattage','Dimmable','Type','Foobar'), ''); // wanted array with empty value

$allkeys array_replace($keysarray_intersect_key($values$keys));    // replace only the wanted keys

$notempty array_filter($allkeys'strlen'); // strlen used as the callback-function with 0==false

print '<pre>';
print_r($allkeys);
print_r($notempty);

/*
Array
(
    [Article] => 24497
    [Wattage] => 10W
    [Dimmable] => 
    [Type] => LED
    [Foobar] => 
)
Array
(
    [Article] => 24497
    [Wattage] => 10W
    [Type] => LED
)
*/
?>
2012-08-14 12:19:17
http://php5.kiev.ua/manual/ru/function.array-replace.html
In some cases you might have a structured array from the database and one
of its nodes goes like this;

<?php
# a random node structure
$arr    = array( 
   
'name'  => 'some name'
   
'key2'  => 'value2'
   
'title' => 'some title'
   
'key4'  => 4
   
'json'  => '[1,0,1,1,0]'
);

# capture these keys values into given order
$keys   = array( 'name''json''title' );
?>

Now consider that you want to capture $arr values from $keys.
Assuming that you have a limitation to display the content into given keys
order, i.e. use it with a vsprintf, you could use the following

<?php
# string to transform
$string "<p>name: %s, json: %s, title: %s</p>";

# flip keys once, we will use this twice
$keys   array_flip$keys );

# get values from $arr
$test   array_intersect_key$arr$keys );

# still not good enough
echo vsprintf$string$test );
// output --> name: some name, json: some title, title: [1,0,1,1,0]

# usage of array_replace to get exact order and save the day
$test   array_replace$keys$test );

# exact output
echo vsprintf$string$test );
// output --> name: some name, json: [1,0,1,1,0], title: some title

?>

I hope that this will save someone's time.
2013-04-10 20:05:52
http://php5.kiev.ua/manual/ru/function.array-replace.html
Simple function to replace array keys. Note you have to manually select wether existing keys will be overrided.
 
/**
  * @param array $array
  * @param array $replacements
  * @param boolean $override
  * @return array
  */
function array_replace_keys(array $array, array $replacements, $override = false) {
    foreach ($replacements as $old => $new) {
        if(is_int($new) || is_string($new)){
            if(array_key_exists($old, $array)){
                if(array_key_exists($new, $array) && $override === false){
                    continue;
                }
                $array[$new] = $array[$old];
                unset($array[$old]);
            }
        }
    }
    return $array;
}
2014-03-18 13:45:26
http://php5.kiev.ua/manual/ru/function.array-replace.html
Автор:
if(!function_exists('array_replace'))
{
  function array_replace()
  {
    $args = func_get_args();
    $num_args = func_num_args();
    $res = array();
    for($i=0; $i<$num_args; $i++)
    {
      if(is_array($args[$i]))
      {
        foreach($args[$i] as $key => $val)
        {
          $res[$key] = $val;
        }
      }
      else
      {
        trigger_error(__FUNCTION__ .'(): Argument #'.($i+1).' is not an array', E_USER_WARNING);
        return NULL;
      }
    }
    return $res;
  }
}
2014-06-15 16:08:11
http://php5.kiev.ua/manual/ru/function.array-replace.html
Автор:
If the arrays are associative (that is, their keys are strings), then I believe this function is identical to (the older) array_merge.
2014-10-15 16:40:53
http://php5.kiev.ua/manual/ru/function.array-replace.html
Автор:
The documentation is wrongly phrased: "array_replace() replaces the values of array1"  No replacing is done. A new array is created which looks like the one that would have resulted from the described replacement. 

If you want to augment the set of indices in an array, use 
       array_to_be_modified += array_with_indices_to_add;
2015-05-08 22:17:31
http://php5.kiev.ua/manual/ru/function.array-replace.html
You can also use:

<?php 
$myarray 
= [
"Orange",
"572" => "Banana",
"omg" => "Chili",
"nevermind" => "mango"
];

$myarray[0] = "NO-Orange"
$myarray["572"] = "BANANAPHONE!!!";
$myarray["omg"] = "NO-Chili";

print_r($myarray);

?>

RESULT:
Array
(
    [0] => NO-Orange
    [572] => BANANAPHONE!!!
    [omg] => NO-Chili
    [nevermind] => mango
)

with regards
2015-07-26 22:45:29
http://php5.kiev.ua/manual/ru/function.array-replace.html
Here is a simple array_replace_keys function:

/**
     * This function replaces the keys of an associate array by those supplied in the keys array
     *
     * @param $array target associative array in which the keys are intended to be replaced
     * @param $keys associate array where search key => replace by key, for replacing respective keys
     * @return  array with replaced keys
     */
    private function array_replace_keys($array, $keys)
    {
        foreach ($keys as $search => $replace) {
            if ( isset($array[$search])) {
                $array[$replace] = $array[$search];
                unset($array[$search]);
            }
        }

        return $array;
    }

// Test Drive

print_r(array_replace_keys(['one'=>'apple', 'two'=>'orange'], ['one'=>'ett', 'two'=>'tvo']);
// Output
array(
'ett'=>'apple',
'tvo'=>'orange'
)
2016-01-25 16:42:08
http://php5.kiev.ua/manual/ru/function.array-replace.html
If you work on some realy old server below PHP5 you can use array_merge like "necessary evil" to replace values in array:

Here is example how you can use this:

<?php
if(function_exists("array_replace") && version_compare(phpversion(), '5.3.0''>='))
       
$data array_replace($array1$array2); // (PHP 5 >= 5.3.0)
   
else
       
$data array_merge($array1$array2); // (PHP 5 < 5.3.0)
var_dump($data);
?>

This can also help someplugin developers to cover some old PHP versions.
2016-11-14 23:16:49
http://php5.kiev.ua/manual/ru/function.array-replace.html
Concerning the affirmation:
If you want to append array elements from the second array to the first array while not overwriting the elements from the first array and not re-indexing, use the + array union operator

Clearing the fact (it means ...):
If the first array have a key and a value it will not be overlap by the new array. therefore if you have an array like [1=>"alpha", 2=>"beta"] and you got a new array telling [1=>"Alpha", 3=>"Gamma"] the final array will be [1=>"alpha", 2=>"beta", 3=>"Gamma"]. The values of first array will not be modified in the result array.

So, if you are building a concatenation array where the values sometimes overlaps each other keys and you must preserve values you better use array_merge instead "plus" sign
2022-04-08 18:40:14
http://php5.kiev.ua/manual/ru/function.array-replace.html

    Поддержать сайт на родительском проекте КГБ