154
  1. 配列がプリミティブ値のフラット配列であるかどうか、または多次元配列であるかどうかを確認するための最も効率的な方法は何ですか?
  2. 実際に配列をループしてis_array()その各要素で実行せずにこれを行う方法はありますか?
4

25 に答える 25

222

count() を 2 回使用します。デフォルト モードで 1 回、再帰モードで 1 回。値が一致する場合、多次元配列の方が再帰回数が多いため、配列は多次元ではありません。

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

このオプションの 2 番目の値modeは、PHP 4.2.0 で追加されました。PHPドキュメントから:

オプションのモード パラメータが COUNT_RECURSIVE (または 1) に設定されている場合、count() は配列を再帰的にカウントします。これは、多次元配列のすべての要素をカウントする場合に特に便利です。count() は無限再帰を検出しません。

ただし、このメソッドは を検出しませんarray(array())

于 2009-06-15T05:33:45.783 に答える
144

簡単に言うと、「2 番目の次元」がどこにでもある可能性がある場合、少なくとも暗黙的にループしないと実行できません。最初の項目にある必要がある場合は、次のようにします

is_array($arr[0]);

しかし、私が見つけることができる最も効率的な一般的な方法は、配列で foreach ループを使用し、ヒットが見つかるたびに短絡することです (少なくとも、暗黙のループは単純な for() よりも優れています)。

$ 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

暗黙のループですが、一致が見つかったらすぐに短絡することはできません...

$ 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)
于 2008-09-28T06:29:31.087 に答える
30

PHP 4.2.0以降の場合:

function is_multi($array) {
    return (count($array) != count($array, 1));
}
于 2008-09-29T21:02:18.860 に答える
11

これを簡単に実行できます:

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

オプションのモード パラメータがCOUNT_RECURSIVE(または 1) に設定されている場合、count() は再帰的に配列をカウントします。これは、多次元配列のすべての要素をカウントする場合に特に便利です。

同じであれば、どこにもサブレベルがないことを意味します。簡単で速い!

于 2014-03-22T17:28:42.370 に答える
8

is_array()配列の最初の要素が配列である場合、残りの要素も配列であるという仮定の下で、最初の要素を確認できます。

于 2008-09-28T06:25:25.933 に答える
8

PHP 7 以降では、次のように簡単に実行できます。

public function is_multi(array $array):bool
{
    return is_array($array[array_key_first($array)]);
}
于 2020-04-11T10:47:47.473 に答える
4

すべての素晴らしい答え...これが私がいつも使用している3つの行です

function isMultiArray($a){
    foreach($a as $v) if(is_array($v)) return TRUE;
    return FALSE;
}
于 2013-07-26T02:22:15.703 に答える
2

この関数は、配列次元の int 数を返します (ここから盗まれました)。

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

   return $return;
}
于 2008-09-28T06:26:18.100 に答える
2

この関数が最も簡単で、最も効率的で、最速の方法であることがわかると思います。

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

次のようにテストできます。

$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';
于 2011-06-10T11:37:12.027 に答える
1

次のような簡単なチェックを行うこともできます。

$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
于 2013-04-25T05:51:30.200 に答える
1

次のようにしてみてください

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

}else{

  echo 'arrayList is no multidimensional';
}
于 2016-04-01T19:25:47.903 に答える
0

上記の方法はすべて複雑すぎて、すぐにロールアウトできません。配列がフラットな場合、最初の要素をテストすると、int、string などのプリミティブが返されます。多次元の場合は、配列が返されます。ひいては、このワンライナーをすばやくきれいに使用できます。

echo is_array(array_shift($myArray));

これが true を返す場合、配列は多次元です。それ以外はフラットです。配列が異なる次元を持つことは非常にまれであることに注意してください。たとえば、モデルからデータを生成している場合、ループでトラバースできる同じタイプの多次元構造またはフラット構造が常に存在します。 機械製ループ そうでない場合は、手動でカスタムビルドしたことになります。つまり、すべてがどこにあるかを知っており、ループアルゴリズムを記述する必要なく機能します。 ここに画像の説明を入力

于 2015-09-04T10:17:11.660 に答える
0

前の回答に加えて、確認する配列のスキーマに応じて、次のようになります。

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;
}
于 2016-04-01T19:19:48.463 に答える
0

次のように簡単です

$isMulti = !empty(array_filter($array, function($e) {
                    return is_array($e);
                }));
于 2019-01-28T13:27:23.990 に答える
-1
if ( array_key_exists(0,$array) ) {

// multidimensional array

}  else {

// not a multidimensional array

}

*数値インデックスを持つ配列のみ

于 2015-03-25T17:09:36.710 に答える
-1
if($array[0]){
//enter your code 
}
于 2014-02-28T11:39:11.913 に答える
-2
function isMultiArray(array $value)
{
    return is_array(reset($value));
}
于 2010-12-01T18:09:21.097 に答える
-2

ネイティブの print_r 関数は、人間が読める文字列を返します。「配列」インスタンスを数えるだけです。

試す...

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)

私のボックスでは、「is_multiは500000回で0.83681297302246秒かかりました」

礼儀:ルアチ・ハコデッシュ

于 2018-10-05T16:27:09.207 に答える
-3
is_array($arr[key($arr)]); 

ループはなく、プレーンでシンプルです。

0 を含むことができない数値配列だけでなく、関連付けられた配列でも機能します (前の例のように、配列に 0 がない場合は警告がスローされます)。

于 2010-06-11T14:25:59.813 に答える