#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)) {}
Проверьте, чтобы ключи, принадлежащие элементам, содержащим пустой массив, совпадали с ключами массива. Или, скорее, все элементы (если они существуют) являются пустым массивом.
Обратите внимание, что пустой массив также удовлетворит трем приведенным выше решениям.