【问题标题】:Replace non-specified array values with 0用 0 替换未指定的数组值
【发布时间】:2022-02-07 20:43:30
【问题描述】:

我想用 0 替换除 workhome 之外的所有数组值。

输入:

$array = ['work', 'homework', 'home', 'sky', 'door']

我的编码尝试:

$a = str_replace("work", "0", $array);

预期输出:

['work', 0, 'home', 0, 0]

另外我的输入数据来自用户提交,数组元素的数量可能非常大。

【问题讨论】:

    标签: php arrays replace blacklist


    【解决方案1】:

    更优雅、更短的解决方案。

    $aArray = array('work','home','sky','door');   
    
    foreach($aArray as &$sValue)
    {
         if ( $sValue!='work' && $sValue!='home' ) $sValue=0;
    }
    

    & 运算符是指向数组中特定原始字符串的指针。 (而不是该字符串的副本) 您可以通过这种方式为数组中的字符串分配一个新值。唯一不能做的是任何可能扰乱数组顺序的事情,例如 unset() 或键操作。

    上面示例的结果数组将是

    $aArray = array('work','home', 0, 0)
    

    【讨论】:

      【解决方案2】:

      一个循环会多次执行一系列动作。因此,对于数组中的每个元素,您将检查它是否等于您要更改的元素,如果是,请更改它。还要确保在字符串周围加上引号

      //Setup the array of string
      $asting = array('work','home','sky','door')
      
      /**
      Loop over the array of strings with a counter $i,
      Continue doing this until it hits the last element in the array
      which will be at count($asting)
      */
      for($i = 0; $i < count($asting);$i++){
         //Check if the value at the 'ith' element in the array is the one you want to change
        //if it is, set the ith element to 0
          if ($asting[$i] == 'work' || $asting[$i] == 'home')
             $asting[$i] = 0;
      }
      

      以下是一些建议阅读:

      http://www.php.net/manual/en/language.types.array.php

      http://www.php.net/manual/en/language.control-structures.php

      但是,如果您在循环等方面遇到困难,您可能需要阅读一些介绍性编程材料。这应该可以帮助您真正了解正在发生的事情。

      【讨论】:

      • 你想做$asting[$i] = 0;
      • 有什么方法可以在没有循环的情况下完成这项任务?聪明的方式?
      【解决方案3】:

      另一种更快的方法,但确实需要一个循环:

      //Setup the array of string
          $asting = array('bar', 'market', 'work', 'home', 'sky', 'door');
      
      //Setup the array of replacings
          $replace = array('home', 'work');
      
      //Loop them through str_replace() replacing with 0 or any other value...
          foreach ($replace as $val) $asting = str_replace($val, 0, $asting);
      
      //See what results brings:    
          print_r ($asting);
      

      将输出:

      Array
      (
          [0] => bar
          [1] => market
          [2] => 0
          [3] => 0
          [4] => sky
          [5] => door
      )
      

      【讨论】:

      • 不会在每个字符串中进行 str_replace 搜索吗?所以它也会用 0 代替“努力工作”和“寄宿家庭”。
      【解决方案4】:

      使用 array_map 的替代方法:

      $original = array('work','home','sky','door');
      
      $mapped = array_map(function($i){
          $exclude = array('work','home');
          return in_array($i, $exclude) ? 0 : $i; 
      }, $original);
      

      【讨论】:

        【解决方案5】:

        你可以试试array_walk函数:

        function zeros(&$value) 
        { 
            if ($value != 'home' && $value != 'work'){$value = 0;}      
        }   
        
         $asting = array('work','home','sky','door','march');   
        
         array_walk($asting, 'zeros');
         print_r($asting);
        

        【讨论】:

          【解决方案6】:

          你也可以在 str_replace 上将数组作为参数 1 和 2...

          【讨论】:

          • 我的数组如何从提交的表单中添加,但我想将值替换为 0,仅排除工作和家庭?
          【解决方案7】:

          只是 for 循环的一个小点。许多人没有意识到每次新的迭代都会完成第二个比较任务。因此,如果是大数组或计算的情况,您可以通过以下方式优化循环:

          for ($i = 0, $c = count($asting); $i < $c; $i++) {...}
          

          您可能还想查看 http://php.net/manual/en/function.array-replace.php 的原始问题,除非代码确实是最终的 :)

          【讨论】:

          • 但是 array_replace 寻找“具有相同键的值”
          【解决方案8】:

          试试这个

          $your_array = array('work','home','sky','door');
          $rep = array('home', 'work');
          foreach($rep as $key=>$val){
               $key = array_search($val, $your_array);
               $your_array[$key] = 0;
          }
          print_r($your_array);
          

          【讨论】:

          • 研究人员为什么要“试试这个”?为什么你在foreach() 中声明$key 然后在下一行立即覆盖它?如果在$your_array 中找不到$val 怎么办? ... array_search() 将返回 false 并且 false 将转换为 0 并替换 $your_array 中的第一个元素,无论其值是什么。我认为说“不要尝试这个”会更准确。
          【解决方案9】:

          此页面上有一些技术可以实现零迭代函数调用——这在性能方面非常好。为了获得最佳可维护性,我建议将目标字符串列表分隔为查找数组。通过引用修改原始数组值,您可以快速替换整个字符串并将非目标值合并为0。

          代码:(Demo)

          $array = ['work', 'homework', 'home', 'sky', 'door'];
          
          $keep = ['work', 'home'];
          $lookup = array_combine($keep, $keep);
          
          foreach ($array as &$v) {
              $v = $lookup[$v] ?? 0;
          }
          
          var_export($array);
          

          输出:

          array (
            0 => 'work',
            1 => 0,
            2 => 'home',
            3 => 0,
            4 => 0,
          )
          

          您只需扩展 $keep 即可非常轻松、干净地扩展目标字符串列表。


          如果您不想要经典循环,您可以使用相同的技术而不修改原始数组。 (Demo)

          var_export(
              array_map(fn($v) => $lookup[$v] ?? 0, $array)
          );
          

          【讨论】:

            【解决方案10】:

            这是我的最终代码

            //Setup the array of string
            $asting = array('work','home','sky','door','march');
            
            /**
            Loop over the array of strings with a counter $i,
            Continue doing this until it hits the last element in the array
            which will be at count($asting)
            */
            for($i = 0; $i < count($asting); $i++) {
            //Check if the value at the 'ith' element in the array is the one you want to change
            //if it is, set the ith element to 0
            if ($asting[$i] == 'work') {
               $asting[$i] = 20;
            } elseif($asting[$i] == 'home'){
                $asting[$i] = 30;
            
            }else{
                $asting[$i] = 0;
            }
            
            echo $asting[$i]."<br><br>";
            
            $total += $asting[$i];
            }
            
            echo $total;
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-05-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-09-25
              • 2017-11-08
              • 2016-10-26
              • 1970-01-01
              相关资源
              最近更新 更多