문제

  1. 배열이 다음과 같은지 확인하는 가장 효율적인 방법은 무엇입니까? 원시적 값의 평평한 배열 아니면 만약에 다차원 배열?
  2. 배열을 실제로 반복하고 실행하지 않고이 작업을 수행 할 수있는 방법이 있습니까? is_array() 각 요소마다?
도움이 되었습니까?

해결책

짧은 대답은 '2 차원'이 어디에나있을 수 있다면 적어도 암시 적으로 반복하지 않으면 할 수 없다는 것입니다. 첫 번째 항목에 있어야한다면

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

나는 이것이 가장 간단한 방법이라고 생각하며 최신입니다.

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

이 함수는 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

다음과 같이 시도하십시오

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

}else{

  echo 'arrayList is no multidimensional';
}

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

나는 이것이 고급 스럽다고 생각한다 (다른 사용자에게는 소품이 그의 사용자 이름을 모른다) :

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

    return count($result) == 1 && array_shift($result) == "array";
}

위의 모든 방법은 너무 복잡하여 빠른 롤아웃하기에는 너무 복잡합니다. 배열이 평평한 경우 첫 번째 요소를 테스트하면 원시 int, 문자열 등이 다차원 인 경우 배열을 반환해야합니다. 확장 하여이 하나의 라이너를 빠르고 깔끔하게 사용할 수 있습니다.

echo is_array(array_shift($myArray));

이것이 true를 반환하면 배열은 다차원입니다. 그렇지 않으면 평평합니다. 주목할 때, 배열이 다른 치수를 갖는 것은 매우 드 rare니다. (모델에서 데이터를 생성하는 경우, 항상 루프에 의해 통과 할 수있는 동일한 유형의 다차원 또는 평평한 구조를 갖습니다.machine made loops그렇지 않은 경우, 사용자 정의를 손으로 구축했습니다. 즉, 모든 것이 어디에 있는지 알 수 있으며 루핑 알고리즘을 작성하지 않고도 작동합니다.enter image description here

이전 답변 외에도 확인하려는 배열의 스키마에 따라 다음과 같습니다.

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

만약에 거짓 그것의 a 단일 치수 배열 if 진실 그것의 a 다중 차원 정렬.

현재의 배열의 첫 번째 요소를 제공하고 첫 번째 요소가 배열인지 확인합니다. is_array 기능.

나의 경우에는. 나는 이상한 조건에 따라 갇혀있었습니다.
첫 번째 케이스 = array("data"=> "name");
두 번째 케이스 = array("data"=> array("name"=>"username","fname"=>"fname"));
그러나 만약 data 이 조건에서는 값 대신 value 대신 sizeof () 또는 count () 함수가 작동하지 않습니다. 그런 다음 확인할 사용자 지정 기능을 만듭니다.
배열의 첫 번째 색인이 값을 갖는 경우 "값 만"을 반환합니다.
그러나 인덱스가 값 대신 배열이 있으면 "배열이 있습니다"
나는이 방법을 사용합니다

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

특별히 감사함 Vinko Vrsalovic

그다지 간단합니다

$isMulti = !empty(array_filter($array, function($e) {
                    return is_array($e);
                }));
if($array[0]){
//enter your code 
}
if ( array_key_exists(0,$array) ) {

// multidimensional array

}  else {

// not a multidimensional array

}

*숫자 인덱스가있는 배열에만

Native Print_r 함수는 사람이 읽을 수있는 문자열을 반환합니다. "배열"인스턴스 만 계산하십시오.

노력하다...

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는 500000 배의 0.83681297302246 초를 받았다"

예의 : Ruach Hakodesh

function isMultiArray(array $value)
{
    return is_array(reset($value));
}
is_array($arr[key($arr)]); 

평범하고 단순한 루프가 없습니다.

숫자 배열뿐만 아니라 0을 포함 할 수없는 숫자 배열과도 작동합니다 (이전 예제에서와 같이 배열에 0이없는 경우 경고를 던질 수 있습니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top