11

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

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

8 回答 8

18

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

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

$postArr = array_map('array_filter', $postArr);
$postArr = array_filter( $postArr );
于 2013-09-13T22:16:35.850 回答
6

以下功能适用于我的情况。我们可以使用一个简单的递归函数从多维 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);
于 2015-09-03T18:23:18.643 回答
2

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

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

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

于 2012-04-18T17:26:03.130 回答
0

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

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

这是演示

于 2014-09-11T10:45:48.840 回答
0
$newArray = array_map('array_filter', $array);

这个sintax它的工作,非常有帮助,非常感谢你们..

于 2014-11-13T09:47:01.610 回答
0

使用array_filter如下array_map

$arr=array_filter(array_map('array_filter', $arr));
于 2017-05-24T05:11:22.553 回答
-1

这会在多维度数组上递归删除所有具有空值的项目。适用于 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);
    });
}
于 2017-06-08T13:19:52.890 回答
-4

因为数组中的每个子数组只有一个元素,所以可以使用以下两种方法之一来简化方法。逻辑上的优势在于避免在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()用于检查 2 级元素,因为 OP 仅将整数列为“非空”值。未来的 SO 读者可能会根据可能包含false, null, '0',0等的元素有不同的要求。合适的替换函数strlen()可能是:任何“is_”函数empty()、任何“ctype”函数等等。

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

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

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

于 2017-10-15T13:45:57.453 回答