【问题标题】:Search and replace inside an associative array在关联数组中搜索和替换
【发布时间】:2011-10-31 20:10:06
【问题描述】:

我需要在关联数组中进行搜索和替换。

例如:

$user = "user1"; // I've updated this

$myarray = array("user1" => "search1", "user2" => "search2", "user3" => "search1" ) ;

我想用search4 替换search1。我怎样才能做到这一点?

更新:我忘了提到该数组有几个search1 值,我只想更改key is == $user 所在的值。很抱歉之前没有提到这一点。

【问题讨论】:

    标签: php arrays preg-replace associative-array replace


    【解决方案1】:
    $myarray = array("user1" => "search1", "user2" => "search2" );
    
    foreach($myarray as $key => $val)
    {
        if ($val == 'search1') $myarray[$key] = 'search4';
    }
    

    【讨论】:

    • 一个非常简单直接的解决方案
    • @Alfacinha:如果一个答案解决了你的问题,你应该点击它左边的复选标记来接受它,这样其他来这篇文章的人就会知道这是正确的解决方案。跨度>
    • Pro:这是每个 PHP 开发人员都熟悉的基本代码。缺点:它比用于此操作的函数 array_map() 慢。缺点:初始数组是就地编辑的,这有时很方便,但通常是不好的做法,特别是因为它很难在此代码上定义单元测试。
    【解决方案2】:

    有一个函数:array_map()。

    // Using a lamba function, PHP 5.3 required
    $newarray = array_map(
        function($v) { if ($v == 'search1') $v = 'search4'; return $v; },
        $myarray
    );
    

    如果您不想使用 lambda 函数,请定义一个普通函数或方法并对其进行回调。

    【讨论】:

      【解决方案3】:

      为什么不干呢

      if (isset($myarray[$user])) $myarray[$user] = 'search4';
      

      【讨论】:

      • 是的,我们倾向于把事情复杂化!
      【解决方案4】:
      $user = "user1";
      $myarray = array("user1" => "search1", "user2" => "search2", "user3" => "search1" );
      foreach($myarray as $key => $val)
      {
          if ($val == 'search1' and $key == $user )
          {
             $myarray[$key] = 'search4';
             break;
          }
      }
      print_r($myarray);
      

      打印:

      Array
      (
          [user1] => search4
          [user2] => search2
          [user3] => search1
      )
      

      【讨论】:

      • 确保在if 中添加break; 以在找到密钥后停止迭代。如果值已设置,则无需遍历整个数组。
      【解决方案5】:
      $originalArray = array( "user1" => "search1" , "user2" => "search2" );
      $pattern = 'search1';
      $replace = 'search4';
      
      $replacedArray = preg_replace( '/'.$pattern.'/' , $replace , $originalArray );
      

      修复了回复this solution的评论中提到的风险

      【讨论】:

        【解决方案6】:

        更新

        自从帖子更新后,我有机会睡一觉,我意识到我的回答很愚蠢。如果你有一个给定的键并且你需要改变它的值,为什么要遍历整个数组?

        $user    = 'user1';
        $search  = 'search1';
        $replace = 'search4';
        $array   = array('user1' => 'search1', 'user2' => 'search2');
        
        if (isset($array[$user]) && $search === $array[$user]) $array[$user] = $replace;
        

        类似于@Joseph 的方法(几乎相同),但有一些调整:

        $user = 'user1';
        $array = array("user1" => "search1", "user2" => "search2" );
        
        foreach($array as $key => &$value) {
            if ($key === $user) {
                $value = 'search4';
                break; // Stop iterating after key has been found
            }
        }
        

        通过引用传递是在foreach 内部编辑的更好方法,并且可以说更快。

        【讨论】:

          【解决方案7】:

          在关联数组或数值内搜索和替换 替换任意关联数组中的值,数组可以任意深

          function array_value_replace($maybe_array, $replace_from, $replace_to) {
          
              if (!empty($maybe_array)) {
                  if (is_array($maybe_array)) {
                      foreach ($maybe_array as $key => $value) {
                          $maybe_array[$key] = array_value_replace($value, $replace_from, $replace_to);
                      }
                  } else {
                      if(is_string($maybe_array)){
                          $maybe_array = str_replace($replace_from, $replace_to, $maybe_array);
                      }               
                  }
              }
          
              return $maybe_array;
          }
          

          【讨论】:

            【解决方案8】:

            如果你想要特定的键,那么你只需在前面的 ans 中添加键的条件。

            $user = "user1";
            $myarray = array("user1" => "search1", "user2" => "search2" );
            
            foreach($myarray as $key => $val)
            {
                if ($val == 'search1' && $key == $user) $myarray[$key] = 'search4';
            }
            

            【讨论】:

            • 感谢您提供此代码 sn-p,它可能会提供一些即时帮助。一个正确的解释would greatly improve 其教育价值通过展示为什么这是一个很好的解决问题的方法,并将使它对未来有类似但不相同的问题的读者更有用。请edit您的答案添加解释,并说明适用的限制和假设。
            【解决方案9】:

            使用 str_replace 应该可以工作:

            $myarray = array("user1" => "search1", "user2" => "search2" ) ;
            
            $newArray = str_replace('search1', 'search4', $myarray);
            

            【讨论】:

            • 这是危险代码。如果数组包含值“search12”,它将更改为“search42”。
            • 我实际上认为这是预期的结果 - 搜索和替换与值替换。也许我误解了这个问题。
            【解决方案10】:

            继约瑟夫的回答之后,使用preg_replace 可能使您能够在其他情况下使用该代码:

            function pregReplaceInArray($pattern,$replacement,$array) {
                foreach ($array as $key => $value) {
                    $array[$key] = preg_replace($pattern,$replacement,$value);
                }   
                return $array;
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-01-29
              • 2022-01-20
              • 1970-01-01
              • 1970-01-01
              • 2018-02-24
              • 2016-03-28
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多