как сбросить пустые массивы в php? - PullRequest
1 голос
/ 22 марта 2012

У меня есть массив $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 ]

2 голосов
/ 22 марта 2012

array_filter() - это то, что вы ищете. Особенно рекурсивная версия. Следующее взято из комментария к 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 голосов
/ 22 марта 2012

Используйте php's 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 голос
/ 22 марта 2012
$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 или выше.

...