web-dev-qa-db-fra.com

moyen le plus propre de sauter un foreach si le tableau est vide

Ce n’est pas un problème majeur mais je me demandais s’il existait une méthode plus propre. Il serait bon d'éviter d'imbriquer mon code avec une instruction if inutile. Si $items _ est vide php génère une erreur.

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

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

Je pourrais probablement juste utiliser le suppresseur d'erreur '@', mais ce serait un peu hacky.

112
Keyo

Il y a un million de façons de le faire.

La première consiste à exécuter le tableau dans foreach de toute façon, en supposant que vous en ayez un.

Dans d'autres cas, c'est ce dont vous pourriez avoir besoin:

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

Note: à toutes les personnes qui se plaignent du transtypage, veuillez noter que l'OP a demandé le moyen le plus propre de sauter un foreach si array est vide (c'est moi qui souligne). Une valeur de true, false, de nombres ou de chaînes est non considérée comme vide. De plus, cela fonctionnerait avec des objets implémentant \Traversable, tandis que is_array ne fonctionnerait pas.

195
Christian

Le meilleur moyen est de initialiser chaque variable sanglante avant utilisation.
Cela ne résoudra pas seulement ce "problème" idiot, mais vous épargnera également une tonne de vrais maux de tête.

Donc, introduire $ items en tant que $items = array(); est ce que vous vraiment vouliez.

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

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

Je ne recommanderais pas de supprimer la sortie d'avertissement. Je recommanderais cependant d'utiliser is_array au lieu de !empty. Si $items est un scalaire différent de zéro, le foreach aura toujours une erreur si vous utilisez !empty.

15
Zach Rattner

Si la variable dont vous avez besoin pourrait être boolean false - par exemple. lorsque aucun enregistrement n'est renvoyé de la base de données ou array - lorsque des enregistrements sont renvoyés, vous pouvez effectuer les opérations suivantes:

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

Approche avec casting ((Array)$result) produit un tableau du nombre 1 lorsque la variable est boolean false qui n'est pas ce que vous voulez probablement.

9
Daniel Kmak

Je pense que la meilleure approche ici est de planifier votre code afin que $ items soit toujours un tableau. La solution la plus simple consiste à l'initialiser en haut de votre code avec $ items = array (). De cette façon, il représentera un tableau vide même si vous ne lui attribuez aucune valeur.

Toutes les autres solutions sont des hacks assez sales pour moi.

6
Vladislav Rastrusny
foreach((array)$items as $item) {}
4
Milan

j'ai la fonction suivante dans ma "bibliothèque standard"

/// 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();
}

Fondamentalement, cela ne fait rien avec les tableaux/objets et convertit d'autres types en tableaux. Ceci est extrêmement pratique à utiliser avec les instructions foreach et les fonctions de tableau

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

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

  etc
3
user187291

La logique ternaire le réduit à une ligne sans erreur. Cela résout le problème des variables mal converties et des variables non définies.

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

C'est un peu pénible à écrire, mais c'est le moyen le plus sûr de le gérer.

1
swirt

La meilleure pratique consiste à définir une variable comme un tableau tout en haut de votre code.

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

fonctionnera également, mais vous dupliquerez cette conversion (tableau) à chaque fois que vous devrez parcourir le tableau en boucle.

comme il est important de ne pas dupliquer même un mot de votre code, vous feriez mieux de le définir comme un tableau vide en haut.

0
spetsnaz

Vous pouvez vérifier si $ items est réellement un tableau et s'il contient des éléments:

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