How to remove null values in multi-dimensional arr

2019-07-25 08:02发布

问题:

I want to remove null values from this array.

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

Expected Results

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

回答1:

Here we are using foreach to iterate over values and using $value for non-empty $value["fcmToken"]

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

print_r($result);

Output:

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

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

)


回答2:

Use array_filter with a callback:

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

For checking exactly null:

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


回答3:

The best and easy single line solution for filter multidimensional array like below.

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

I hope this solution is work for you. for more detail please visit below link.

PHP: remove empty array strings in multidimensional array



回答4:

You need to do it using array_map, array_filter and array_values. Check below code :

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


回答5:

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

Look at how you can get the wrong output:

Bad Method:

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

Output:

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

The zeros got swallowed up!


This is how it should be done:

Instead, you should use strlen() to check the values:

Method #1: foreach()

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

Method #2: array_filter() w/ anonymous function and array_values() for consistency

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

Output for either method:

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.



回答6:

Try using array_map() to apply the filter to every array in the array.