如何在php中取消空数组?

时间:2012-03-22 04:22:31

标签: php arrays multidimensional-array unset

我有一个数组的$mainArray数组,我想删除/取消设置没有值的密钥的数组。

这是我的数组:

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数组。

离开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
        )
)

关于如何进行的任何想法?

感谢。

3 个答案:

答案 0 :(得分: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 :(得分: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;
}

答案 2 :(得分: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或更高版本。