Вопрос поиска в массиве PHP - PullRequest
0 голосов
/ 30 августа 2009

У меня есть массивы, некоторые также многомерны. Мне нужен способ узнать, все ли значения равны NULL. Что было бы наиболее эффективным и действенным способом определения, являются ли ВСЕ значения массива (а также значения массивов в этом массиве) NULL?

Итак, в основном: массив поиска, если все значения NULL, $ flag = true

РЕДАКТИРОВАТЬ: Значения извлекаются из базы данных MySQL, где NULL в контексте MySQL, если это имеет значение.

Ответы [ 5 ]

3 голосов
/ 30 августа 2009

Если я хорошо помню, нулевые поля db становятся пустыми строками в php, поэтому вы можете использовать такую ​​функцию:

function isEmptyArray($array){
   foreach($array as $val)
      if((is_array($val) && !isEmptyArray($val))||(!is_array($val) && $val!="")) return false;
   return true;
}
0 голосов
/ 30 августа 2009

Вы можете использовать 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).

0 голосов
/ 30 августа 2009

Возможно, вы захотите взглянуть на функцию array_filter () , по умолчанию она удаляет значения, равные false (включая NULL).

Я не уверен, будет ли он работать так же, как и для многомерных массивов, но у него есть возможность использовать функции обратного вызова, которые легко позволят вам справиться с этим.

Короче говоря, если вы запустите array_filter для массива и получите пустой массив, то все ваши значения будут нулевыми или равными false - если вам нужно строго различать эти значения, вам следует использовать перезвоните.

0 голосов
/ 30 августа 2009

Может быть сделано рекурсивно:

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 голосов
/ 30 августа 2009

Зависит от того, для чего вы будете использовать этот флаг, но я думаю, что лучше всего было бы запросить базу данных, чтобы она получала только ненулевые значения, например

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

Это завершится с ошибкой для многомерных массивов, и если нули или другие значения, которые автоматически преобразуются в ложные значения, являются допустимыми значениями в вашем массиве, если это так, вы должны построить рекурсивную функцию обратного вызова и передать ее в качестве второго параметра для array_filter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...