it-swarm.com.ru

Проверка, является ли массив многомерным или нет?

  1. Каков наиболее эффективный способ проверить, является ли массив плоским массивом Примитивных значений или это многомерный массив ?
  2. Есть ли способ сделать это без фактического прохождения через массив И запуска is_array() на каждом из его элементов?
124
Wilco

Короткий ответ: нет, вы не можете сделать это, по крайней мере, неявно зацикливаясь, если «второе измерение» может быть где угодно. Если это должно быть в первом пункте, вы просто сделаете 

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

Используйте count () дважды; один раз в режиме по умолчанию и один раз в рекурсивном режиме. Если значения совпадают, массив not многомерен, так как многомерный массив будет иметь более высокий рекурсивный счет.

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

Второе значение этой опции mode было добавлено в PHP 4.2.0. Из PHP Документов :

Если для необязательного параметра mode установлено значение COUNT_RECURSIVE (или 1), count () будет рекурсивно считать массив. Это особенно полезно для подсчета всех элементов многомерного массива. count () не обнаруживает бесконечную рекурсию.

Однако этот метод не обнаруживает array(array()).

177
zash

Для PHP 4.2.0 или новее:

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

Вы можете просто выполнить это: 

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

Если для необязательного параметра mode установлено значение COUNT_RECURSIVE (или 1), count () будет рекурсивно считать массив. Это особенно полезно для подсчета всех элементов многомерного массива.

Если это то же самое, значит, нигде нет подуровней. Легко и быстро!

9
Pian0_M4n

Я думаю, что это самый прямой путь, и он современен:

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

Вы можете посмотреть check is_array() на первом элементе, предполагая, что если первый элемент массива является массивом, то и остальные тоже.

7
Greg Hewgill

Все отличные ответы ... вот мои три строки, которые я всегда использую

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

Я думаю, вы найдете, что эта функция является самым простым, эффективным и быстрым способом.

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';
2
RoboTamer

Эта функция вернет int число измерений массива (украдено из здесь ).

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

   return $return;
}
2
creedence.myopenid.com

Попробуйте следующим образом 

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

}else{

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

Вы также можете сделать простую проверку следующим образом:

$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

Все вышеперечисленные методы слишком сложны для быстрого развертывания. Если массив плоский, тестирование первого элемента должно вернуть примитив, например, int, строку e.t.c. Если он многомерный, он должен возвращать массив. Таким образом, вы можете использовать этот лайнер быстро и аккуратно.

echo is_array(array_shift($myArray));

если это возвращает true, массив является многомерным. Иначе он плоский. Просто отметим, что массивы очень редко имеют разные размеры, например если вы генерируете данные из модели, она всегда будет иметь один и тот же тип многомерной или плоской структуры, которую можно обходить циклами. machine made loops Если это не так, то вы создали его вручную, что означает, что вы знаете, где все будет, и это просто работает без необходимости написания алгоритма зацикливания enter image description here

0
Nelson Emeka Ameyo

В моем случае. Я застрял в разных странных условиях.
1-й случай = array("data"=> "name");
2-й случай = array("data"=> array("name"=>"username","fname"=>"fname"));
Но если у data есть массив вместо значения, то функция sizeof () или count () не работает для этого условия. Затем я создаю пользовательскую функцию для проверки .
Если первый индекс массива имеет значение, то он возвращает "только значение" 
Но если индекс имеет массив вместо значения, он возвращает "has array" 
Я использую этот способ

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

Особая благодарность Винко Врсалович

0
Darkcoder

Даже это работает

is_array(current($array));

If false его a одно измерение array if true его a мульти измерение array.

current даст вам первый элемент вашего массива и проверит, является ли первый элемент массивом или нет с помощью is_array function.

0
Priyank

Не используйте COUNT_RECURSIVE

нажмите на этот сайт, чтобы узнать почему

используйте rsort, а затем используйте 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

Я думаю, что этот классный (подпирает другого пользователя, я не знаю его имени пользователя):

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

    return count($result) == 1 && array_shift($result) == "array";
}
0
Alfonso Fernandez-Ocampo

Это так же просто, как 

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

Помимо предыдущих ответов и в зависимости от схемы массива вы хотите проверить:

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