我有一个像这样的数组:
SimpleXMLElement Object ( [BrowseNodes] => SimpleXMLElement Object ( [BrowseNode] => SimpleXMLElement Object ( [BrowseNodeId] => 969391031 [Name] => Bambine e ragazze [Children] => SimpleXMLElement Object ( [BrowseNode] => Array ( [0] => SimpleXMLElement Object ( [BrowseNodeId] => 969394031 [Name] => Calze ) [1] => SimpleXMLElement Object ( [BrowseNodeId] => 3635837031 [Name] => Felpe ) [2] => SimpleXMLElement Object ( [BrowseNodeId] => 3635838031 [Name] => Giacche ) [3] => SimpleXMLElement Object ( [BrowseNodeId] => 3635839031 [Name] => Guanti da giocatore ) [4] => SimpleXMLElement Object ( [BrowseNodeId] => 969392031 [Name] => Maglie ) [5] => SimpleXMLElement Object ( [BrowseNodeId] => 4351854031 [Name] => Maglie per tifosi ) [6] => SimpleXMLElement Object ( [BrowseNodeId] => 3635840031 [Name] => Magliette da portiere ) [7] => SimpleXMLElement Object ( [BrowseNodeId] => 969393031 [Name] => Pantaloncini ) [8] => SimpleXMLElement Object ( [BrowseNodeId] => 3635841031 [Name] => Pantaloncini da portiere ) [9] => SimpleXMLElement Object ( [BrowseNodeId] => 3635842031 [Name] => Pantaloni ) [10] => SimpleXMLElement Object ( [BrowseNodeId] => 3635843031 [Name] => Tute da ginnastica ) ) ) [Ancestors] => SimpleXMLElement Object ( [BrowseNode] => SimpleXMLElement Object ( [BrowseNodeId] => 969386031 [Name] => Abbigliamento [Ancestors] => SimpleXMLElement Object ( [BrowseNode] => SimpleXMLElement Object ( [BrowseNodeId] => 937258031 [Name] => Calcio [Ancestors] => SimpleXMLElement Object ( [BrowseNode] => SimpleXMLElement Object ( [BrowseNodeId] => 524013031 [Name] => Categorie [IsCategoryRoot] => 1 [Ancestors] => SimpleXMLElement Object ( [BrowseNode] => SimpleXMLElement Object ( [BrowseNodeId] => 524012031 [Name] => Sport e tempo libero ) ) ) ) ) ) ) ) ) ) )
我需要做的是使用Anchestors构建一个面包屑.列表末尾的那个应该是第一个.所以,作为一个例子:
Sport e tempo libero>分类> CALCIO …
我试图用这种方式迭代xml而没有成功:
$rec=$result->BrowseNodes->BrowseNode->Ancestors->BrowseNode; $bread=array(); function recursive($r) { do{ $bread[]=$r->BrowseNodeId; recursive($r->Ancestors->BrowseNode); }while(isset($r->Ancestors)); $bread=array_reverse($bread); return $bread; } print_r(recursive($rec));
我在stackoverflow上发现了类似的东西,但没有任何建议帮助我解决这个问题.
要使用输出创建递归函数,您需要三件事:
>用于保存当前位置的变量或参数,即代码中的$r.
你有这个权利.
>保存结果的变量或参数,您没有.
起初它似乎是$bread,但它没有保持任何值,因为每次调用recursive()时它都是空的.
一个简单的解决方案是在函数内声明它是全局的.
> if语句,用于检查您没有的停止条件.
相反,您的代码中有一个do-while循环.
那么,你有两个错误.
根据您的代码并尽可能少地修改它,这是正确的代码:
$rec = $result->BrowseNodes->BrowseNode->Ancestors->BrowseNode; $bread = array(); function recursive($r) { global $bread; $bread[] = strval($r->BrowseNodeId); if(isset($r->Ancestors)){ return recursive($r->Ancestors->BrowseNode); }else{ return array_reverse($bread); } } print_r(recursive($rec));
你去吧
更新:我同意@FlameStorm,如果可能,应该避免全局.
我也收到了使用static的建议,但它引入了一个bug.
因此,如果您不确定如何使用它,我建议也避免静电.
这是改进的代码:
$rec = $result->BrowseNodes->BrowseNode->Ancestors->BrowseNode; function recursive($r) { if(isset($r->Ancestors)) $bread = recursive($r->Ancestors->BrowseNode); $bread[] = strval($r->BrowseNodeId); return $bread; } print_r(recursive($rec));
不再需要函数外部的$bread变量.此外,既不使用全局也不使用静态.