programing

어레이가 다차원인지 여부를 확인하시겠습니까?

projobs 2022. 9. 25. 11:16
반응형

어레이가 다차원인지 여부를 확인하시겠습니까?

  1. 어레이가 원시값의 플랫 어레이인지 다차원 어레이인지를 확인하는 가장 효율적인 방법은 무엇입니까?
  2. 실제로 어레이를 루프하여 실행하지 않고 이 작업을 수행할 수 있는 방법이 있습니까?is_array()어떻게 할 수 있을까요?

count()를 1회 디폴트모드로 1회, 재귀모드로 1회 사용합니다.값이 일치하면 다차원 배열의 재귀 카운트가 더 높기 때문에 배열은 다차원이 아닙니다.

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

이 옵션의 두 번째 값modePHP 4.2.0에 추가되었습니다.PHP 문서:

옵션 모드 파라미터가 COUNT_RECURSIVE(또는 1)로 설정되어 있는 경우 count()는 어레이를 재귀적으로 카운트합니다.이것은 다차원 배열의 모든 요소를 셀 때 특히 유용합니다.count()는 무한 재귀를 검출하지 않습니다.

단, 이 방법에서는array(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)

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()는 어레이를 재귀적으로 카운트합니다.이것은 다차원 배열의 모든 요소를 셀 때 특히 유용합니다.

만약 그게 똑같다면, 어디에도 서브레벨이 없다는 뜻이죠.쉽고 빠르게!

PHP 7 이후에는 다음과 같이 간단하게 할 수 있습니다.

public function is_multi(array $array):bool
{
    return is_array($array[array_key_first($array)]);
}

확인하실 수 있습니다.is_array()배열의 첫 번째 요소가 배열이면 나머지 요소도 배열이라는 가정 하에 첫 번째 요소에 대해 설명합니다.

이 기능이 가장 간단하고 효율적이며 빠른 방법이라는 것을 알게 될 것입니다.

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

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

이마저도 효과가 있다

is_array(current($array));

false일 경우 단일 차원 배열이 참일 경우 다중 차원 배열이 됩니다.

current는 배열의 첫 번째 요소를 제공하고 첫 번째 요소가 배열인지 여부를 is_array 함수로 확인합니다.

다음과 같이 간단한 검사를 수행할 수도 있습니다.

$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

저 같은 경우에는.나는 여러 가지 이상한 상태에 빠져 있었다.
번째 케이스 = 첫첫번 1 =array("data"=> "name");
번째 케이스 = 두두번 2 2 =array("data"=> array("name"=>"username","fname"=>"fname"));
, 만약 ★★★★★★★★★★★★★★★★.data값이 아닌 배열을 가지면 sizeof() 또는 count() 함수는 이 상태에서는 작동하지 않습니다.그런 다음 체크할 커스텀 함수를 만듭니다.
의 첫 " value"가 반환됩니다.
인덱스에 "array"가됩니다.
는 이렇게 씁니다.

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

Vinko Vrsalovic에게 특별한 감사를 드립니다.

이 함수는 (여기서 도난당한) 어레이 치수의 개수를 반환합니다.

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

이것은 고급이라고 생각합니다(다른 유저에게 제안합니다만, 그 유저의 유저명을 알 수 없습니다.

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

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

다음과 같이 시도합니다.

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

}else{

  echo 'arrayList is no multidimensional';
}

매우 간단합니다.

$isMulti = !empty(array_filter($array, function($e) {
                    return is_array($e);
                }));
$is_multi_array = array_reduce(array_keys($arr), function ($carry, $key) use ($arr) { return $carry && is_array($arr[$key]); }, true);

여기 멋진 라이너가 하나 있어요.모든 키에 대해 반복하여 해당 키의 값이 배열인지 확인합니다.이것이 진실임을 보증한다.

언급URL : https://stackoverflow.com/questions/145337/checking-if-array-is-multidimensional-or-not

반응형