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

How to remove null values in multi-dimensional array?

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

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

预期结果

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

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

使用 array_filter 回调:

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

为了准确检查 null:

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

这里我们使用 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
        )

)

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

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

希望此解决方案适合您。欲了解更多详情,请访问下方 link.

PHP: remove empty array strings in multidimensional array

您需要使用 array_map, array_filter and array_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);

Danger! Do not trust empty() when dealing with numbers (or number-ish) values that could be zero!!! The same is true with using array_filter without a specific filtering parameter (as several answers on this page are using).

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

错误的方法:

$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.

使用此递归函数迭代任何子数组并删除所有具有空值的元素。

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