[php] 배열이 다차원인지 아닌지 확인?

  1. 배열이 기본 값의 평면 배열 인지 아니면 다차원 배열 인지 확인하는 가장 효율적인 방법은 무엇입니까 ?
  2. 실제로 배열을 반복 is_array()하고 각 요소에서 실행하지 않고이 작업을 수행 할 수있는 방법이 있습니까?


답변

짧은 대답은 ‘두 번째 차원’이 어디든지 될 수 있다면 최소한 암시 적으로 반복하지 않고는 할 수 없다는 것입니다. 첫 번째 항목에 있어야한다면

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)


답변

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


답변

나는 이것이 가장 직접적인 방법이라고 생각하며 최신 기술입니다.

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


답변

간단히 이것을 실행할 수 있습니다.

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

선택적 모드 매개 변수가 COUNT_RECURSIVE(또는 1)로 설정되면 count ()는 배열을 반복적으로 계산합니다. 다차원 배열의 모든 요소를 ​​계산할 때 특히 유용합니다.

동일하면 어디에도 하위 수준이 없음을 의미합니다. 쉽고 빠릅니다!


답변

당신은 체크를 볼 수 있었다 is_array()배열의 첫 번째 요소가 배열 인 경우, 다음 중 나머지도 있다는 가정하에, 첫 번째 요소에.


답변

모든 훌륭한 답변 … 여기 내가 항상 사용하는 세 줄이 있습니다.

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