假设我有一个数组:
$origin = ['value1', 'value2', 'value3', 'value4'];
和替换地图数组:
$replace_map = [
'value1' => 'replace1',
'value2' => 'replace2',
'value8' => 'replace8',
];
我想替换$origin
数组并期望结果为:
$result = myReplace($origin, $replace_map);
$result = ['replace1', 'replace2', 'value3', 'value4'];
我可以循环$origin
以及$replace_map
的每个项目查找array_key_exists
,并将其替换为$replace_map
中的值,
但我认为这不是最好的方式,听起来效率不高。
有更好的方法吗?
此外,如果原点值都是整数,但有些是负数,但地图数组中的键都是正数,
喜欢:
$origin = [-12345, 23456];
$map = [12345 => 98765];
还需要将-12345
更改为-98765
。
答案 0 :(得分:3)
str_replace可以处理搜索和替换参数的数组。
试试这段代码:
<?php
$origin = ['value1', 'value2', 'value3', 'value4'];
print_r($origin);
$search = ['value1', 'value2', 'value8'];
$replace = ['replace1', 'replace2', 'replace8'];
$result = str_replace($search, $replace, $origin);
print_r($result);
输出
Array
(
[0] => value1
[1] => value2
[2] => value3
[3] => value4
)
Array
(
[0] => replace1
[1] => replace2
[2] => value3
[3] => value4
)
此外,str_replace将元素作为字符串处理,因此,整数也将被替换。部分匹配也将被替换,例如:
echo str_replace(2, 5, -200);
将导致-500。
答案 1 :(得分:2)
您可以使用array_map在每个数组值上运行str_replace,如下所示:
$origin = ['value1', 'value2', 'value3', 'value4'];
$result = array_map('myReplace', $origin);
echo '<pre>' . print_r($result, true) . '</pre>';
function myReplace($value) {
$replace_map = [
'value1' => 'replace1',
'value2' => 'replace2',
'value8' => 'replace8',
];
return str_replace(array_keys($replace_map), array_values($replace_map), $value);
}
或者对于较新版本的PHP,您可以使用anonymous function
$replace_map = [
'value1' => 'replace1',
'value2' => 'replace2',
'value8' => 'replace8',
];
$origin = ['value1', 'value2', 'value3', 'value4'];
$result = array_map(function($value) use ($replace_map) {
return str_replace(array_keys($replace_map), array_values($replace_map), $value);
}, $origin);
echo '<pre>' . print_r($result, true) . '</pre>';
答案 2 :(得分:1)
$origin = ['value1', 'value2', 'value3', '-2'];
$replace_map = [
'value1' => 'replace1',
'value2' => 'replace2',
'value8' => 'replace8',
2 => 77
];
$new = array_map(function($i) use($replace_map) {
return preg_replace_callback('/^(-)*(.+)$/',
function($m) use($replace_map) {
if(!isset($replace_map[$m[2]]))
return($m[0]);
return $m[1] . $replace_map[$m[2]];
},$i);
}, $origin);
print_r($new);
结果
Array
(
[0] => replace1
[1] => replace2
[2] => value3
[3] => -77
)
答案 3 :(得分:0)
我认为@splash58 无法解释的答案还有很大的改进空间。 preg_replace_callback()
可以接收数组类型数据作为其第三个参数,因此 array_map()
包装器不是必需的。内部工作也可以简化。
使用 str_replace()
的其他答案不可信,因为它们会进行部分替换。 @Alexander 在他的回答中承认了这一点,但 JamieBicknell 在评论中承认了这一点。 @JamieBicknell's replaces multiple partial matches
由于不应替换前导负号,因此我们将其设为不替换的可选匹配项。
代码:(Demo)
$origin = ['value1', 'value2', 'value3', '-2', '2', '22'];
$replace_map = [
'value1' => 'replace1',
'value2' => 'replace2',
'value8' => 'replace8',
2 => 77
];
var_export(
preg_replace_callback(
'~^-?\K.*$~',
function($m) use($replace_map) {
return $replace_map[$m[0]] ?? $m[0];
},
$origin
)
);
如果您使用的是 PHP7.4 或更高版本,可以使用箭头函数语法使语法更简洁。
var_export(
preg_replace_callback('~^-?\K.*$~', fn($m)=> $replace_map[$m[0]] ?? $m[0], $origin)
);
输出(来自两个片段):
array (
0 => 'replace1',
1 => 'replace2',
2 => 'value3',
3 => '-77',
4 => '77',
5 => '22',
)