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)