【问题标题】:search and replace value in PHP array在 PHP 数组中搜索和替换值
【发布时间】: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,实际上,两者都是 :) 现在是需要的,但对于其他用途,它可能会成为一个缺陷 :)

标签: php arrays replace


【解决方案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);
            

            【讨论】:

              猜你喜欢
              • 2012-08-22
              • 1970-01-01
              • 2012-10-24
              • 2010-11-07
              • 1970-01-01
              • 2011-10-31
              • 2020-08-20
              • 2014-09-19
              • 2013-01-21
              相关资源
              最近更新 更多