从PHP数组中递归删除empty和null值

时间:2015-02-18 05:45:36

标签: php arrays recursion

我有一个像这样的数组

$a = array(
  'b' => array(
    'two' => false,
    'three' => '',
    'four' => null,
    'five' => array(
       'fp' => null,
       'kp' => null
    ),
    'six' => array()
  ),
  'c' => '  ',
  'd' => null
);

我想从此n级数组中仅删除nullempty个键。最后我应该得到这个:

$a = array(
  'b' => array(
    'two' => false
  ),
  'c' => '  '
);

我有这个功能

public function ArrayCleaner($input) { 
  foreach ($input as &$value) { 
    if (is_array($value)) { 
      $value = ArrayCleaner($value); 
    }
  }
  return array_filter($input); 
}

但是,正如array_filter所述,它还将删除false值键(我想要保留)。那么我应该在功能上做出哪些改变来达到预期的效果呢?

2 个答案:

答案 0 :(得分:1)

你很接近,只需通过提供用于过滤的回调函数来改变你的代码,如下所示:

function ArrayCleaner($input) { 
  foreach ($input as &$value) { 
    if (is_array($value)) { 
      $value = ArrayCleaner($value); 
    }
  }

  return array_filter($input, function($item){
    return $item !== null && $item !== '';
  }); 
}

答案 1 :(得分:0)

function ArrayCleaner($input) { 
  foreach ($input as $key=>&$value) { 
     if(is_int($key)){  
        unset($input[$key]);
        continue;
     }
    if (is_array($value)) { 
       $value = ArrayCleaner($value); 
    }
  }

  return array_filter($input, function($item){
    return $item !== null && $item !== '';
  }); 
}

但问题:空键是什么意思? '一个'表示其索引为数字0.因此,如果我们使用is_int($key)之类的内容对其进行过滤,那么如何处理'2'=>'this data?'?它将在php Array中转换为int(2)。