如何从PHP中的多维数组中删除空值?

时间:2012-04-18 17:18:02

标签: php string multidimensional-array filtering isnullorempty

我一直在寻找很多答案,但他们都没有为我工作。

这是分配给我的$quantities数组的数据:

Array(
    [10] => Array([25.00] => 1)
    [9] => Array([30.00] => 3)
    [8] => Array([30.00] => 4)
    [12] => Array([35.00] => )
    [1] => Array([30.00] => )
    [2] => Array([30.00] => )
)

我正在寻找一种方法来删除包含[12] [1][2]等空值的子数组,同时保留其他所有内容。

期望的结果:

Array(
    [10] => Array([25.00] => 1)
    [9] => Array([30.00] => 3)
    [8] => Array([30.00] => 4)
)

我在官方php文档上尝试了很多功能,但没有一个能够工作。

我用过这个:

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;
}

但它只删除了子数组中的元素;我需要完全删除子阵列。

我不想要这个:

Array(
    [10] => Array([25.00] => 1)
    [9] => Array([30.00] => 3)
    [8] => Array([30.00] => 4)
    [12] => Array()
    [1] => Array()
    [2] => Array()
)

8 个答案:

答案 0 :(得分:12)

有点迟,但可能会帮助某人寻找相同的答案。我用这个非常简单的方法;

  1. 从不包含值的嵌套数组中删除所有键,然后
  2. 删除所有空的嵌套数组。

  3. $postArr = array_map('array_filter', $postArr);
    $postArr = array_filter( $postArr );
    

答案 1 :(得分:4)

以下功能适用于我的情况。我们可以使用一个简单的递归函数从多维PHP数组中删除所有空元素:

$('.more-icon').toggleClass('less-icon');

然后我们只需要调用这个函数:

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

答案 2 :(得分:1)

不确定这是否正是您所寻找的。 <击>

<击>
function array_remove_null($array) {
    foreach ($array as $key => $value)
    {
        if(is_null($value))
            unset($array[$key]);
        if(is_array($value))
            $array[$key] = array_remove_null($value);
    }
    return $array;
}

<击>

  

更新(更正):

function array_remove_null($array) {
    foreach ($array as $key => $value)
    {
        if(is_null($value))
            unset($array[$key]);
        if(is_string($value) && empty($value))
            unset($array[$key]);
        if(is_array($value))
            $array[$key] = array_remove_null($value);
        if(isset($array[$key]) && count($array[$key])==0)
            unset($array[$key]);
    }
    return $array;
}

我确信更好的检查并使其更强大可能有助于解决方案。

答案 3 :(得分:0)

使用array_map()过滤$ array中的每个数组:

$newArray = array_map('array_filter', $array);

这是demo

答案 4 :(得分:0)

$newArray = array_map('array_filter', $array);

这种语法的工作非常有用,谢谢你们。

答案 5 :(得分:0)

array_filterarray_map一起使用,如下所示:

$arr=array_filter(array_map('array_filter', $arr));

答案 6 :(得分:-1)

这会在multideminsional数组上以递归方式删除所有具有空值的项目。适用于PHP&gt; = 5.6。如果您要删除所有“empry”值,请将!is_null($value)替换为!empty($value)

function recursivelyRemoveItemsWithNullValuesFromArray(array $data = []): array
{
    $data = array_map(function($value) {
        return is_array($value) ? recursivelyRemoveItemsWithNullValuesFromArray($value) : $value;
    }, $data);

    return array_filter($data, function($value) {
        return !is_null($value);
    });
}

答案 7 :(得分:-4)

因为数组中的子数组每个只有一个元素,所以可以使用以下两种方法之一简化方法。逻辑上的优点是避免了二级元素上的函数迭代器(int(*)[5])。这就是array_filter更适合此问题/页面的原因。

代码:(Demo

current()

OR

$quantities=[
    10=>['25.00'=>1],
    9=>['30.00'=>3],
    8=>['30.00'=>4],
    12=>['35.00'=>null],
    1=>['30.00'=>''],
    2=>['30.00'=>null]
];

var_export(array_filter($quantities,function($a){return strlen(current($a));}));

两者都输出相同的结果(故意删除空值并保留foreach($quantities as $key=>$sub){ // could be done "by reference" but that impacts code stability if(!strlen(current($sub))){ // if subarray value has no length unset($quantities[$key]); } } var_export($quantities); 值)

0

在上述方法中,array ( 10 => array ( '25.00' => 1, ), 9 => array ( '30.00' => 3, ), 8 => array ( '30.00' => 4, ), ) 用于检查第二级元素,因为OP仅将整数列为“非空”值。根据可能持有strlen()falsenull'0'等的元素,未来的SO读者可能会有不同的要求。0的合适替换函数可能是:the "is_" functionsempty()中的任何一个,the "ctype" functions中的任何一个,等等。

如果OP的第二级数组拥有多个元素,并且OP想要删除所有的零,is-y,空,null元素(意味着不想要或不保证不发生零),那么{{3将是最好的选择。

如果OP的输入数组具有未知数量的级别,并且应该删除zero-ish / false-y / empty / null元素,则Alastair F's answer是一种逻辑递归方法。

我的观点(我花了这么多时间和精心回答这个问题的动机)strlen()是贪婪的,如果你不知道这种默认行为,你的项目可能会默默输出不正确的信息。我希望这个解释可以节省程序员一些时间和冲突。