2012-05-04 10 views
2

이 문제를 적절하게 표기하는 방법에 대해서는 확실하지 않지만 배열 내에 중첩 된 배열을 반복해야합니다.이 배열은 다른 배열의 요소 일 수도 있습니다. 처음에는 어떤 배열이 아직 루프되지 않았는지, 그리고 "기본"배열을 완전히 루프 하는지를 태그로 알리는 것이 필요하다고 생각했습니다. (이것이 필요하지 않으며 PHP가 어떻게 든 이것을 임의로 수행한다는 것을 알았지 만) . 문제는 조금 특이한 것처럼 보입니다 - 값을 찾지 못하면 테스트를위한 조건부 클로스가 생략되고, 그 반대의 경우에도 함수는 배열에 중첩 된 값을 어디서나 찾을 것입니다. 어쨌든,이 함수는 다음과 같습니다PHP 루핑 다차원 배열

function loop($arr, $find) { 
    for($i=0;$i<count($arr);$i++) { 
    if($arr[$i] == $find) { 
     print "Found $find"; 
     return true; 
    } else { 
     if(is_array($arr[$i])) { 
     $this->loop($arr[$i], $find); 
     } else { 
     print "Couldn't find $find"; 
     return false; 
     } 
    } 
    } 
} 
+0

'foreach'에 지쳤습니까? – Tibor

+0

무엇이 문제입니까? – shadyyx

+0

@Tibor,'foreach'를 사용하는 것은'for'를 사용하는 것보다 느립니다. 이것은 작은 배열과는 관련이 없지만 다중 레벨 배열 (특히 큰 배열)에서는 빠른 속도 차이가있을 것입니다 ... – shadyyx

답변

1

아마 당신은 같은에 코드를 변경해야합니까?

0

.

var $found = false; 
function loop($arr, $find) { 
    foreach($arr as $k=>$v){ 
    if($find==$v){ 
     $this->found = true; 
    }elseif(is_array($v)){ 
     $this->loop($v, $find); 
    } 
    } 
    return $this->found; 
} 
0

OK, 무엇을 약간 수정에 대한 :

function loop($arr, $find) { 
    for($i=0;$i<count($arr);$i++) { 
     if(is_array($arr[$i])) { 
      $this->loop($arr[$i], $find); 
     } else { 
      if($arr[$i] == $find) { 
       print "Found $find"; 
       return true; 
      } 
     } 
    } 
    return false; 
} 

function array_search_key($needle_key, $array) { 
    foreach($array AS $key=>$value){ 
    if($key == $needle_key) return $value; 
    if(is_array($value)){ 
     if(($result = array_search_key($needle_key,$value)) !== false) 
     return $result; 
    } 
    } 
    return false; 
}