168 votes

Vérifier si le tableau est multidimensionnelle ou pas?

  1. Quel est le moyen le plus efficace pour vérifier si un tableau est un tableau plat des valeurs primitives ou si c'est un tableau multidimensionnel?
  2. Est-il possible de faire ceci sans boucle par le biais d'un tableau et en cours d'exécution is_array() sur chacun de ses éléments?

153voto

Vinko Vrsalovic Points 116138

La réponse courte est non, vous ne pouvez pas le faire sans au moins une boucle implicitement que si la deuxième dimension " pourrait être n'importe où. Si elle doit être dans le premier point, vous devriez juste faire

is_array($arr[0]);

Mais, le plus efficace de manière générale j'ai pu trouver est d'utiliser une boucle foreach sur le tableau, de court-circuit à chaque fois qu'un coup est trouvé (au moins la boucle implicite est mieux que la droite()):

$ more multi.php
<?php

$a = array(1 => 'a',2 => 'b',3 => array(1,2,3));
$b = array(1 => 'a',2 => 'b');
$c = array(1 => 'a',2 => 'b','foo' => array(1,array(2)));

function is_multi($a) {
    $rv = array_filter($a,'is_array');
    if(count($rv)>0) return true;
    return false;
}

function is_multi2($a) {
    foreach ($a as $v) {
        if (is_array($v)) return true;
    }
    return false;
}

function is_multi3($a) {
    $c = count($a);
    for ($i=0;$i<$c;$i++) {
        if (is_array($a[$i])) return true;
    }
    return false;
}
$iters = 500000;
$time = microtime(true);
for ($i = 0; $i < $iters; $i++) {
    is_multi($a);
    is_multi($b);
    is_multi($c);
}
$end = microtime(true);
echo "is_multi  took ".($end-$time)." seconds in $iters times\n";

$time = microtime(true);
for ($i = 0; $i < $iters; $i++) {
    is_multi2($a);
    is_multi2($b);
    is_multi2($c);
}
$end = microtime(true);
echo "is_multi2 took ".($end-$time)." seconds in $iters times\n";
$time = microtime(true);
for ($i = 0; $i < $iters; $i++) {
    is_multi3($a);
    is_multi3($b);
    is_multi3($c);
}
$end = microtime(true);
echo "is_multi3 took ".($end-$time)." seconds in $iters times\n";
?>

$ php multi.php
is_multi  took 7.53565130424 seconds in 500000 times
is_multi2 took 4.56964588165 seconds in 500000 times
is_multi3 took 9.01706600189 seconds in 500000 times

Implicite en boucle, mais on ne peut pas court-circuit dès qu'une correspondance est trouvée...

$ more multi.php
<?php

$a = array(1 => 'a',2 => 'b',3 => array(1,2,3));
$b = array(1 => 'a',2 => 'b');

function is_multi($a) {
    $rv = array_filter($a,'is_array');
    if(count($rv)>0) return true;
    return false;
}

var_dump(is_multi($a));
var_dump(is_multi($b));
?>

$ php multi.php
bool(true)
bool(false)

27voto

scronide Points 5108

Pour PHP 4.2.0 ou plus récent:

function is_multi($array) {
    return (count($array) != count($array, 1));
}

9voto

Pian0_M4n Points 117

Vous pouvez simplement exécuter ce:

if (count($myarray) == count($myarray, COUNT_RECURSIVE)) return true;
else return false;

Si l'option mode paramètre est défini à l' COUNT_RECURSIVE (ou 1), count() de manière récursive, à compter de la matrice. Ceci est particulièrement utile pour le comptage de tous les éléments d'un tableau multidimensionnel.

Si c'est la même chose, donc il n'y a pas de sous-niveaux n'importe où. Facile et rapide!

7voto

Greg Hewgill Points 356191

Vous pouvez regarder vérifiez is_array() sur le premier élément, sous l'hypothèse que si le premier élément d'un tableau est un tableau, alors le reste d'entre eux sont trop.

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