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


How to remove empty values from multidimensional array in PHP?

我一直在寻找很多答案,但没有一个对我有用。

这是分配给我的$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()
)

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

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

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

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

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

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

$myArray = array_filter_recursive($myArray);

不确定这是否正是您要找的。

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

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

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

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

这是演示

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

这个sintax是工作,非常有帮助,非常感谢他们的家伙..

array_filter与如下所示的array_map一起使用:

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

这个对我有用

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

这将递归删除多元数组上所有具有 null 值的项目。适用于 PHP>= 5.6。如果要删除所有"空"值,请将!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);
    });
}

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

代码:(演示)

$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,
  ),
)

在上述方法中,strlen()用于检查二级元素,因为 OP 仅将整数列为"非空"值。 未来的SO阅读器可能会根据可能包含falsenull'0'0等元素有不同的要求。 适合strlen()的替换函数可能是:任何"is_"函数,empty(),任何"ctype"函数等等。

如果 OP 的 2nd 级数组包含多个元素,并且 OP 想要删除所有零、假 y、空、空元素(意味着不需要或保证不会发生零),那么 Alastair F 的答案将是最佳选择。

如果OP的输入数组具有未知数量的级别,并且应该删除零/假y/空/空元素,那么Reza Mamun的答案是一种合乎逻辑的递归方法。

的观点是(以及我花费大量时间和精力来回答这个问题的动机)array_filter()贪婪,如果您不知道这种默认行为,您的项目可能会默默地输出不正确的信息。 我希望这个解释能为程序员节省一些时间和冲突。