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

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

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

     is_array($arr[0]); 

    Но наиболее эффективным способом, который я мог бы найти, является использование цикла foreach в массиве, короткое замыкание всякий раз, когда обнаружено попадание (по крайней мере, неявный цикл лучше, чем прямой для ()):

     $ 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) 

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

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

    Этот вариант второго mode значения был добавлен в PHP 4.2.0. Из документов PHP :

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

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

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

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

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

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

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

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

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

    Все большие ответы … вот мои три строки, которые я всегда использую

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

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

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

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

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

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

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

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

     $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 в $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 

    Попробуйте следующее

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

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

     static public function isMulti($array) { $result = array_unique(array_map("gettype",$array)); return count($result) == 1 && array_shift($result) == "array"; } 

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

     echo is_array(array_shift($myArray)); 

    если это возвращает true, массив является многомерным. Иначе он плоский. Только для того, чтобы массивы имели разные размеры, например, если вы генерируете данные из модели, она всегда будет иметь один и тот же тип многомерной или плоской структуры, которая может пересекаться контурами. машинные петли Если это не так, то вы создали его вручную, что означает, что вы знаете, где все будет, и он просто работает, не нужно писать алгоритм цикла введите описание изображения здесь

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

     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; } 

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

     is_array(current($array)); 

    Если false, это один размерный массив, если true, это многомерный массив.

    current предоставит вам первый элемент вашего массива и проверит, является ли первый элемент массивом или нет функцией is_array .

     function isMultiArray(array $value) { return is_array(reset($value)); } 
     if($array[0]){ //enter your code } 
     if ( array_key_exists(0,$array) ) { // multidimensional array } else { // not a multidimensional array } 

    * только для тех массивов с числовым индексом

     is_array($arr[key($arr)]); 

    Нет петель, простой и простой.

    Работает также с ассоциативными массивами не только числовые массивы, которые не могут содержать 0 (как в предыдущем примере, выдается предупреждение, если массив не имеет значения 0)