web-dev-qa-db-fra.com

Vérifier si le tableau est multidimensionnel ou non?

  1. 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 ?
  2. Existe-t-il un moyen de le faire sans effectuer de boucle dans un tableau Ni exécuter is_array() sur chacun de ses éléments?
124
Wilco

La réponse courte est non, vous ne pouvez pas le faire sans au moins une boucle implicite si la «deuxième dimension» peut se trouver n'importe où. S'il doit être dans le premier élément, vous feriez simplement 

is_array($arr[0]);

Mais le moyen le plus efficace que j'ai pu trouver consiste à 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 suite de ()):

$ 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-circuiter 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)
121
Vinko Vrsalovic

Utilisez count () deux fois; une fois en mode par défaut et une fois en mode récursif. Si les valeurs correspondent, le tableau est not 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 de l'option mode a été ajoutée dans PHP 4.2.0. Depuis le PHP Docs :

Si le paramètre optionnel mode 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. count () ne détecte pas la récursion infinie.

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

177
zash

Pour PHP 4.2.0 ou plus récent:

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

Vous pouvez simplement exécuter ceci: 

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

Si le paramètre optionnel mode 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 pas de sous-niveaux nulle part. Facile et rapide!

9
Pian0_M4n

Je pense que c’est la voie la plus simple et la plus avancée:

function is_multidimensional(array $array) {
    return count($array) !== count($array, COUNT_RECURSIVE);
}
9
Andreas

Vous pourriez regarder cocher is_array() sur le premier élément, en partant du principe que si le premier élément d'un tableau est un tableau, les autres le sont également.

7
Greg Hewgill

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
Joe

Je pense que vous constaterez que cette fonction est le moyen le plus simple, le plus efficace et le 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
RoboTamer

Cette fonction retournera le nombre entier 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

Essayez comme suit 

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

}else{

  echo 'arrayList is no multidimensional';
}
1
Arshid KV

Vous pouvez également faire un simple contrôle comme celui-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
Prashant

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 devrait renvoyer une primitive, par exemple, int, chaîne e.t.c. S'il est multidimensionnel, il devrait renvoyer un tableau. Par extension, vous pouvez utiliser cette doublure rapide et soignée.

echo is_array(array_shift($myArray));

si cela renvoie true, le tableau est multidimensionnel. Sinon c'est plat. Il faut noter qu’il est très rare que des tableaux aient des dimensions différentes, par exemple. Si vous générez des données à partir d'un modèle, celui-ci aura toujours le même type de structure multidimensionnelle ou plate qui peut être traversée par des boucles. machine made loops Si ce n’est pas le cas, vous l’avez personnalisée à la main, ce qui signifie que vous savez où tout se trouvera et que cela fonctionne sans avoir à écrire un algorithme de bouclage enter image description here

0
Nelson Emeka Ameyo

Dans mon cas. Je suis resté dans diverses conditions étranges.
1er cas = array("data"=> "name");
2ème cas = array("data"=> array("name"=>"username","fname"=>"fname"));
Mais si data a un tableau au lieu de valeur, alors 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, alors il retourne "seule valeur" 
Mais si index possède un tableau au lieu de valeur, il renvoie "has array" 
J'utilise cette façon

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

Un merci spécial à Vinko Vrsalovic

0
Darkcoder

Même cela fonctionne

is_array(current($array));

Si faux son une dimension unique tableau si vrai son une dimension multiple tableau.

current vous donnera le premier élément de votre tableau et vérifiera si le premier élément est un tableau ou non par is_array function.

0
Priyank

N'utilisez pas COUNT_RECURSIVE

cliquez sur ce site pour savoir pourquoi

utilisez rsort puis utilisez 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
hendra1

Je pense que celui-ci est élégant (les accessoires d'un autre utilisateur dont je ne connais pas le nom d'utilisateur):

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

    return count($result) == 1 && array_shift($result) == "array";
}

C'est aussi simple que 

$isMulti = !empty(array_filter($array, function($e) {
                    return is_array($e);
                }));
0
Mohd Abdul Mujib

En plus des réponses précédentes et en fonction du schéma du tableau que vous souhaitez 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
RafaSashi