2010-03-12 5 views
0

전역 변수를 사용하여 개체/배열을 구문 분석하는 재귀 함수가 있습니다. 전역 변수를 주석 처리하면 아무 것도 얻을 수 없지만 배열에 남겨두면 배열 자체에 다른 값이 추가됩니다. 여기서 뭔가를 바꿔야합니까?PHP 재귀 전역 변수?

업데이트 # 2 : 원하는 결과를 얻으려면 어떻게해야합니까? 모든 고유 값을 배열에 삽입한다고 생각 했습니까?

function getResp($objectPassed) { 

    foreach($objectPassed as $element) { 
     if(is_object($element)) { 
      // recursive call 
      $in_arr = getResp($element); 
     }elseif(is_array($element)) { 
      $in_arr = getResp($element); 
     } else { 
      // XML is being passed, need to strip it 
      $element = strip_tags($element); 

      // Trim whitespace 
      $element = trim($element); 

      // Push to array 
      if($element != '') { 
       if (!preg_match("/^[0-9]$/", $element)) { 
        if (!in_array($element,$in_arr)) { 
         $in_arr[] = $element; 
        } 
       } 
      } 
     } 
    } 
    return $in_arr; 
} 

INPUT :

stdClass Object 
(
    [done] => 1 
    [queryLocator] => 
    [records] => Array 
     (
      [0] => stdClass Object 
       (
        [type] => typeName 
        [Id] => Array 
         (
          [0] => a0E50000002jxhmEAA 
          [1] => a0E50000002jxhmEAA 
         ) 

       ) 

      [1] => stdClass Object 
       (
        [type] => typeName 
        [Id] => Array 
         (
          [0] => a0E50000002jxYkEAI 
          [1] => a0E50000002jxYkEAI 
         ) 

       ) 

     ) 

    [size] => 2 
) 

RETURN :

Array 
(
    [0] => a0E50000002jxYkEAI 
) 

WANTED RETURN :

Array 
(
    [0] => a0E50000002jxYkEAI 
    [1] => a0E50000002jxhmEAA 
) 
+0

재귀 호출의 반환 값을 저장하지 않아야합니까? 이렇게 : $ in_arr = getResp ($ element); – Sebastian

+0

Thnx @Sebastian 나는 변화를 만들었지 만 여전히 내가 원하는 결과를 얻지 못했다. –

+0

오, 참으로 나는 지금 그것을 본 것 같아. 보십시오 $ in_arr [] = getResp ($ 요소); :-) – Sebastian

답변

5

전역 변수가 필요합니까? 그렇지 않으면 당신이 이런 식으로 단순화 할 수 있습니다 : 당신은 그런

function getResp($objectPassed, &$in_arr = array()) { // <-- note the reference '&' 

    foreach($objectPassed as $element) { 
     if(is_object($element) || is_array($element)) { // <-- else if statement simplified 
      getResp($element,$in_arr); 
     } else { 
      // XML is being passed, need to strip it 
      $element = strip_tags($element); 

      // Trim whitespace 
      $element = trim($element); 

      // Push to array 
      if($element != '' &&      // <-- everything in one test 
       !preg_match("/^[0-9]$/", $element) && 
       !in_array($element,$in_arr)) 
      {      
        $in_arr[] = $element; 
      } 
     } 
    } 
    return $in_arr; 
} 

을 수행

$result = getResp($data); 

재귀 함수 (이 경우에 초기 배열을) 또 다시 같은 리소스에 액세스 할 수있는 경우, I 항상 pass this as a reference입니다.
측정 가능한지는 잘 모르겠지만 값을 복사하는 것보다 훨씬 효율적이라고 추측 할 수 있습니다.

+0

이것이 내가 필요로하는 것 같아요. 지금 시험해보십시오. –

+1

감사합니다. 덕분에 도움이되었습니다. 또한 재귀를 수행하는 방법에 대한 통찰력을주었습니다. –