Самый чистый способ пропустить foreach, если массив пуст

Не большая проблема, но мне было интересно, есть ли более чистый способ сделать это. Было бы неплохо избежать вложения моего кода с ненужным if-выражением. Если $items пуст, php выдает ошибку.

$items = array('a','b','c');

if(!empty($items)) { // <-Remove this if statement
  foreach($items as $item) {
    print $item;
  }
}

Я мог бы просто использовать "@" подавитель ошибок, но это было бы немного взломано.

Ответ 1

Есть миллион способов сделать это.

Первым будет идти вперед и запускать массив через foreach в любом случае, предполагая, что у вас есть массив.

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

foreach((array)$items as $item) {
    print $item;
}

Примечание: всем людям, жалующимся на приведение типов, обратите внимание, что ОП попросил самый чистый способ пропустить foreach, если массив пустой (акцент мой). Значение true, false, numbers или string не считается пустым.

Ответ 2

$items = array('a','b','c');

if(is_array($items)) {
  foreach($items as $item) {
    print $item;
  }
}

Ответ 3

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

Итак, введение $items в качестве $items = array(); - это то, что вам нужно действительно.

Ответ 4

Я бы не рекомендовал подавлять вывод предупреждения. Однако я бы рекомендовал использовать is_array вместо !empty. Если $items оказывается ненулевым скаляром, то foreach будет по-прежнему выходить из строя, если вы используете !empty.

Ответ 5

Если вам нужна переменная boolean false - например. когда никакие записи не возвращаются из базы данных или array - когда записи возвращаются, вы можете сделать следующее:

foreach (($result ? $result : array()) as $item)
    echo $item;

Подход с cast ((Array)$result) создает массив счетчика 1, когда переменная boolean false, которая не подходит вам.

Ответ 6

Я думаю, что лучший подход здесь - запланировать свой код, чтобы $items всегда являлся массивом. Самое простое решение - инициализировать его в верхней части вашего кода с помощью $items = array(). Таким образом, он будет представлять пустой массив, даже если вы не присваиваете ему никакого значения.

Все другие решения для меня довольно грязные.

Ответ 7

foreach((array)$items as $item) {}

Ответ 8

У меня есть следующая функция в моей "стандартной библиотеке"

/// Convert argument to an array.
function a($a = null) {
    if(is_null($a))
        return array();
    if(is_array($a))
        return $a;
    if(is_object($a))
        return (array) $a;
    return $_ = func_get_args();
}

В принципе, это ничего не делает с массивами/объектами и конвертирует другие типы в массивы. Это очень удобно использовать с операторами foreach и функциями массива.

  foreach(a($whatever) as $item)....

  $foo = array_map(a($array_or_string)....

  etc

Ответ 9

Тернарная логика выводит ее на одну строку без ошибок. Это решает проблему неверно заданных переменных и переменных undefined.

foreach (is_array($Items) || is_object($Items) ? $Items : array()  as $Item) {

Немного больно писать, но это самый безопасный способ справиться с этим.

Ответ 10

Лучшей практикой является определение переменной как массива в самом верху вашего кода.

foreach ((array) $myArr as $oneItem) {..}

также будет работать, но вы будете дублировать это преобразование (массив) каждый раз, когда вам нужно пройти через массив.

поскольку важно не дублировать даже слово вашего кода, вам лучше определить его как пустой массив в верхней части.

Ответ 11

Вы можете проверить, действительно ли $items является массивом и содержит ли он какие-либо элементы:

if(is_array($items) && count($items) > 0)
{
    foreach($items as $item) { }
}