- Quel est le moyen le plus efficace de vérifier si un tableau est un tableau plat de valeurs primitives ou s'il s'agit d'un tableau multidimensionnel ?
- Existe-t-il un moyen de le faire sans réellement parcourir un tableau et s'exécuter
is_array()
sur chacun de ses éléments?
137
Réponses:
La réponse courte est non, vous ne pouvez pas le faire sans au moins une boucle implicite si la «deuxième dimension» peut être n'importe où. Si cela doit être dans le premier élément, vous feriez juste
Mais, la manière générale la plus efficace que j'ai pu trouver est d'utiliser une boucle foreach sur le tableau, en court-circuitant chaque fois qu'un hit est trouvé (au moins la boucle implicite est meilleure que la boucle directe pour ()):
Boucle implicite, mais on ne peut pas court-circuiter dès qu'une correspondance est trouvée ...
la source
is_multi()
optimiser le code en faisantreturn count($rv)>0
Utilisez count () deux fois; une fois en mode par défaut et une fois en mode récursif. Si les valeurs correspondent, le tableau n'est pas multidimensionnel, car un tableau multidimensionnel aurait un nombre récursif plus élevé.
Cette deuxième valeur d'option a
mode
été ajoutée dans PHP 4.2.0. À partir des documents PHP :Cependant, cette méthode ne détecte pas
array(array())
.la source
Pour PHP 4.2.0 ou plus récent:
la source
array(array())
ou pour l'un ou l'array(array(), array())
autre. En général, si un tableau intérieur est vide, le décompte récursif ajoutera correctement 0 pour lui, ce qui le fera correspondre au décompte normal.Je pense que c'est le moyen le plus simple et à la pointe de la technologie:
la source
Vous pouvez simplement exécuter ceci:
Si le paramètre de mode facultatif est défini sur
COUNT_RECURSIVE
(ou 1), count () comptera le tableau de manière récursive. Ceci est particulièrement utile pour compter tous les éléments d'un tableau multidimensionnel.Si c'est la même chose, cela signifie qu'il n'y a aucun sous-niveau nulle part. Facile et rapide!
la source
if(count($tasks_by_date) !== count($tasks_by_date, 1))
!==
habitude de voir si le sous-niveau existe. Pour les théories qui pourraient chercher quelque chose de similaire ... etc.!==
Vous pouvez vérifier
is_array()
le premier élément, en supposant que si le premier élément d'un tableau est un tableau, les autres le sont aussi.la source
if( is_array(current($arr)) ) { // is multidimensional }
Toutes les bonnes réponses ... voici mes trois lignes que j'utilise toujours
la source
Cette fonction renverra un nombre entier de dimensions de tableau (volées à partir d' ici ).
la source
Je pense que vous constaterez que cette fonction est le moyen le plus simple, le plus efficace et le plus rapide.
Vous pouvez le tester comme ceci:
la source
foreach($a as $v) is_array($v) ? return TRUE : return FALSE;
foreach($a as $v) return is_array($v) ? true : false;
Après PHP 7, vous pouvez simplement faire:
la source
Vous pouvez également effectuer une vérification simple comme celle-ci:
la source
Essayez comme suit
la source
Même cela fonctionne
Si faux, c'est un tableau à une seule dimension , si vrai, c'est un tableau à plusieurs dimensions .
current vous donnera le premier élément de votre tableau et vérifiera si le premier élément est un tableau ou non par la fonction is_array .
la source
N'utilisez pas COUNT_RECURSIVE
cliquez sur ce site pour savoir pourquoi
utilisez rsort puis utilisez isset
la source
Dans mon cas. Je suis resté dans des conditions étranges.
1er cas =
array("data"=> "name");
2e cas =
array("data"=> array("name"=>"username","fname"=>"fname"));
Mais si
data
a un tableau au lieu de valeur, la fonction sizeof () ou count () ne fonctionne pas pour cette condition. Ensuite, je crée une fonction personnalisée pour vérifier.Si le premier index du tableau a une valeur, il retourne "seulement valeur"
Mais si l'index a un tableau au lieu d'une valeur, il retourne "a un tableau"
J'utilise de cette façon
Remerciements particuliers à Vinko Vrsalovic
la source
Je pense que celui-ci est chic (accessoires pour un autre utilisateur je ne connais pas son nom d'utilisateur):
la source
Toutes les méthodes ci-dessus sont trop complexes pour un déploiement rapide. Si un tableau est plat, le test du premier élément doit retourner une primitive, par exemple int, chaîne, etc. S'il est multidimensionnel, il doit renvoyer un tableau. Par extension, vous pouvez utiliser cette doublure rapide et soignée.
si cela renvoie true, le tableau est multidimensionnel. Sinon, c'est plat. Juste pour noter, il est très rare que les tableaux aient des dimensions différentes, par exemple si vous générez des données à partir d'un modèle, il aura toujours le même type de structure multidimensionnelle ou plate qui peut être parcourue par des boucles. Si ce n'est pas le cas, vous l'avez construit à la main, ce qui signifie que vous savez où tout sera et que cela fonctionne sans avoir besoin d'écrire un algorithme de boucle.
la source
array_shift()
, car cela supprime le premier élément et réinitialise également les touches numériques! Mieux vaut l'utilisercurrent()
si toujours des démangeaisons pour un one-liner.En plus des réponses précédentes et en fonction du schéma du tableau que vous souhaitez vérifier:
la source
C'est aussi simple que
la source
Voici une belle doublure. Il itère sur chaque clé pour vérifier si la valeur de cette clé est un tableau. Cela garantira le vrai
la source
la source
if (isset($array[0])) { }
. Si vous êtes sûr que les index du tableau commencent à 0* uniquement pour les tableaux avec index numérique
la source
La fonction native print_r renvoie une chaîne lisible par l'homme. Comptez simplement les instances "Array".
essayer...
Sur ma boîte, "is_multi a pris 0,83681297302246 secondes en 500000 fois"
Gracieuseté: Ruach HaKodesh
la source
la source
Pas de boucles, claires et simples.
Fonctionne également avec les tableaux associés non seulement les tableaux numériques, qui ne peuvent pas contenir 0 (comme dans l'exemple précédent, vous enverriez un avertissement si le tableau n'a pas de 0.)
la source