【发布时间】:2012-12-17 12:37:18
【问题描述】:
我想删除 NULL、FALSE 和 '' 值。
我使用了array_filter,但它也删除了0。
有什么功能可以做我想做的事吗?
array(NULL,FALSE,'',0,1) -> array(0,1)
【问题讨论】:
标签: php arrays array-filter
我想删除 NULL、FALSE 和 '' 值。
我使用了array_filter,但它也删除了0。
有什么功能可以做我想做的事吗?
array(NULL,FALSE,'',0,1) -> array(0,1)
【问题讨论】:
标签: php arrays array-filter
您也可以将array_filter 与'strlen' 参数一起使用:
// removes all NULL, FALSE and Empty Strings but leaves 0 (zero) values
$result = array_filter($array, 'strlen');
https://www.php.net/manual/en/function.array-filter.php#111091
【讨论】:
strlen 现在会发出一个不推荐使用的错误“strlen(): Passing null to parameter #1 ($string) of string is deprecated”
如果您使用identical comparison operator,array_filter 应该可以正常工作。
$values = [NULL, FALSE, '', 0, 1];
function myFilter($var){
return ($var !== NULL && $var !== FALSE && $var !== '');
}
$res = array_filter($values, 'myFilter');
或者如果不想定义过滤函数,也可以使用匿名函数(闭包):
$res = array_filter($values, function($value) {
return ($value !== null && $value !== false && $value !== '');
});
如果您只需要数值,可以使用is_numeric 作为回调:example
$res = array_filter($values, 'is_numeric');
【讨论】:
NULL、FALSE 和 ""。
来自http://php.net/manual/en/function.array-filter.php#111091:
如果要删除 NULL、FALSE 和空字符串,但保留值为 0,则可以使用 strlen 作为回调函数:
array_filter($array, 'strlen');
【讨论】:
单线总是很好。
$clean_array = array_diff(array_map('trim', $my_array), array('', NULL, FALSE));
说明:
array_diff 的第一个参数: $my_array 的修剪版本。使用array_map,通过trim 函数从每个元素中修剪周围的空白。如果元素包含的字符串只是空格(即制表符、空格),最好使用修剪后的版本,我假设它也希望被删除。如果您不想修剪元素,也可以轻松地将 $my_array 用作第一个参数。array_diff 的第二个参数:要从 $my_array 中删除的项目数组。''、NULL 和FALSE 在第二个数组中,所以array_diff 永远无法返回它们。编辑:
事实证明,您不需要在第二个数组中包含 NULL 和 FALSE。相反,您可以只使用'',它会以相同的方式工作:
$clean_array = array_diff(array_map('trim', $my_array), array(''));
【讨论】:
检查它是否小于1,如果大于-1,则不要删除它...
$arrayValue = (NULL,FALSE,'',0,1);
$newArray = array();
foreach($arrayValue as $value) {
if(is_int($value) || ($value>-1 && $value <1)) {
$newArray[] = $value;
}
}
print_r($newArray);
【讨论】:
array(NULL,FALSE,'hello world')呢?
array_filter 不起作用,因为默认情况下,它会删除任何与 FALSE 等效的内容,并且 PHP 认为 0 等效于 false。 PHP manual 在这个问题上有这样的说法:
当转换为布尔值时,以下值被视为 FALSE:
- 布尔值 FALSE 本身
- 整数 0(零)
- 浮点数 0.0(零)
- 空字符串和字符串“0”
- 零元素的数组
- 一个成员变量为零的对象(仅限 PHP 4)
- 特殊类型 NULL(包括未设置的变量)
- 从空标签创建的 SimpleXML 对象
所有其他值都被视为 TRUE(包括任何资源)。
您可以将第二个参数传递给array_filter,并回调您自己编写的函数,该函数告诉array_filter 是否删除该项目。
假设您要删除所有与 FALSE 等效的值除了零,这是一个易于编写的函数:
function RemoveFalseButNotZero($value) {
return ($value || is_numeric($value));
}
然后你只需用过滤后的数组覆盖原始数组:
$array = array_filter($array, "RemoveFalseButNotZero");
【讨论】:
$array= array_filter($array, function($val) { return ($val || is_numeric($val));});
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];
}
}
}
这个功能可以帮到你
【讨论】:
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'));
输出:
Array
(
[0] => foo
[2] => -1
[5] => 0
)
【讨论】:
使用带有 array_filter 的自定义回调函数。请参阅此示例,从 PHP 手册中提取,了解如何使用回调函数。示例中的回调函数是基于奇/偶的过滤;您可以编写一个小函数来根据您的要求进行过滤。
<?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"));
?>
【讨论】: