2012-03-22 60 views
1

我有一个阵列$mainArray阵列,我想删除/ undset阵列,没有价值的密钥。如何在php中取消设置空数组?

这里是我的数组:

Array 
(
[0] => Array 
    (
     [msg_id] => 203 
     [comment] => Array 
      (
       [0] => Array 
        (
         [com_id] => 
        ) 
      ) 
    ) 
[1] => Array 
    (
     [msg_id] => 202 
     [comment] => Array 
      (
       [0] => Array 
        (
         [com_id] => 196 
        ) 
       [1] => Array 
        (
         [com_id] => 197 
        ) 
       [2] => Array 
        (
         [com_id] => 
        ) 
      ) 
    ) 
[2] => Array 
    (
     [msg_id] => 201 
     [comment] => Array 
      (
       [0] => Array 
        (
         [com_id] => 198 
        ) 
       [1] => Array 
        (
         [com_id] => 
        ) 
      ) 
    ) 
) 

在这种情况下,我想看看里面comment阵列阵列,看看是否有任何人有空值。如果所有的子阵列都是空的,最好的情况是完全删除comment阵列。

与离开螺母的IM comment嘿只是空

此阵应成为:

Array 
(
    [0] => Array 
     (
      [msg_id] => 203 
     ) 
    [1] => Array 
     (
      [msg_id] => 202 
      [comment] => Array 
       (
        [0] => Array 
         (
          [com_id] => 196 
         ) 
        [1] => Array 
         (
          [com_id] => 197 
         ) 
       ) 
     ) 
    [2] => Array 
     (
      [msg_id] => 201 
     ) 
) 

对如何进行任何想法?

谢谢。

回答

1
$array = array_map(function ($i) { 
    $i['comment'] = array_filter($i['comment'], function ($c) { return $c['com_id']; }); 
    return array_filter($i); 
}, $array); 

需要PHP 5.3或更高。

2

使用php的unset()取消设置任何数组键/值。

此链接http://in3.php.net/unset

在你的情况下,代码就可以了,(我没有测试它。但让我知道如果你有任何问题,我可以修复它)

function unsetCommentFromArray($mainArray) { 
    foreach($mainArray as $key => $value) { 
     foreach($value['comment'] as $k => $v) { 
      if(empty($v['com_id'])) { 
       unset($mainArray[$key]['comment'][$k]); 
      } 
     } 
    } 
    return $mainArray; 
} 
+1

+1首先使用特定的解决方案。 – 2012-03-22 05:14:00

2
的更多信息

array_filter()是你所追求的。特别是递归版本。以下内容取自a comment on the PHP Doc:。

function array_filter_recursive($array, $callback = null) { 
    foreach ($array as $key => & $value) { 
     if (is_array($value)) { 
      $value = array_filter_recursive($value, $callback); 
     } 
     else { 
      if (! is_null($callback)) { 
       if (! $callback($value)) { 
        unset($array[$key]); 
       } 
      } 
      else { 
       if (! (bool) $value) { 
        unset($array[$key]); 
       } 
      } 
     } 
    } 
    unset($value); 

    return $array; 
}