Vérifier si array est multidimensionnel ou non?

  1. Quelle est la manière la plus efficace de vérifier si un tableau est un tableau plat des valeurs primitives ou si c'est un tableau multidimensionnel ?
  2. y a-t-il un moyen de le faire sans passer par une boucle tableau et l'exécution is_array() sur chacun de ses éléments?
119
demandé sur Josua Marcel Chrisano 2008-09-28 10:23:12

22 réponses

la réponse courte est non vous ne pouvez pas le faire sans au moins boucler implicitement si la 'deuxième dimension' pourrait être n'importe où. S'il doit être dans le premier article, vous feriez juste

is_array($arr[0]);

mais, la manière générale la plus efficace que j'ai pu trouver est d'utiliser une boucle foreach sur le tableau, courtcircuitant chaque fois qu'un hit est trouvé (au moins la boucle implicite est meilleure que la droite pour ()):

$ 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

boucle implicite, mais nous ne pouvons 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)
117
répondu Vinko Vrsalovic 2008-09-28 07:15:27

utiliser count() deux fois; une fois en mode par défaut et une fois en mode récursif. Si les valeurs correspondent, le tableau est et non multidimensionnel, car un tableau multidimensionnel aurait un nombre récursif plus élevé.

if (count($array) == count($array, COUNT_RECURSIVE)) 
{
  echo 'array is not multidimensional';
}
else
{
  echo 'array is multidimensional';
}

cette deuxième valeur d'option mode a été ajoutée dans PHP 4.2.0. De la PHP Docs :

si le paramètre mode optionnel est défini à COUNT_RECURSIVE (ou 1), count () va recursivement compter le tableau. Ceci est particulièrement utile pour compter tous les éléments d'un tableau multidimensionnel. count () ne détecte pas la récursion infinie.

Toutefois, cette méthode ne détecte pas array(array()) .

172
répondu Community 2012-08-29 02:32:53

pour PHP 4.2.0 ou plus récent:

function is_multi($array) {
    return (count($array) != count($array, 1));
}
27
répondu scronide 2008-09-29 21:02:18

vous pouvez simplement exécuter ceci:

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

si le paramètre de mode optionnel est défini à COUNT_RECURSIVE (ou 1), count() va recursively count le tableau. Ceci est particulièrement utile pour compter tous les éléments d'un tableau multidimensionnel.

si c'est le même, ça veut dire qu'il n'y a pas de sous-niveaux nulle part. Facile et rapide!

9
répondu Pian0_M4n 2015-07-22 14:23:05

je pense que c'est le plus simple et c'est l'état de l'art:

function is_multidimensional(array $array) {
    return count($array) !== count($array, COUNT_RECURSIVE);
}
8
répondu Andreas 2016-05-10 18:16:29

on pourrait voir la case 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.

7
répondu Greg Hewgill 2008-09-28 06:25:25

toutes les bonnes réponses... voici mes trois lignes que j'utilise toujours

function isMultiArray($a){
    foreach($a as $v) if(is_array($v)) return TRUE;
    return FALSE;
}
4
répondu Joe 2013-07-26 02:22:15

cette fonction retournera en nombre de dimensions du tableau (volé de ici ).

function countdim($array)
{
   if (is_array(reset($array))) 
     $return = countdim(reset($array)) + 1;
   else
     $return = 1;

   return $return;
}
2
répondu 2008-09-28 06:26:18

je pense que vous trouverez que cette fonction est la plus simple, la plus efficace et la plus rapide.

function isMultiArray($a){
    foreach($a as $v) if(is_array($v)) return TRUE;
    return FALSE;
}

vous pouvez le tester comme ceci:

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

echo isMultiArray($a) ? 'is multi':'is not multi';
echo '<br />';
echo isMultiArray($b) ? 'is multi':'is not multi';
2
répondu RoboTamer 2012-03-13 04:37:43

vous pouvez aussi faire une simple vérification comme celle-ci:

$array = array('yo'=>'dream', 'mydear'=> array('anotherYo'=>'dream'));
$array1 = array('yo'=>'dream', 'mydear'=> 'not_array');

function is_multi_dimensional($array){
    $flag = 0;
    while(list($k,$value)=each($array)){
        if(is_array($value))
            $flag = 1;
    }
    return $flag;
}
echo is_multi_dimensional($array); // returns 1
echo is_multi_dimensional($array1); // returns 0
1
répondu Prashant 2013-04-25 05:51:30

Essayer comme suit:

if (count($arrayList) != count($arrayList, COUNT_RECURSIVE)) 
{
  echo 'arrayList is multidimensional';

}else{

  echo 'arrayList is no multidimensional';
}
1
répondu Arshid KV 2016-04-01 19:25:47

je pense que celui-ci est classe (accessoires pour un autre utilisateur Je ne sais pas son nom d'utilisateur):

static public function isMulti($array)
{
    $result = array_unique(array_map("gettype",$array));

    return count($result) == 1 && array_shift($result) == "array";
}
0
répondu Alfonso Fernandez-Ocampo 2014-10-17 00:30:10

Toutes les méthodes ci-dessus sont trop complexes pour un déroulement rapide. Si un tableau est plat, tester le premier élément devrait retourner un e primitif.G int, string E. T. C. S'il est multidimensionnel, il devrait retourner un tableau. Par extension, vous pouvez utiliser ce liner rapide et soigné.

echo is_array(array_shift($myArray));

si cela est vrai, le tableau est multidimensionnel. Sinon, il 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 d'un modèle, il aura toujours le même type de structure multidimensionnelle ou plate qui peut être traversé par des boucles. machine made loops Si ce n'est pas le cas, alors vous avez personnalisé construit à la main, ce qui signifie que vous savez où tout sera Et il fonctionne tout simplement sans avoir besoin d'écrire un algorithme de boucle enter image description here

0
répondu Nelson Emeka Ameyo 2015-09-04 10:17:11

en plus des réponses précédentes et en fonction du schéma du tableau que vous voulez vérifier:

function is_multi_array($array=[],$mode='every_key'){

    $result = false;

    if(is_array($array)){

        if($mode=='first_key_only'){

            if(is_array(array_shift($array))){

                $result = true;
            }
        }
        elseif($mode=='every_key'){

            $result = true;

            foreach($array as $key => $value){

                if(!is_array($value)){

                    $result = false;
                    break;
                }
            }
        }
        elseif($mode=='at_least_one_key'){

            if(count($array)!==count($array, COUNT_RECURSIVE)){

                $result = true; 
            }
        }
    }

    return $result;
}
0
répondu RafaSashi 2016-04-01 19:19:48

Même cela fonctionne

is_array(current($array));

Si false son seule dimension tableau vrai son multi dimension "151950920 tableau.

actuel vous donnera le premier élément de votre tableau et vérifiez si le premier élément est un tableau ou pas par is_array de la fonction.

0
répondu Priyank 2017-04-13 13:17:26

N'utilisez pas COUNT_RECURSIVE

cliquez sur ce site pour savoir pourquoi

utiliser rsort puis utiliser isset

function is_multi_array( $arr ) {
rsort( $arr );
return isset( $arr[0] ) && is_array( $arr[0] );
}
//Usage
var_dump( is_multi_array( $some_array ) );
0
répondu hendra1 2018-02-25 16:06:41

dans mon cas. Je suis resté dans une condition étrange.

1er cas = array("data"=> "name");

Deuxième cas = array("data"=> array("name"=>"username","fname"=>"fname"));

Mais si data a un tableau à la place de la valeur alors la fonction sizeof() ou count() ne fonctionne pas pour cette condition. Puis je crée fonction personnalisée à vérifier.

Si le premier index du tableau ont la valeur, alors il retourne "seulement la valeur"

Mais si index ont tableau au lieu de valeur puis il retourne "a table"

J'utilise de cette façon,

 function is_multi($a) {
        foreach ($a as $v) {
          if (is_array($v)) 
          {
            return "has array";
            break;
          }
          break;
        }
        return 'only value';
    }

remerciements spéciaux à Vinko Vrsalovic

0
répondu Darkcoder 2018-03-27 10:41:32

la fonction native print_r retourne une chaîne lisible par l'homme. Il suffit de compter les instances "Array".

essayez...

substr_count(print_r([...array...], true), 'Array') > 1;

$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)));
$d = array(array());
$e = array(1, array());
$f = array(array(), array());
$g = array("hello", "hi" => "hi there");
$h[] = $g;

var_dump(substr_count(print_r($a, true), 'Array') > 1);
...

//a: bool(true)
//b: bool(false)
//c: bool(true)
//d: bool(true)
//e: bool(true)
//f: bool(true)
//g: bool(false)
//h: bool(true)

Sur ma boîte, "is_multi a pris 0.83681297302246 secondes dans 500000 fois"

Avec La Permission De Ruach HaKodesh

0
répondu Racer X 2018-10-05 19:11:22
if($array[0]){
//enter your code 
}
-1
répondu rthcupid 2014-02-28 11:39:11
if ( array_key_exists(0,$array) ) {

// multidimensional array

}  else {

// not a multidimensional array

}

*seulement pour les tableaux avec index numérique

-1
répondu sudhin babu 2015-03-26 13:07:26
function isMultiArray(array $value)
{
    return is_array(reset($value));
}
-2
répondu jhonatan 2011-11-24 11:00:00
is_array($arr[key($arr)]); 

Pas de boucles, pure et simple.

fonctionne aussi 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 lancerait un avertissement si le tableau n'a pas un 0. )

-3
répondu Carlos 2012-03-13 04:34:15