array_replace

(PHP 5 >= 5.3.0,PHP 7,PHP 8)

array_replace将传递数组中的元素替换到第一个数组中

说明

array_replace(数组 $array, 数组 ...$replacements): 数组

array_replace() 用每个后续数组中具有相同键的值替换 array 中的值。如果第一个数组中的键在第二个数组中存在,那么它的值将被第二个数组中的值替换。如果该键在第二个数组中存在而不在第一个数组中,它将在第一个数组中被创建。如果某个键只存在于第一个数组中,它将保留原样。如果传递多个数组进行替换,这些数组将按顺序进行处理,后面的数组将覆盖前面的值。

array_replace() 不是递归的:它将用第二个数组中的任何类型的值替换第一个数组中的值。

参数

数组

其中元素被替换掉的数组。

替换

元素将从中提取的数组。来自后面数组的值将覆盖前面的值。

返回值

返回一个 数组

示例

示例 1 array_replace() 示例

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

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

上面的示例将输出

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

另请参见

添加说明

用户贡献说明16 条说明

steelpandrummer
12 年前
<?php
// 我们希望从一个 csv 表中一个大数组中获得仅选择 array_keys 的输出
// 以不同的键顺序,并可以按需抑制空值或未使用值

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

$keys = array_fill_keys(array('Article','Wattage','Dimmable','Type','Foobar'), ''); // 想要的数组为空值

$allkeys = array_replace($keys, array_intersect_key($values, $keys)); // 仅替换想要的键

$notempty = array_filter($allkeys, 'strlen'); // strlen 用作回调函数,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
)
*/
?>
marvin_elia at web dot de
10 年前
替换数组键的简单函数。注意必须手动选择是要覆盖现有键。

/**
* @param array $array
* @param array $replacements
* @param boolean $override
* @return array
*/
函数 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;
}
mail at romansklenar dot cz
14 年前
如需在 PHP 5.3 中获得完全相同的结果,则代码中的 foreach 循环应如下所示

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

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

检查此代码

<?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);

/*
正确输出:

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

你的输出:

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

函数 array_replace “将传递数组中的元素替换到第一个数组中”——这意味着从右上开始替换到第一个,然后从右上 - 1 替换到第一个,等等...
ali dot sweden19 at yahoo dot com
8 年前
这是一个简单的 array_replace_keys 函数

/**
* 此函数用 keys 数组中指定的项替换关联数组中的键。

>
*
* @param $array 要用目标关联数组中应替换的键

>
* @param $keys 关联数组,替换各自键的搜索键 => replace by

>
* @return 具有替换键的数组

>
*/
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;
}

// 调试驱动

>

print_r(array_replace_keys(['one'=>'apple', 'two'=>'orange'], ['one'=>'ett', 'two'=>'tvo']);

>
// 输出

>
array(

>
'ett'=>'apple',

>
'tvo'=>'orange'

>
)
sun at drupal dot org

>
13 年前

>
替代调用此函数,通常采用以下方式更简单、更快速。

>

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

>
如果您需要确保引用保持完整性

>

<?php
$array2
+= $array1;
?>

>
polecat at p0lecat dot com

>
13 年前

>
我犯了一个菜鸟错误。 :)

>

当然,当多次调用此函数时,它会引发函数重复声明错误。我进行编码的环境中,永远不会多次调用它,但在测试中发现了它,因此特地对此进行全面修改。只需要一个简单的逻辑步骤。

>

目前 PHP 5.3 对 Debian Lenny 而言尚不稳定,不清楚 array_replace 是否适用于多维数组,因此,我自己编写了一个。此网站对我提供了很多帮助,因此,我需要予以回报。 :)

>

<?php
// Polecat的多维array_replace函数
// 将第二个数组中的所有数据应用到第一个数组,保持任何无对应值的原样
function polecat_array_replace( array &$array1, array &$array2 ) {
// 此子函数是一个迭代器,将无限循环直到用尽数组维度
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;
}
?>

[另外还要注意] 如果想将一维数组添加到多维数组,只需将多维数组中匹配的内部数组关键字作为初始参数传递,如下所示

<?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);
?>

这将用“wine”替换“dewberry”的“food”值。

此函数还将执行相反的操作,并将多维数组添加到单维数组或将两层数组添加到五层数组,只要层次结构树是相同的。

我希望这能为我从这个网站获得的所有知识至少帮助一个人。
gmastro77 at gmail dot com
11 年前
在某些情况下,你可能有一个来自数据库的结构化数组,其中
一个节点如下所示;

<?php
# 随机节点结构
$arr = array(
'name' => 'some name',
'key2' => 'value2',
'title' => 'some title',
'key4' => 4,
'json' => '[1,0,1,1,0]'
);

# 按给定顺序捕获这些键值
$keys = array( 'name', 'json', 'title' );
?>

现在考虑你要从 $keys 捕获 $arr 值。
假设你有一定限制,只能按给定的键
顺序显示内容,即与 vsprintf 一起使用,你可以使用以下代码

<?php
# 字符串进行转换
$string = "<p>name: %s, json: %s, title: %s</p>";

# 翻转键一次,我们将使用它两次
$keys = array_flip( $keys );

# 从 $arr 获取值
$test = array_intersect_key( $arr, $keys );

# 还是不够好
echo vsprintf( $string, $test );
// 输出 --> name: some name, json: some title, title: [1,0,1,1,0]

# 使用 array_replace 获取准确的顺序
$test = array_replace( $keys, $test );

# 准确的输出
echo vsprintf( $string, $test );
// 输出 --> name: some name, json: [1,0,1,1,0], title: some title

?>

我希望这可以节省大家的时间。
vlk dot charles at gmail dot com
3 个月前
我认为值得一提的是,作为第一个参数传递的数组不会被修改,它保持原样。返回一个新数组。我认为这个文档的措辞可以改进,因为它表明传递的数组*是*修改过的。

如果你想修改现有的数组,这样做是不够的

array_replace($arrayToModify, $arrayWithModifications);

你必须像这样将返回的值重新赋值给它

$arrayToModify = array_replace($arrayToModify, $arrayWithModifications);
lm713
9 年前
如果数组是关联的(即它们的键是字符串),那么我相信该函数与(旧的)array_merge 是相同的。
kyberprizrak
10 年前
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;
}
}
ricardophp yahoocombr
2 年前
关于肯定
如果你想将第二个数组中的数组元素追加到第一个数组中,但不会覆盖第一个数组中的元素,且不会重新索引,使用 + 数组联合操作符

澄清事实(也就是说...
如果第一个数组具有键和值,它将不会被新数组覆盖。因此,如果你有一个像 [1=>"alpha", 2=>"beta"] 这样的数组,并且你得到了一个新的数组,表示 [1=>"Alpha", 3=>"Gamma"],最终数组将为 [1=>"alpha", 2=>"beta", 3=>"Gamma"]。第一个数组的值在结果数组中不会修改。

因此,如果你正在构建一个串联数组,其中值有时会重叠彼此的键,并且你必须保留值,你最好使用 array_merge 而不是“加号”符号
projacore at gmail dot com
9 年前
你也可以使用

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

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

print_r($myarray);

?>

结果
数组
(
[0] => NO-Orange
[572] => BANANAPHONE!!!
[omg] => NO-Chili
[nevermind] => mango
)

此致敬礼
polecat at p0lecat dot com
13 年前

>
我想补充我关于 polecat_array_replace 函数的上一则说明,如果你想将一维数组添加到多维数组,你只需将与多维数组中的匹配内部数组键作为起始参数传递,如下所示

$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);

这将用“wine”替换“dewberry”的“food”值。

此函数还将执行相反的操作,并将多维数组添加到单维数组或将两层数组添加到五层数组,只要层次结构树是相同的。

我希望这能为我从这个网站获得的所有知识至少帮助一个人。
匿名者
9 年前
说明文件有误:“array_replace() 替换 array1 的值”。不会进行替换。所创建的新数组与执行所述替换后得到的数组类似。

如果您想扩充数组中的索引集,请使用
array_to_be_modified += array_with_indices_to_add;
tufan dot oezduman at googlemail dot com
14 年前
对 dyer85 at gmail dot com 以下函数的一点增强
<?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;
}
}
?>

这会让您可以“俄罗斯方块”式地合并数组

<?php

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

print_r(array_replace($a,$b, true));

?>
产生
数组
(
[0] => foo
[1] => bar
[2] => baz
)
ivijan dot stefan at gmail dot com
7 年以前
如果您在低于 PHP5 的某些非常旧的服务器上工作,可以使用 array_merge 作为“必要之恶”来替换数组中的值

以下是使用该方法的示例

<?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);
?>

这也可以帮助一些插件开发人员覆盖某些旧的 PHP 版本。
To Top