Remove NULL, FALSE, and '' - but not 0 - from a PHP array

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-17 18:25:47

问题


I want to remove NULL, FALSE and '' values .

I used array_filter but it removes the 0' s also.

Is there any function to do what I want?

array(NULL,FALSE,'',0,1) -> array(0,1)

回答1:


array_filter should work fine if you use the identical comparison operator.

here's an example

$values = [NULL, FALSE, '', 0, 1];

function myFilter($var){
  return ($var !== NULL && $var !== FALSE && $var !== '');
}

$res = array_filter($values, 'myFilter');

Or if you don't want to define a filtering function, you can also use an anonymous function (closure):

$res = array_filter($values, function($value) {
    return ($value !== null && $value !== false && $value !== ''); 
});

If you just need the numeric values you can use is_numeric as your callback: example

$res = array_filter($values, 'is_numeric');



回答2:


From http://php.net/manual/en/function.array-filter.php#111091 :

If you want to remove NULL, FALSE and Empty Strings, but leave values of 0, you can use strlen as the callback function:

array_filter($array, 'strlen');



回答3:


array_filter doesn't work because, by default, it removes anything that is equivalent to FALSE, and PHP considers 0 to be equivalent to false. The PHP manual has this to say on the subject:

When converting to boolean, the following values are considered FALSE:

  • the boolean FALSE itself
  • the integer 0 (zero)
  • the float 0.0 (zero)
  • the empty string, and the string "0"
  • an array with zero elements
  • an object with zero member variables (PHP 4 only)
  • the special type NULL (including unset variables)
  • SimpleXML objects created from empty tags

Every other value is considered TRUE (including any resource).

You can pass a second parameter to array_filter with a callback to a function you write yourself, which tells array_filter whether or not to remove the item.

Assuming you want to remove all FALSE-equivalent values except zeroes, this is an easy function to write:

function RemoveFalseButNotZero($value) {
  return ($value || is_numeric($value));
}

Then you just overwrite the original array with the filtered array:

$array = array_filter($array, "RemoveFalseButNotZero");



回答4:


Use a custom callback function with array_filter. See this example, lifted from PHP manual, on how to use call back functions. The callback function in the example is filtering based on odd/even; you can write a little function to filter based on your requirements.

<?php
function odd($var)
{
    // returns whether the input integer is odd
    return($var & 1);
}

function even($var)
{
    // returns whether the input integer is even
    return(!($var & 1));
}

$array1 = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5);
$array2 = array(6, 7, 8, 9, 10, 11, 12);

echo "Odd :\n";
print_r(array_filter($array1, "odd"));
echo "Even:\n";
print_r(array_filter($array2, "even"));
?> 



回答5:


One-liners are always nice.

$clean_array = array_diff(array_map('trim', $my_array), array('', NULL, FALSE));

Explanation:

  • 1st parameter of array_diff: The trimmed version of $my_array. Using array_map, surrounding whitespace is trimmed from every element via the trim function. It is good to use the trimmed version in case an element contains a string that is nothing but whitespace (i.e. tabs, spaces), which I assume would also want to be removed. You could just as easily use $my_array for the 1st parameter if you don't want to trim the elements.
  • 2nd parameter of array_diff: An array of items that you would like to remove from $my_array.
  • Output: An array of elements that are contained in the 1st array that are not also contained in the 2nd array. In this case, because '', NULL, and FALSE are within the 2nd array, they can never be returned by array_diff.

EDIT:

It turns out you don't need to have NULL and FALSE in the 2nd array. Instead you can just have '', and it will work the same way:

$clean_array = array_diff(array_map('trim', $my_array), array(''));



回答6:


function my_filter($var)
{
    // returns values that are neither false nor null (but can be 0)
    return ($var !== false && $var !== null && $var !== '');
}

$entry = array(
             0 => 'foo',
             1 => false,
             2 => -1,
             3 => null,
             4 => '',
             5 => 0
          );

print_r(array_filter($entry, 'my_filter'));

Outputs:

Array
(
    [0] => foo
    [2] => -1
    [5] => 0
)



回答7:


check whether it is less than 1 and greater than -1 if then dont remove it...

$arrayValue = (NULL,FALSE,'',0,1);
$newArray = array();
foreach($arrayValue as $value) {
    if(is_int($value) || ($value>-1 && $value <1)) {
        $newArray[] = $value;
    }
}

print_r($newArray);



回答8:


function ExtArray($linksArray){
    foreach ($linksArray as $key => $link)
    {
        if ($linksArray[$key] == '' || $linksArray[$key] == NULL || $linksArray[$key] == FALSE || $linksArray[$key] == '')
        {
            unset($linksArray[$key]);
        }else {
            return $linksArray[$key];
        }
    }
}

This function may help you



来源:https://stackoverflow.com/questions/14134006/remove-null-false-and-but-not-0-from-a-php-array

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!