判断查询结果集中所有行是否全部为空

问题描述 投票:0回答:5

我从 MySQL 数据库中提取了值,其中 NULL 位于 MySQL 的上下文中,如果这有影响的话。

我需要一种方法来知道是否所有值都为 NULL。确定数组的所有值(以及该数组中的数组的值)是否为 NULL 的最有效方法是什么?

所以基本上,搜索数组,如果所有值都是 NULL,$flag = true

php arrays validation multidimensional-array null
5个回答
3
投票

如果我没记错的话,db null 字段在 php 中会变成空字符串,所以你可以使用这样的函数:

function isEmptyArray($array){
   foreach($array as $val)
      if((is_array($val) && !isEmptyArray($val))||(!is_array($val) && $val!="")) return false;
   return true;
}

0
投票

取决于您将使用该标志做什么,但我认为最好是查询数据库,以便它只检索非空值,例如

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 的值是数组中的有效值,如果是这种情况,您必须构建一个递归回调函数并将其作为第二个参数传递给 数组过滤器。


0
投票

您可能想查看 array_filter() 函数,默认情况下它会删除等于 false 的值(包括 NULL)。

我不确定它是否能像多维数组一样工作,但它可以选择使用回调函数,这将很容易让你处理这个问题。

长话短说,如果你在数组上运行 array_filter 并且返回一个空数组,那么你的所有值都是 Null 或等于 false - 如果你需要严格意义上区分这些值,那么你应该使用回调.


0
投票

可以递归完成:

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

0
投票

您可以使用 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 中递归函数的效率相当低)。

© www.soinside.com 2019 - 2024. All rights reserved.