2010-10-25 6 views
13

Как я могу проверить массив рекурсивно для пустого содержимого, как этот пример:лучший способ проверить пустой массив?

Array 
(
    [product_data] => Array 
     (
      [0] => Array 
       (
        [title] => 
        [description] => 
        [price] => 
       ) 

     ) 
    [product_data] => Array 
     (
      [1] => Array 
       (
        [title] => 
        [description] => 
        [price] => 
       ) 

     ) 

) 

массив не пуст, но нет никакого содержания. Как я могу проверить это с помощью простой функции?

Thank !!

+6

Каким образом ваш массив имеет два одинаковых ключей 'product_data'? – codaddict

+0

@codaddict: Хорошее наблюдение. –

+0

жаль, что я скопировал только текст, например :-) – comod

ответ

15

function is_array_empty($InputVariable) 
{ 
    $Result = true; 

    if (is_array($InputVariable) && count($InputVariable) > 0) 
    { 
     foreach ($InputVariable as $Value) 
     { 
     $Result = $Result && is_array_empty($Value); 
     } 
    } 
    else 
    { 
     $Result = empty($InputVariable); 
    } 

    return $Result; 
} 
+0

Более общее и отказоустойчивое решение, чем у меня :), но не могли бы вы его коротко закоротить и немедленно вернуться к непустому ответу, вместо того чтобы продолжать тестировать остальную часть массива? –

+2

foreach ($ InputVariable as $ Value) – comod

+0

@David Martensson: Выполнение будет направлено только на эту инструкцию else, если переменная, данная функции, не является массивом. Подумайте о массиве, заданном в вопросе, как о дереве и блоке else в качестве базового аргумента, в котором все листья будут оцениваться. – emurano

2

Предполагая, что массив всегда будет содержать один и тот же тип данных:

function TestNotEmpty($arr) { 
    foreach($arr as $item) 
     if(isset($item->title) || isset($item->descrtiption || isset($item->price)) 
      return true; 
    return false; 
} 
2

Перемычка включены.

function hasValues($input, $deepCheck = true) { 
    foreach($input as $value) { 
     if(is_array($value) && $deepCheck) { 
      if($this->hasValues($value, $deepCheck)) 
       return true; 
     } 
     elseif(!empty($value) && !is_array($value)) 
      return true; 
    } 
    return false; 
} 
2

Вот моя версия. Как только он найдет непустую строку в массиве, она прекратится. Плюс он правильно проверяет пустые строки, так что 0 (ноль) не считается пустой строкой (которая была бы, если вы использовали функцию empty()). Кстати, даже использование этой функции только для строк оказалось бесценным с годами.

function isEmpty($stringOrArray) { 
    if(is_array($stringOrArray)) { 
     foreach($stringOrArray as $value) { 
      if(!isEmpty($value)) { 
       return false; 
      } 
     } 
     return true; 
    } 

    return !strlen($stringOrArray); // this properly checks on empty string ('') 
} 
8

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

if (strlen(implode('', $array)) == 0) 

Работы в большинстве случаев :)

+0

Это не так. Как насчет многомерного массива? – sonnb

+2

@sonnb: Вы должны внимательно прочитать: Один уровень! = Многомерный/многоуровневый. – velop

0

Если кто натыкается на этот вопрос и нужно проверить, если весь array равен NULL, что означает, что каждая пара в массиве равна нулю, это удобная функция. Вы можете очень легко изменить его, чтобы вернуть true, если какая-либо переменная также возвращает NULL. Мне нужно было это для определенной веб-формы, где она обновляла данные пользователей, и было возможно, чтобы она прошла совершенно пустой, поэтому не нужно было делать какой-либо SQL.

$test_ary = array("1"=>NULL, "2"=>NULL, "3"=>NULL); 

function array_empty($ary, $full_null=false){ 
    $null_count = 0; 
    $ary_count = count($ary); 

    foreach($ary as $value){ 
     if($value == NULL){ 
      $null_count++; 
     } 
    } 

    if($full_null == true){ 
     if($null_count == $ary_count){ 
      return true; 
     }else{ 
      return false; 
     } 
    }else{ 
     if($null_count > 0){ 
      return true; 
     }else{ 
      return false; 
     } 
    } 
} 

$test = array_empty($test_ary, $full_null=true); 
echo $test; 
7

Решение с array_walk_recursive:

function empty_recursive($value) 
{ 
     if (is_array($value)) { 
       $empty = TRUE; 
       array_walk_recursive($value, function($item) use (&$empty) { 
         $empty = $empty && empty($item); 
       }); 
     } else { 
       $empty = empty($value); 
     } 
     return $empty; 
} 
+0

Самая элегантная настройка среди ответов. – chikamichi

0
$arr=array_unique(array_values($args)); 
if(empty($arr[0]) && count($arr)==1){ 
echo "empty array"; 
} 
0

Возвращает TRUE если передается переменная, кроме массива, или если какой-либо из вложенных массивов содержит значение (в том числе falsy значений!). Возвращает FALSE в противном случае. Короткие замыкания.

function has_values($var) { 
    if (is_array($var)) { 
    if (empty($var)) return FALSE; 
    foreach ($var as $val) { 
     if(has_values($val)) return TRUE; 
    } 
    return FALSE; 
    } 
    return TRUE; 
} 
0

Вот хорошая функция полезности, которая будет возвращать true (1) если массив пуст, или false (0) если нет:

function is_array_empty($mixed) { 
    if (is_array($mixed)) { 
     foreach ($mixed as $value) { 
      if (! is_array_empty($value)) { 
       return false; 
      } 
     } 
    } elseif (! empty($mixed)) { 
     return false; 
    } 

    return true; 
} 

Например, если многомерный массив:

$products = array(
    'product_data' => array(
     0 => array(
      'title' => '', 
      'description' => null, 
      'price' => '', 
     ), 
    ), 
); 

Вы 'получите значение true, возвращенное с is_array_empty(), так как нет значений:

var_dump(is_array_empty($products)); 

Посмотреть этот код в интерактивном режиме по адресу: http://codepad.org/l2C0Efab