如何删除PHP从多维数组空值?(How to remove empty values from mu

2019-06-23 17:55发布

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

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

Answer 1:

有点晚,但可以帮助别人寻找相同的答案。 我用这个非常简单的方法;

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

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


Answer 2:

下面的函数工作了我的情况。 我们可以用一个简单的递归函数删除多维数组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);


Answer 3:

不知道如果这正是你寻找的。

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

我敢肯定,更完善的检查,使这个更强大的可以帮助解决。



Answer 4:

使用array_map()用于过滤器在$数组每个数组:

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

这里的演示



Answer 5:

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

这sintax它的工作,非常有助于充分感谢的家伙..



Answer 6:

使用array_filterarray_map象下面这样:

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


Answer 7:

这消除了与递归上multideminsional阵列空值的所有项目。 适用于PHP> = 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);
    });
}


Answer 8:

因为你的阵列中的子阵列只有每一个元素,可以简化使用以下两种方法的方法。 逻辑优点是避免了功能迭代器( 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()可以是:任何的的“确保对方”功能 , 空的()中,任何的“CTYPE”功能 ,等等。

如果OP的第二级阵列持有一个以上的元素和OP想删除所有零十岁上下,假Y,空,空元素(这意味着零不想要的或保证不会发生),那么阿拉斯泰尔·F公司的回答将是最好的选择。

如果OP的输入数组有数目不详的水平和零ISH /假Y /空/空元素应该被删除,然后礼马蒙的回答是一个逻辑,递归方法。

我的观点存在(和我的背后花了这么多时间和精力来回答这个问题的动机),其array_filter()是贪婪的,如果你没有意识到此默认行为,您的项目可能悄无声息输出不正确的信息。 我希望这个解释可以节省程序员一定的时间和纷争。



文章来源: How to remove empty values from multidimensional array in PHP?