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 ?

0voto

Eduardo Cuomo Points 1433

Fonctions

<?php

/**
 * Is Array?
 * @param mixed $x
 * @return bool
 */
function isArray($x) : bool {
  return !isAssociative($x);
}

/**
 * Is Associative Array?
 * @param mixed $x
 * @return bool
 */
function isAssociative($x) : bool {
  if (!is_array($array)) {
    return false;
  }
  $i = count($array);
  while ($i > 0) {
    if (!isset($array[--$i])) {
      return true;
    }
  }
  return false;
}

Exemple

<?php

$arr = [ 'foo', 'bar' ];
$obj = [ 'foo' => 'bar' ];

var_dump(isAssociative($arr));
# bool(false)

var_dump(isAssociative($obj));
# bool(true)

var_dump(isArray($obj));
# bool(false)

var_dump(isArray($arr));
# bool(true)

0voto

faintsignal Points 1247

Depuis PHP 7.1, il existe un pseudo-type iterable dans ce but précis. Indication du type iterable accepte tout tableau ainsi que toute implémentation de la fonction Traversable interface. PHP 7.1 a également introduit la fonction is_iterable() . Pour les versions plus anciennes, voir d'autres réponses ici pour accomplir l'application de type équivalente sans les nouvelles fonctionnalités intégrées.

Le fair-play : Comme BlackHole l'a fait remarquer, cette question semble être un double de Objets itérables et indications sur les types de tableaux ? et sa réponse est plus détaillé que le mien.

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