PHP递归函数问题

时间:2017-05-18 09:51:42

标签: php recursion data-structures

我需要遍历以下类型的结构:

            P
        /   |   \
    E1      E2     E3 .....
   / \     /  \    |
  V1  V2  V1  V2   V3  .....
  |   |   |   |    / \
  T1  T2  T3  T4  T5  T6 .....

为了形成具有以下元素的关联数组:

        V1(key) = [T1(E1), T3(E2), ...]
        V2(key) = [T2(E1), T4(E2), ...]
        V3(key) = [T5(E3), T6(E3), ...]
        .....

现在有了棘手的部分:结构实际上已经简化了。我事先不知道我实际需要处理多少个E级节点(图中的3个),或者每个节点有多少个V级节点(但至少有1个节点),此外,每个V级节点也可以有多个T节点。

我尝试使用递归函数来执行此操作(在PHP中)。我将简化代码,因为它有一些关于某些对象的奇怪方法,这些对象对于讨论并不重要。我目前的尝试导致:

        V1(key) = [T1(E1)]
        V2(key) = [T2(E1)]

我认为这意味着遍历只发生在第一个E级“分支”上。

这是我的代码:

$result = [];

$traverser = function($node) use (&$traverser, &$result) {
  $children = $node->getChildrenArray();

  foreach($children as $key=>$child){
    if ($child->nodeType() == 'v_node') {
      $v_node_key = $child->name;

      $t_nodes = $child->getChildrenArray();

        if ( !array_key_exists($v_node_key, $results) ){
          $results[$v_node_key] = [];
        }

        foreach($t_nodes as $keyt=>$t_node) {
          $info_array = $t_node->toArray();
          array_push($results[$v_node_key], $info_array);
        }

    } else if ($child->nodeType() == 'e_node') {
        // keep digging
        return $traverser($child);
    }

  }
};

$traverser($p_node); 

我认为问题在于,一旦我在$traverser内调用foreach函数,它就不会返回并从之前的状态恢复。

任何人都可以建议我应该如何解决这个问题以获得我放在上面的结果吗?

3 个答案:

答案 0 :(得分:1)

嗯,这有点尴尬,我仍然不完全确定这是否是正确的动机,但我通过删除代码中的return解决了这个问题。

我认为返回将允许我退出嵌套函数调用,但我认为它跳出了 第一个 函数调用({{1} } line。。

即便如此,通过将$traverser($p_node);行更改为return $traverser($child);,它就可以完成它必须做的事情。

希望这对任何人都有帮助!

答案 1 :(得分:0)

我没有证明你有什么错误,但我建议你改变你的功能

function traverser($results, $node) {
$children = $node->getChildrenArray();

foreach($children as $key=>$child){
    if ($child->nodeType() == 'v_node') {
      $v_node_key = $child->name;

      $t_nodes = $child->getChildrenArray();

        if ( !array_key_exists($v_node_key, $results) ){
          $results[$v_node_key] = [];
        }

        foreach($t_nodes as $keyt=>$t_node) {
          $info_array = $t_node->toArray();
          array_push($results[$v_node_key], $info_array);
        }

    } else if ($child->nodeType() == 'e_node') {
      // keep digging
      return traverser($child);
    }

  }
  return $results;
}

希望这个帮助

答案 2 :(得分:0)

好吧,既然你知道你将拥有P-> E-> V-> T节点,你可以简单地选择多个foreach循环,就像这样

#include <iostream>

using namespace std;

int main()
{
int i;
int numb;
int p;
cout<<"Enter a size of array"<<endl;
cin>>i;
int Search_Array[i];
for(int j=0; j<i;j++)
{
   Search_Array[j]=j;
}
cout<<"enter a number to search"<<endl;
cin>>numb;
if(numb%2==0)
   {
       p=i*(0.6);
       cout<<"value of p"<<endl<<p<<endl;
   }
   else
   {
       p=i*(0.3);
   }
while(p>0)
 {

   if(Search_Array[p]==numb)
   {
       cout<<endl<<"Search number found at location"<<endl<<p<<endl;
   }
   p--;
   cout<<endl<<p;
   }

return 0;
}