배열이 다차원인지 확인하고 있습니까?
-
02-07-2019 - |
문제
- 배열이 다음과 같은지 확인하는 가장 효율적인 방법은 무엇입니까? 원시적 값의 평평한 배열 아니면 만약에 다차원 배열?
- 배열을 실제로 반복하고 실행하지 않고이 작업을 수행 할 수있는 방법이 있습니까?
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니다. (모델에서 데이터를 생성하는 경우, 항상 루프에 의해 통과 할 수있는 동일한 유형의 다차원 또는 평평한 구조를 갖습니다.그렇지 않은 경우, 사용자 정의를 손으로 구축했습니다. 즉, 모든 것이 어디에 있는지 알 수 있으며 루핑 알고리즘을 작성하지 않고도 작동합니다.
이전 답변 외에도 확인하려는 배열의 스키마에 따라 다음과 같습니다.
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이없는 경우 경고를 던질 수 있습니다.)