- 배열이 기본 값의 평면 배열 인지 아니면 다차원 배열 인지 확인하는 가장 효율적인 방법은 무엇입니까 ?
- 실제로 배열을 반복
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;
}