2014-04-17 130 views
1

我有一个多维阵列如下PHP-聪明多维阵列滤波器

 
Array 
(
    [0] => Array 
     (
      [1] => val01 
      [2] => val02 
      [3] => 
     ) 

    [1] => Array 
     (
      [1] => val11 
      [2] => Array 
       (
        [sub1] => 1 
        [sub2] => 
        [sub3] => Array 
         (
          [primarysub1] => 
          [primarysub2] => pmy2 
         ) 

       ) 

      [3] => val3 
     ) 

    [2] => Array 
     (
      [1] => val21 
      [2] => 
      [3] => val23 
     ) 

) 

我需要过滤空值和期望的输出是如下。

 
Array 
(
    [0] => Array 
     (
      [1] => val01 
      [2] => val02 
     ) 

    [1] => Array 
     (
      [1] => val11 
      [2] => Array 
       (
        [sub1] => 1 
        [sub3] => Array 
         (
          [primarysub2] => pmy2 
         ) 

       ) 

      [3] => val3 
     ) 

    [2] => Array 
     (
      [1] => val21 
      [3] => val23 
     ) 

) 

有人可以帮我一个最好的方式使用PHP吗?
在此先感谢!

+0

'array_filter()'做的工作 – mutex36

+1

@Rotherford不,它不。它只适用于单个数组维度,它不会递归。 – Barmar

+0

您可以将下面的递归函数与它混合使用,尽管如此将其滤除 – Dave

回答

0

你必须为此使用递归函数。希望这可以帮助你

<?php 
$rs = unsetValues($arr); 

function unsetValues($a) 
{ 
    foreach($a as $k=>$v) 
    { 
     if(is_array($v)) 
     { 
      $arr2[$k] = unsetValues($v); 
     } else { 
      if($v!="") 
      $arr2[$k] = $v; 
     } 
    } 
    return $arr2; 
} 
?> 
0
function filter($input, $callback = null) 
{ 
    foreach ($input as &$value) 
    { 
     if (is_array($value)) 
     { 
      $value = filter($value, $callback); 
     } 
    } 

    return array_filter($input, $callback); 
} 

function remove_empty($val) 
{ 
    return !empty($val); 
} 

$test_arr = array(
    0 => array(1 => "val01", 2 => "val02", 3 => ""), 
    1 => array(1 => "val11", 2 => array("sub1" => 1, "sub2" => "", "sub3" => array("primarysub1" => "", "primarysub2" => "pmy2")), 3 => "val3"), 
    2 => array(1 => "val21", 2 => "", 3 => "val23") 
); 

echo '<pre>' . print_r($test_arr, true) . '</pre>'; 

// filter empty 
$result = filter($test_arr, remove_empty); 

echo '<pre>' . print_r($result, true) . '</pre>';