在 PHP 数组中搜索和替换值

Posted

技术标签:

【中文标题】在 PHP 数组中搜索和替换值【英文标题】:search and replace value in PHP array 【发布时间】:2012-01-29 22:17:00 【问题描述】:

我一直在寻找一些标准的 php 函数来将数组的某些值替换为其他值,但令人惊讶的是我没有找到任何值,所以我必须自己编写:

function array_replace_value(&$ar, $value, $replacement)

    if (($key = array_search($ar, $value)) !== FALSE) 
        $ar[$key] = $replacement;
    

但我仍然想知道 - 这么简单的东西肯定已经有一些功能了!或者也许比我发明的这个更简单的解决方案?

请注意,此功能只会进行一次替换。我正在寻找类似替换单个事件以及替换所有事件的现有解决方案。

【问题讨论】:

注意数组是按值传递的。您要么需要从函数返回新数组(与 array_* 的其余函数的行为相匹配),要么通过引用使 array_replace_value 采用 $ar str_replace() 接受数组,但您不能将其限制为一个替换。 谢谢@outis,我自己在调试过程中意识到了这一点:) @Tomas:当您注意到该函数仅执行一次替换时,您是在指出缺陷还是在指出所需的行为? @outis,实际上,两者都是 :) 现在是需要的,但对于其他用途,它可能会成为一个缺陷 :) 【参考方案1】:

不是只替换数组中出现的一个值的函数,而是更通用的array_map

array_map(function ($v) use ($value, $replacement) 
    return $v == $value ? $replacement : $v;
, $arr);

使用值数组替换多次出现的多个值 => 替换:

array_map(function ($v) use ($replacement) 
    return isset($replacement[$v]) ? $replacement[$v] : $v;
, $arr);

要替换一个值的单个匹配项,您可以使用array_search。由于实现如此之短,PHP 开发人员没有太多理由创建标准函数来执行任务。并不是说创建这样的函数没有意义,如果你发现自己经常需要它。

【讨论】:

+1。感谢 outis 的好答案,我不知道这种语法,但是使用地图和自定义代码是一个强大的工具 - 可能效率低下?我更喜欢 Raghav 之类的“硬编码”解决方案。 @Tomas:您指的是anonymous functions 和闭包的语法吗?除了附加的“use”说明符之外,这比语法更具语义。至于效率,如果有影响,则可以忽略不计(除非您在每个请求中对可能数千个数组执行替换)。影响性能的一个因素是每次调用array_* 函数都会创建一个额外的数组作为其结果:这里一个,Raghav 的三个。与往常一样,分析是确定性能的最佳方式。 ... 请注意,Raghav 没有任何硬编码的东西,因为它们都具有相同的参数化值(数组、要替换的值和替换值)。硬编码很少能带来明显的性能优势,因为变量查找的成本很小。 感谢 outis 的回答......但最后我很幸运地使用了 Raghav 的解决方案,原因有一个:我们的托管服务提供商的服务器仍在运行 PHP 5.2,所以我不得不从其中删除所有匿名函数我的代码...(我是在 PHP 5.3 上开发的,所以有点“背叛”...) @Tomas:我感受到了你的痛苦。对闭包的支持使 PHP 可以忍受。【参考方案2】:

虽然没有与示例代码等效的功能,但您可以使用array_keys(带有可选的搜索值参数)、array_fillarray_replace 来实现相同的目的:

由 Tomas 编辑:代码不起作用,已更正:

$ar = array_replace($ar,
    array_fill_keys(
        array_keys($ar, $value),
        $replacement
    )
);

【讨论】:

array_replace() 不是假设您已经知道密钥吗? OP 正在寻找按值搜索和替换。 array_replace 替换为键,而不是值。 @RaghavBhushan:如果你有钥匙,你就不需要array_replace @RaghavBhushan:(关于您的原始文章)<br/> 不是semantic。此外,您在 SO 上不需要它。 @RaghavBhushan:Tomas 的函数已经使用 array_search 来查找要替换的单个项目,并且该答案的第一部分已经涵盖了 array_replace【参考方案3】:

如果性能是一个问题,可以考虑不在array_map() 中创建多个函数。注意isset() 非常快,而且这个解决方案根本不调用任何其他函数。

$replacements = array(
    'search1' => 'replace1',
    'search2' => 'replace2',
    'search3' => 'replace3'
);
foreach ($a as $key => $value) 
    if (isset($replacements[$value])) 
        $a[$key] = $replacements[$value];
    

【讨论】:

【参考方案4】:

试试这个功能。

public function recursive_array_replace ($find, $replace, $array) 
    if (!is_array($array)) 
        return str_replace($find, $replace, $array);
    

    $newArray = [];
    foreach ($array as $key => $value) 
        $newArray[$key] = recursive_array_replace($find, $replace, $value);
    
    return $newArray;

干杯!

【讨论】:

【参考方案5】:

根据您要查找和替换的值、键或两者,您可以执行以下操作:

$array = json_decode( str_replace( $replace, $with, json_encode( $array ) ), true );

我并不是说这是最高效或最优雅的,而是最好最简单的。

【讨论】:

【参考方案6】:

$ar[array_search('green', $ar)] = 'value';

【讨论】:

你能在你的代码中添加一些解释吗?如果array_search 返回 false 怎么办? 我不建议研究人员使用这种不稳定且无法解释的sn-p。【参考方案7】:

array_walk() 有回调呢?

$array = ['*pasta', 'cola', 'pizza'];
$search = '*';
$replace = '\*';
array_walk($array,
    function (&$v) use ($search, $replace)
        $v = str_replace($search, $replace, $v);    
                                                                         
);  
print_r($array);

【讨论】:

【参考方案8】:

根据Deept Raghav 的回答,我创建了以下解决方案来进行正则表达式搜索。

$arr = [
    'Array Element 1',
    'Array Element 2',
    'Replace Me',
    'Array Element 4',
];

$arr = array_replace(
    $arr,
    array_fill_keys(
        array_keys(
            preg_grep('/^Replace/', $arr)
        ),
        'Array Element 3'
    )
);

echo '<pre>', var_export($arr), '</pre>';

PhpFiddle:http://phpfiddle.org/lite/code/un7u-j1pt

【讨论】:

【参考方案9】:
 <b>$green_key = array_search('green', $input); // returns the first key whose value is 'green'

$input[$green_key] = '苹果'; // 将 'green' 替换为 'apple'

【讨论】:

这基本上是 Tomas 所拥有的,但这并不能处理数组中不存在值的情况。【参考方案10】:

PHP 8,将一个字符串值替换为另一个字符串值的严格版本:

array_map(static fn (string $value): string => $value === $find ? $replace : $value, $array); 

示例 - 将值 foo 替换为 bar

array_map(static fn (string $value): string => $value === 'foo' ? 'bar' : $value, $array);

【讨论】:

以上是关于在 PHP 数组中搜索和替换值的主要内容,如果未能解决你的问题,请参考以下文章

当第二个存储在 php 中时,数组值被替换

PHP:替换数组值不会在 foreach 循环后保留

如何在 PHP 中搜索数组中的多个值?

php 中 判断数组中是不是有值

PHP使用字符串替换从多维数组中的键值替换关键字

如何在 php 的数组中替换特定键的值?