is_array()
sur chacun de ses éléments?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)
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())
.
Pour PHP 4.2.0 ou plus récent:
function is_multi($array) {
return (count($array) != count($array, 1));
}
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!
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);
}
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.
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;
}
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';
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;
}
Essayez comme suit
if (count($arrayList) != count($arrayList, COUNT_RECURSIVE))
{
echo 'arrayList is multidimensional';
}else{
echo 'arrayList is no multidimensional';
}
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
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. 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
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
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.
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 ) );
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);
}));
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;
}