【问题标题】:How can I implement multi threaded recursion in PHP?如何在 PHP 中实现多线程递归?
【发布时间】:2012-07-27 08:13:05
【问题描述】:

我在 XML 中有一个类别树,例如

<cat name='cat_1' id='1'>

 <cat name='cat_2' id='2'>
   <cat name='cat_3' id='3'>

   </cat>
 </cat>

 <cat name='cat_4' id='4'>
   <cat name='cat_5' id='5'>

      <cat name='cat_6' id='6'>
        <cat name='cat_7' id='7'>

        </cat>
      </cat>
  </cat>  
 </cat>

</cat>

现在我想实现代码,以便我可以遍历这棵树并按名称查找类别 ID,即如果输入为 cat_6,则结果应为 6;

我做了什么

$xmlCatTree // 是我的简单 xml 对象

class MyClass{   
 public function traverseForId($cat_name , $xmlCatTree )
      {

        if($xmlCatTree->attributes()->name == $cate_name)
            {
              return $xmlCatTree->attributes()->id;
            }
        if(count($item->children())>0){
        foreach($item->children() as $child)
        {
             return $this->traverseForId($cat_name,$child);
        } } 

      } 

}

它非常适用于单个分支,即 cat_2 的子节点将具有正确的结果,但如果我搜索 cat_7 则不会返回任何内容。我的事情是由于分支递归而发生的。我想知道如何应对。

【问题讨论】:

  • 多线程?你这是什么意思?
  • @vascowhite 在多个分支中递归。
  • @vascowhite 在我的代码中通过 foreach 循环创建了多个分支

标签: php recursion


【解决方案1】:

看来,您使用的是SimpleXML,因此我建议直接查询树。

foreach ($xmlCatTree->xpath('//cat[@name=' . $cat_name . ']') as $node)
  return $node->attributes()->id;
}
return null;

这更加优雅,因为它直接反映了您要实现的目标:将属性为“name”且值为“$cat_name”的所有节点提供给我。

或者(因为看起来,ID 已经是类别名称的一部分;))

list($unusedThingy, $id) = array_pad(explode('_', $cat_name, 2), 2, null);
return $id;

但我想那不是真的,你在找什么;)

【讨论】:

  • 我的同事提出了同样的建议,这是完美的,但我提出这个问题的动机是要找出在这种线程递归中实际发生的情况,如果我的观点没有任何其他意义,我会接受这个答案.谢谢你的回答:)
  • +1 - 虽然它很有用,但我避免使用 list() 并跳过带空的参数,因为它看起来 应该 是语法错误,并且 n00bs 可能过来看看这个,并认为您可以跳过 function 带有空的参数(就像您在例如 VBA 中一样),在 PHP 中您会遇到语法错误,然后您会在这里收到关于它立即被关闭并被否决,我们吓跑了新的 SO 成员——这是一个恶性循环。这是 PHP 的错,不是你的错,但我觉得应该尝试以尽可能好(阅读:一致)的方式使用一种糟糕的语言。
  • @DaveRandom 有时我使用$_ 作为临时“我并没有真正使用它。真的!”-变量名,但我不认为这是 PHP 的错,当“谁”可以t 省略函数参数时读取错误消息;)
  • @KingCrunch 同意这里的大多数问题都可以通过 RTFM/JFGI 来回答,但不幸的是,这不会改变。我将list() 视为goto 和变量变量- 是的,你可以,但看在上帝的份上,不要。我讨厌 PHP 的“语言结构”看起来 像函数,但在一个非常微妙的方式实际上并不是函数,list() 尤其如此。从什么时候开始,看起来像函数的东西属于赋值表达式的左侧?哪个 PHP 开发人员认为这是个好主意? (顺便说一句,我绝对不会在这里对你发火)
  • @DaveRandom 好的,我同意,现在,array() 已经消失了,我希望 list() 会跟进 ;) 据我所知,list()array() 是其中两个PHP 中最古老的“构造”,所以我认为责怪实现它的那个是没有意义的。那是另一个时间:D据我所知,这两者都是唯一的两个,以这种方式行事。
【解决方案2】:

你的函数只检查第一个孩子,尝试使用我的代码:

public function traverseForId($cat_name, $xmlCatTree)
{
    if ($xmlCatTree->attributes()->name == $cat_name)
        return $xmlCatTree->attributes()->id;

    foreach ($xmlCatTree->children() as $child) {
        $res = $this->traverseForId($cat_name, $child);
        if($res)
            return $res;
    }
    return NULL;

}

【讨论】:

  • 这是我到目前为止所做的,检查 NULL 响应并毫无希望地杀死分支。它没有问题,但我对此感觉不太好。我通过尝试和错误实现了这一点,但没有有效地理解正在发生的事情..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多