- Каков наиболее эффективный способ проверить, является ли массив плоским массивом примитивных значений или если это многомерный массив?
- Есть ли способ сделать это, не
массив и запуск
is_array()
для каждого из его элементов?
Проверка, является ли массив многомерным или нет?
Ответ 1
Короткий ответ: нет, вы не можете сделать это, не зацикливая, хотя бы "второе измерение" может быть где угодно. Если он должен быть в первом элементе, вы просто выполните
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)
Ответ 2
Использовать 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())
.
Ответ 3
Для PHP 4.2.0 или новее:
function is_multi($array) {
return (count($array) != count($array, 1));
}
Ответ 4
Вы можете просто выполнить это:
if (count($myarray) !== count($myarray, COUNT_RECURSIVE)) return true;
else return false;
Если параметр дополнительного режима установлен на COUNT_RECURSIVE
(или 1), count() будет рекурсивно считать массив. Это особенно полезно для подсчета всех элементов многомерного массива.
Если это то же самое, значит, нет подуровней в любом месте. Легко и быстро!
Ответ 5
Я думаю, что это самый прямой путь и это современное состояние:
function is_multidimensional(array $array) {
return count($array) !== count($array, COUNT_RECURSIVE);
}
Ответ 6
Вы можете проверить check is_array()
на первом элементе в предположении, что если первым элементом массива является массив, то остальные из них тоже.
Ответ 7
Все большие ответы... здесь мои три строки, которые я всегда использую
function isMultiArray($a){
foreach($a as $v) if(is_array($v)) return TRUE;
return FALSE;
}
Ответ 8
Эта функция вернет int количество измерений массива (украдено из здесь).
function countdim($array)
{
if (is_array(reset($array)))
$return = countdim(reset($array)) + 1;
else
$return = 1;
return $return;
}
Ответ 9
Я думаю, вы обнаружите, что эта функция является самым простым, эффективным и быстрым способом.
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';
Ответ 10
Вы также можете сделать простую проверку следующим образом:
$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
Ответ 11
Попробуйте сделать следующее
if (count($arrayList) != count($arrayList, COUNT_RECURSIVE))
{
echo 'arrayList is multidimensional';
}else{
echo 'arrayList is no multidimensional';
}
Ответ 12
Я думаю, что этот класс классный (реквизит для другого пользователя, который я не знаю его имя пользователя):
static public function isMulti($array)
{
$result = array_unique(array_map("gettype",$array));
return count($result) == 1 && array_shift($result) == "array";
}
Ответ 13
Все вышеперечисленные методы слишком сложны для быстрого развертывания. Если массив плоский, тестирование первого элемента должно возвращать примитив, например int, string e.t.c. Если он многомерный, он должен возвращать массив. В дополнение, вы можете использовать этот один лайнер быстро и аккуратно.
echo is_array(array_shift($myArray));
если это возвращает true, массив является многомерным. Иначе он плоский. Просто отметить, очень редко для массивов иметь разные размеры, например. если вы генерируете данные из модели, она всегда будет иметь один и тот же тип многомерной или плоской структуры, которая может пересекаться с помощью циклов. Если это не так, то вы создали его вручную, что означает, что вы знаете, где все будет, и он просто работает, не нужно писать алгоритм цикла
Ответ 14
В дополнение к предыдущим ответам и в зависимости от схемы массива, которую вы хотите проверить:
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;
}
Ответ 15
Даже это работает
is_array(current($array));
Если false - массив одиночный размер, если true - массив multi dimension.
current предоставит вам первый элемент вашего массива и проверит, является ли первый элемент массивом или нет функцией is_array.
Ответ 16
Не используйте 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 ) );
Ответ 17
В моем случае. Я застрял в разных странных условиях.
1-й регистр = array("data"=> "name");
2-й регистр = array("data"=> array("name"=>"username","fname"=>"fname"));
Но если у data
есть массив вместо значения, то функция sizeof() или count() не будет работать для этого условия. Затем я создаю пользовательскую функцию для проверки.
Если первый индекс массива имеет значение, то он возвращает "единственное значение"
Но если у индекса есть массив вместо значения, то он возвращает "имеет массив"
Я использую этот способ
function is_multi($a) {
foreach ($a as $v) {
if (is_array($v))
{
return "has array";
break;
}
break;
}
return 'only value';
}
Отдельное спасибо Винко Врсаловичу
Ответ 18
Это так же просто, как
$isMulti = !empty(array_filter($array, function($e) {
return is_array($e);
}));
Ответ 19
if($array[0]){
//enter your code
}
Ответ 20
if ( array_key_exists(0,$array) ) {
// multidimensional array
} else {
// not a multidimensional array
}
* только для тех массивов с числовым индексом
Ответ 21
Нативная функция print_r возвращает читаемую человеком строку. Просто посчитайте экземпляры "Array".
пытаться...
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 заняло 0,83681297302246 секунд в 500000 раз"
Предоставлено Ruach HaKodesh
Ответ 22
function isMultiArray(array $value)
{
return is_array(reset($value));
}
Ответ 23
is_array($arr[key($arr)]);
Нет циклов, простых и простых.
Работает также с ассоциативными массивами не только числовые массивы, которые не могут содержать 0 (как в предыдущем примере, выдается предупреждение, если массив не имеет значения 0.)