Как узнать, пуст ли массив ассоциативных массивов в php

#php #arrays #associative-array #is-empty

#php #массивы #ассоциативный массив #is-empty

Вопрос:

У меня довольно простая проблема, когда мне нужно посмотреть, пуст ли ассоциативный массив массивов в php. Мой массив выглядит следующим образом:

 array (
  'person1' => 
  array (
  ),
  'person2' => 
  array (
  ),
  'person3' => 
  array (
  ),
)

  

В моем случае три массива для трех человек ничего не содержат, поэтому мне нужен тест, является ли он пустым. Я сделал это, что работает:

     if ( empty($form_values['person1']) amp;amp; empty($form_values['person2']) amp;amp; empty($form_values['person3'] ) ){
        echo 'values empty!!';
    }

  

Но я надеялся, что с использованием empty будет что-то более чистое, например, следующее:

 if (empty( $form_values )) {
  echo 'HI!';
}
  

Комментарии:

1. Как генерируется ваш массив? Было бы лучше просто не включать пустые подмассивы в первую очередь, тогда вы могли бы просто проверить, $form_values пусто ли оно, как вы это делаете. Моим единственным другим предложением было бы использовать цикл. foreach($array as $a) { if(empty($a)) die() }

2. @GrumpyCrouton Ваш цикл завершается, если какое-либо из значений пусто, а не если все они пусты.

3. @Barmar Ах, ты прав

Ответ №1:

Вы можете использовать array_filter() для фильтрации всех пустых элементов массива. Затем вы можете использовать, empty чтобы проверить, является ли результат пустым.

Я сократил массивы, чтобы их было легче читать, поскольку массивы пусты. array() будет работать так же.

 $form_values = [
  'person1' => [],
  'person2' => [],
  'person3' => []
];

if (empty(array_filter($form_values))) {
    // empty
} else {
    // not empty
}
  

Ответ №2:

Если вы ищете однострочный файл, вы могли бы сделать что-то вроде:

 $form_values = array (
  'person1' => 
  array (
  ),
  'person2' => 
  array (
  ),
  'person3' => 
  array (
  ),
);

if(array_sum(array_map(function($v){return !empty($v);}, $form_values)) === 0)
{
    // empty
}
else
{
    // not empty
}
  

Ответ №3:

Используйте цикл, который проверяет каждый вложенный массив. Если ни один из них не является непустым, весь массив пуст.

 $is_empty = true;
foreach ($form_values as $val) {
    if (!empty($val)) {
        $is_empty = false;
        break;
    }
}
  

Комментарии:

1. Спасибо! Это должно работать так же хорошо, как и другой ответ.

Ответ №4:

 <?php

$data = 
[
    'pig' => [],
    'hog' => [],
    'sow' => []
];

$all_empty = array_filter($data) === [];
var_dump($all_empty);
  

Вывод:

 bool(true)
  

Из руководства по array_filter:

Если обратный вызов не указан, все пустые записи массива будут удалены. Смотрите empty() о том, как PHP определяет empty в этом случае.

Обратите внимание, что если элемент считался пустым, как пустая строка, он все равно возвращал бы true . Этот тест может быть недостаточно строгим.

Более явно:

 if (array_filter($data, function($v) {return $v !== []; }) === []) {}
  

Отфильтруйте все элементы, которые не являются пустым массивом. То, с чем мы останемся, — это пустой массив, если все элементы являются пустым массивом.

Или выполните поиск и сравните:

 if (array_keys($data, []) == array_keys($data)) {}
  

Проверьте, чтобы ключи, принадлежащие элементам, содержащим пустой массив, совпадали с ключами массива. Или, скорее, все элементы (если они существуют) являются пустым массивом.

Обратите внимание, что пустой массив также удовлетворит трем приведенным выше решениям.