如何根据PHP中的值替换映射替换数组值?

时间:2015-07-30 08:44:40

标签: php arrays

假设我有一个数组:

$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

4 个答案:

答案 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',
)