- 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?
- 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?
Réponses
Trop de publicités?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)
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!