【问题标题】:Recursively remove element by value按值递归删除元素
【发布时间】:2014-08-17 18:49:30
【问题描述】:

所以我有以下数组:

$array = array(array('fruit1' => 'apple'), 
               array('fruit2' => 'orange'), 
               array('veg1' => 'tomato'), 
               array('veg2' => 'carrot'));

我想运行这样的函数:

array_remove_recursive($array, 'tomato');

所以输出是这样的:

$array = array(array('fruit1' => 'apple'), 
               array('fruit2' => 'orange'), 
               array('veg2' => 'carrot')); // note: the entire array containing tomato has been removed!

这可以解决吗?

【问题讨论】:

标签: php arrays recursion


【解决方案1】:

这将递归地取消设置任何深度的匹配变量,然后仅在父元素为空时删除它。

function recursive_unset(array &$array, $unwanted_val) {
    foreach ($array as $key => &$value) {
        if (is_array($value)) {
            recursive_unset($value, $unwanted_val);
            if(!count($value)){
                unset($array[$key]);
            }
        } else if($value == $unwanted_val){
            unset($array[$key]);
        }
    }
}

【讨论】:

    【解决方案2】:

    从多维数组中递归删除多个值的函数。

    # Example 1
    $arr1 = array_remove_recursive($arr, 'tomato');
    
    # Example 2
    $arr2 = array_remove_recursive($arr, ['tomato', 'apple']);
    
    function array_remove_recursive($arr, $values)
    {
        if (!is_array($values))
            $values = [$values];
    
        foreach ($arr as $k => $v) {
            if (is_array($v)) {
                if ($arr2 = array_remove_recursive($v, $values))
                    $arr[$k] = $arr2;
                else
                    unset($arr[$k]);
            } elseif (in_array($v, $values, true))
                unset($arr[$k]);
        }
        return $arr;
    }
    

    【讨论】:

      【解决方案3】:
      function array_remove_recursive($getArray,$getAssocValue)
      {
          $returnArray    = array();
          if(is_array($getArray))
          {
              foreach($getArray as $indAssocValue)
              {
                  if(is_array($indAssocValue))
                  {
                      foreach($indAssocValue as $innerKey=>$innerVal)
                      {
                          if($innerVal!=$getAssocValue and $innerKey!="")
                          {
                              $returnArray[]  = array("$innerKey"=>$innerVal);
                          }
                      }
                  }
              }
          }
          return $returnArray;
      }
      
      $array = array(array('fruit1' => 'apple'), 
                     array('fruit2' => 'orange'), 
                     array('veg1' => 'tomato'), 
                     array('veg2' => 'carrot'));
                     print_r($array);
                     echo "<br />";
      $array  = array_remove_recursive($array, 'tomato');
      print_r($array);
      

      希望上面的代码会有所帮助。

      【讨论】:

      • 这不是递归函数,它不会再深2层
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      • 2014-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      相关资源
      最近更新 更多