我从 MySQL 数据库中提取了值,其中 NULL 位于 MySQL 的上下文中,如果这有影响的话。
我需要一种方法来知道是否所有值都为 NULL。确定数组的所有值(以及该数组中的数组的值)是否为 NULL 的最有效方法是什么?
所以基本上,搜索数组,如果所有值都是 NULL,$flag = true
如果我没记错的话,db null 字段在 php 中会变成空字符串,所以你可以使用这样的函数:
function isEmptyArray($array){
foreach($array as $val)
if((is_array($val) && !isEmptyArray($val))||(!is_array($val) && $val!="")) return false;
return true;
}
取决于您将使用该标志做什么,但我认为最好是查询数据库,以便它只检索非空值,例如
select col1,col2,col3 from table where col1 is not null and col2 is not null
and col3 is not null
也就是说,在 PHP 中执行类似操作的简单方法是
//array_filter filters values that evaulate to fals
$result = array_filter($input);
if (count($result) == 0) { $flag = true; }
对于多维数组,这将会失败,如果零或其他自动转换为 false 的值是数组中的有效值,如果是这种情况,您必须构建一个递归回调函数并将其作为第二个参数传递给 数组过滤器。
您可能想查看 array_filter() 函数,默认情况下它会删除等于 false 的值(包括 NULL)。
我不确定它是否能像多维数组一样工作,但它可以选择使用回调函数,这将很容易让你处理这个问题。
长话短说,如果你在数组上运行 array_filter 并且返回一个空数组,那么你的所有值都是 Null 或等于 false - 如果你需要严格意义上区分这些值,那么你应该使用回调.
可以递归完成:
arrayIsFullyNull ($arr)
{
if (is_array($arr))
foreach ($arr as $val)
if (!arrayIsFullyNull($val))
return false;
else if (!is_null($arr))
return false;
else
return false; // it's not null, and not array => value
return true;
}
您可以使用 RecursiveArrayIterator 遍历所有值(嵌套数组树的叶子)。
未经测试的代码:
function isNullOrNestedArrayOfNulls($array)
{
if (is_null($array)
{
return true;
}
else if (!is_array($array))
{
return false;
}
$allNull = true;
$iter = new RecursiveIteratorIterator(new RecursiveArrayIterator($array),
RecursiveIteratorIterator::LEAVES_ONLY);
while ($iter->valid())
{
if (!is_null($iter->current())
{
$allNull = false;
break;
}
}
return $allNull;
}
这样做的优点是可以避免使用递归函数(在 PHP 中递归函数的效率相当低)。