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

时间:2017-04-29 09:38:53

标签: php arrays null filtering php-5.6

我想从此数组中删除空值。

Array(
    [0] => Array( [fcmToken] => 123 )
    [1] => Array( [fcmToken] => )
    [2] => Array( [fcmToken] => 789 )
)

预期结果

Array(
    [0] => Array( [fcmToken] => 123 )
    [1] => Array( [fcmToken] => 789 )
)

7 个答案:

答案 0 :(得分:2)

我们正在使用foreach来迭代值并使用$value non-empty $value["fcmToken"]

$result=array();
foreach($array as $key => $value)
{
    if(!empty($value["fcmToken"]))
    {
        $result[]=$value;
    }
}

print_r($result);

<强>输出:

Array
(
    [0] => Array
        (
            [fcmToken] => dfqVhqdqhpk
        )

    [1] => Array
        (
            [fcmToken] => dfgdfhqdqhpk
        )

)

答案 1 :(得分:0)

array_filter与回调一起使用:

$r = array_filter($array, function($v) { return !empty($v['fcmToken']); });

准确检查null

$r = array_filter($array, function($v) { return !is_null($v['fcmToken']); });

答案 2 :(得分:0)

过滤器多维数组的最佳简便单行解决方案,如下所示。

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

我希望这个解决方案适合你。有关详细信息,请访问以下链接。

PHP: remove empty array strings in multidimensional array

答案 3 :(得分:0)

您需要使用array_maparray_filterarray_values来完成此操作。检查以下代码:

$entry = array(
    array("fcmToken" => 'dfqVhqdqhpk'),
    array("fcmToken" => ''),
    array("fcmToken" => 'dfgdfhqdqhpk'),
);
echo "<pre>";
$entry = array_values(array_filter(array_map('array_filter', $entry)));
print_r($entry);

答案 4 :(得分:0)

  

危险!在处理可能为零的数字(或number-ish)值时,不要相信 empty()!在没有特定过滤参数的情况下使用 array_filter 也是如此(因为此页面上的几个答案正在使用)。

看看你如何得到错误的输出:

糟糕的方法:

$array = array(
    array("fcmToken" => '0'),
    array("fcmToken" => 123),
    array("fcmToken" => ''),
    array("fcmToken" => 789),
    array("fcmToken" => 0)
);

$result=array();                         // note, this line is unnecessary
foreach($array as $key => $value){       // note, $key is unnecessary
    if(!empty($value["fcmToken"])){      // this is not a reliable method
        $result[]=$value;
    }
}
var_export($result);

输出:

array (
  0 => 
  array (
    'fcmToken' => 123,
  ),
  1 => 
  array (
    'fcmToken' => 789,
  ),
)

零被吞噬了!

这是应该如何做的:

相反,您应该使用strlen()来检查值:

方法#1:foreach()

foreach($array as $sub){
    if(strlen($sub["fcmToken"])){
        $result[]=$sub;
    }
}
var_export($result);

方法#2:array_filter() w /匿名函数,array_values()表示一致性

var_export(array_values(array_filter($array,function($a){return strlen($a['fcmToken']);})));

两种方法的输出:

array (
  0 => 
  array (
    'fcmToken' => '0',
  ),
  1 => 
  array (
    'fcmToken' => 123,
  ),
  2 => 
  array (
    'fcmToken' => 789,
  ),
  3 => 
  array (
    'fcmToken' => 0,
  ),
)

Demonstration of bad method and two good methods

答案 5 :(得分:0)

使用这个递归函数,它遍历任何子数组并删除所有具有空值的元素。

function removeNullValues ($array) {
    foreach ($array as $key => $entry) {
        if (is_array($entry)) {
            $array[$key] = removeNullValues($entry);
            if ($array[$key] === []) {
                unset($array[$key]);
            }
        } else {
            if ($entry === null) {
                unset($array[$key]);
            }
        }
    }

    return $array;
}

答案 6 :(得分:-1)

尝试使用array_map()将过滤器应用于数组中的每个数组。