2024年PHP开发者大会(日本)

array_replace

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

array_replace用传入的数组替换第一个数组中的元素

描述

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

array_replace() 创建一个新数组,并为每个提供的数组中的每个键分配项。如果一个键出现在多个输入数组中,则使用最右边的输入数组中的值。

array_replace() 不会递归处理元素项,在进行替换时会替换每个键的整个值。

参数

array

要替换元素的数组。

replacements

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

返回值

返回一个 数组

示例

示例 #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);
var_dump($basket);
?>

以上示例将输出

array(5) {
  [0]=>
  string(5) "grape"
  [1]=>
  string(6) "banana"
  [2]=>
  string(5) "apple"
  [3]=>
  string(9) "raspberry"
  [4]=>
  string(6) "cherry"
}

示例 #2 如何处理嵌套数组的示例

<?php
$base
= [ 'citrus' => [ 'orange', 'lemon' ], 'pome' => [ 'apple' ] ];
$replacements = [ 'citrus' => [ 'grapefruit' ] ];
$replacements2 = [ 'citrus' => [ 'kumquat', 'citron' ], 'pome' => [ 'loquat' ] ];

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

以上示例将输出

array(2) {
  ["citrus"]=>
  array(2) {
    [0]=>
    string(7) "kumquat"
    [1]=>
    string(6) "citron"
  }
  ["pome"]=>
  array(1) {
    [0]=>
    string(6) "loquat"
  }
}

参见

添加笔记

用户贡献笔记 14条笔记

28
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
)
*/
?>
7
marvin_elia at web dot de
10年前
替换数组键的简单函数。请注意,您必须手动选择是否覆盖现有键。

/**
* @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;
}
3
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到第一个,以此类推……
3
[email protected]
8年前
这是一个简单的 `array_replace_keys` 函数

/**
* 此函数用 `keys` 数组中提供的键替换关联数组的键
*
* @param $array 目标关联数组,其键将被替换
* @param $keys 关联数组,其中搜索键 => 替换为键,用于替换相应的键
* @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'
)
3
[email protected]
13年前
与其调用此函数,通常更快更简单的做法是:

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

如果需要保持引用不变

<?php
$array2
+= $array1;
?>
2
[email protected]
14年前
我犯了一个新手错误。 :)

当函数被多次调用时,它当然会抛出一个函数重声明错误。我编码的环境从未多次调用它,但我在测试中捕获到了它,这里有完全可用的修订版。只需要一个简单的逻辑步骤。

由于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”的值。

此函数也能反过来做,将多维数组添加到一维数组中,甚至将二维数组添加到五维数组中,只要层级结构相同。

我希望这对至少一个人有所帮助,因为我从这个网站上获得了这么多。
2
[email protected]
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

?>

我希望这能节省一些人的时间。
1
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__ .'(): 参数 #'.($i+1).' 不是数组', E_USER_WARNING);
return NULL;
}
}
return $res;
}
}
0
vlk dot charles at gmail dot com
7 个月前
我认为值得一提的是,作为第一个参数传入的数组不会被修改,保持不变。函数会返回一个新的数组。我认为这段文档的措辞可以改进,因为它暗示传入的数组*会被*修改。

如果要修改现有的数组,仅仅这样做是不够的:

array_replace($arrayToModify, $arrayWithModifications);

你必须将返回值重新赋值给它,如下所示:

$arrayToModify = array_replace($arrayToModify, $arrayWithModifications);
0
lm713
10年前
如果数组是关联数组(即键是字符串),那么我相信此函数与(较旧的)array_merge 函数相同。
-2
ricardophp yahoocombr
2 年前
关于断言:
如果你想将第二个数组的数组元素追加到第一个数组,而不覆盖第一个数组的元素并且不重新索引,请使用 + 数组联合运算符。

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

因此,如果你正在构建一个连接数组,其中值有时会重叠彼此的键,并且你必须保留值,最好使用 array_merge 而不是“加号”。
-1
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
)

此致
-1
polecat at p0lecat dot com
14年前
我想补充一下我之前关于我的 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”的值。

此函数也能反过来做,将多维数组添加到一维数组中,甚至将二维数组添加到五维数组中,只要层级结构相同。

我希望这对至少一个人有所帮助,因为我从这个网站上获得了这么多。
-2
匿名
9 年前
文档措辞错误:“array_replace() 替换 array1 的值” 没有进行替换。创建了一个新的数组,它看起来像根据所描述的替换结果产生的数组。

如果要增加数组中的索引集,请使用:
array_to_be_modified += array_with_indices_to_add;
To Top