93 votes

Comment vérifier si une variable est un tableau ?... ou quelque chose qui ressemble à un tableau ?

Je veux utiliser un foreach avec une variable, mais cette variable peut être de plusieurs types différents, NULL par exemple.

Alors avant foreach Je le teste :

if(is_array($var)){
  foreach($var as ...

Mais j'ai réalisé que cela peut aussi être une classe qui implémente Iterator interface. Je suis peut-être aveugle mais comment vérifier si la classe implémente l'interface ? Existe-t-il quelque chose comme is_a ou inherits opérateur ? J'ai trouvé class_implements Je peux l'utiliser, mais peut-être y a-t-il quelque chose de plus simple ?

Et deuxièmement, plus important, je suppose que cette fonction existe, serait suffisante pour vérifier si la variable is_array ou "met en œuvre Iterator ou dois-je rechercher quelque chose de plus ?

84voto

Jefffrey Points 31698

Si vous utilisez foreach à l'intérieur d'une fonction et que vous vous attendez à un tableau ou un Traversable vous pouvez taper l'indice de cette fonction avec :

function myFunction(array $a)
function myFunction(Traversable)

Si vous n'utilisez pas foreach à l'intérieur d'une fonction ou vous attendez les deux vous pouvez simplement utiliser cette construction pour vérifier si vous pouvez itérer sur la variable :

if (is_array($a) or ($a instanceof Traversable))

15voto

hakre Points 102271

foreach peut gérer des tableaux et des objets. Vous pouvez le vérifier avec :

$can_foreach = is_array($var) || is_object($var);
if ($can_foreach) {
    foreach ($var as ...
}

Vous n'avez pas besoin de vérifier spécifiquement Traversable comme d'autres l'ont laissé entendre dans leurs réponses, car tous les objets - comme tous les tableaux - sont traversables en PHP.

Plus techniquement :

foreach fonctionne avec tous les types de traversables, c'est-à-dire avec les tableaux, avec les objets simples (où les propriétés accessibles sont traversées) et les Traversable (ou plutôt les objets qui définissent les get_iterator handler).

( source )

En langage courant de la programmation PHP, lorsqu'une variable est

  • un tableau
  • un objet

y n'est pas

  • NULL
  • une ressource
  • un scalaire

vous pouvez utiliser foreach sur elle.

5voto

Baba Points 49157

Vous pouvez vérifier l'instance de Traversable avec une fonction simple. Cela fonctionnerait pour tout ceci de Iterator parce que Iterator extends Traversable

function canLoop($mixed) {
    return is_array($mixed) || $mixed instanceof Traversable ? true : false;
}

2voto

Alexey Points 840
<?php
$var = new ArrayIterator();

var_dump(is_array($var), ($var instanceof ArrayIterator));

renvoie à bool(false) ou bool(true)

2voto

thomas Points 439

PHP 7.1.0 a introduit le site iterable et le pseudo-type is_iterable() fonction qui est spécialement conçu à cet effet :

Ce [ ] propose une nouvelle iterable pseudo-type. Ce type est analogue à callable en acceptant plusieurs types au lieu d'un seul.

iterable accepte tout array ou un objet mettant en œuvre Traversable . Ces deux types sont itérables en utilisant foreach et peut être utilisé avec yield à l'intérieur d'un générateur.

function foo(iterable $iterable) {
    foreach ($iterable as $value) {
        // ...
    }
}

Cette [ ] ajoute également une fonction is_iterable() qui renvoie un booléen : true si une valeur est itérable et sera acceptée par la fonction iterable pseudo-type, false pour d'autres valeurs.

var_dump(is_iterable([1, 2, 3])); // bool(true)
var_dump(is_iterable(new ArrayIterator([1, 2, 3]))); // bool(true)
var_dump(is_iterable((function () { yield 1; })())); // bool(true)
var_dump(is_iterable(1)); // bool(false)
var_dump(is_iterable(new stdClass())); // bool(false)

Vous pouvez également utiliser la fonction is_array($var) pour vérifier si la variable passée est un tableau :

<?php
    var_dump( is_array(array()) ); // true
    var_dump( is_array(array(1, 2, 3)) ); // true
    var_dump( is_array($_SERVER) ); // true
?>

Lire la suite dans Comment vérifier si une variable est un tableau en PHP ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X