2010-03-12 189 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; 
} 

输入:

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 @塞巴斯蒂安我做了改变,但仍然没有得到我想要的结果 –

+0

噢,我想我现在看到它。试试$ in_arr [] = getResp($ element); :-) – 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); 

如果递归函数必须一遍又一遍地访问同一资源再次(在这种情况下,初始阵列),我总是pass this as a reference
我不知道是否可以测量,但我猜测这比复制值更有效率。

+0

我认为这是我需要的,现在测试出来 –

+1

谢谢,这帮了我大忙,也给了我一些关于如何做递归的见解 –