PHP While循环解析
我在PHP while循环中解决问题时遇到了一些问题。基本上,我有一个这种形式的数组(为了简洁起见,更容易用JSON表示) 这个数组大约有150个元素,有几个元素。为了便于查找,节点的键仅为“node”+rowid(在下一部分中) 我试图做的是取任意一个节点,一直到它的父元素为零(I/e没有父元素),然后在每次迭代中获取父元素的标签和slug 到目前为止,我已经使用while循环完成了这项工作,如下所示PHP While循环解析,php,loops,while-loop,Php,Loops,While Loop,我在PHP while循环中解决问题时遇到了一些问题。基本上,我有一个这种形式的数组(为了简洁起见,更容易用JSON表示) 这个数组大约有150个元素,有几个元素。为了便于查找,节点的键仅为“node”+rowid(在下一部分中) 我试图做的是取任意一个节点,一直到它的父元素为零(I/e没有父元素),然后在每次迭代中获取父元素的标签和slug 到目前为止,我已经使用while循环完成了这项工作,如下所示$this->categories是如上所述的数组。问题是循环是不正确的,它的内存达到4gb,
$this->categories
是如上所述的数组。问题是循环是不正确的,它的内存达到4gb,对一个包含150个元素的数组进行了大约5000次循环,每个元素大约有一个父元素,因此应该少于500次迭代
public function ResolveCategoryUrl($id) {
$element=$element=$this->categories['node'.$id];
$parent=$element['parent'];
while(1) {
$prev=$element;
$element=$this->categories['node'.$element['parent']];
$parts[]=$element['slug'];
$breadcrumbs[]=['label'=>$element['label'],'url'=>$element['prefix'].$element['path'].$element['data']['url_postfix']];
$parent=$element['parent'];
if($parent<=1) {
break;
}
}
return [
'path'=>array_reverse($parts),
'breadcrumbs'=>$breadcrumbs
];
}
公共函数ResolveCategoryUrl($id){
$element=$element=$this->categories['node'.$id];
$parent=$element['parent'];
而(1){
$prev=$element;
$element=$this->categories['node'.$element['parent']];
$parts[]=$element['slug'];
$breadcrumbs[]=['label'=>$element['label'],'url'=>$element['prefix']。$element['path']。$element['data']['url\u postfix'];
$parent=$element['parent'];
如果($parentarray\u reverse($parts),
“面包屑”=>$breadcrumbs
];
}
我不知道如何告诉PHP获取一个元素并向上返回到它的父元素,直到parent=0
然后从函数返回我想要的内容
很抱歉,如果解释有困难,我没有其他方法来解释它!这听起来像是一个基本的反向树搜索(从叶节点开始,一直到根)。这在使用递归时很容易实现。您可能正在寻找以下内容:
function visitNode($nodeNum, $output = [])
{
$output[] = $nodeNum;
$element = $this->categories['node' . $nodeNum];
$parent = $element['parent'];
// Recursive case: keep searching until you're at the parent
if($parent != 0) {
return visitNode($parent, $output);
}
// Base Case
return $output;
}
此函数的输出将是一个ID数组,表示从叶节点到其父节点的搜索中访问的节点链。在父节点上调用此函数的输出将是一个带有单个条目的数组
您可能需要放在另一个案例中,以确保类别node+$nodeNum
实际存在,但在其他地方可能更有意义
更新
要使用此函数解决特定问题并构建面包屑(获取所需的特定输出),请执行以下操作:
上面提到的
visitNode
函数完全是为了帮助解决我认为您遇到的问题。此外,最好将该逻辑保持在您尝试执行的操作之外,因为您可能需要在另一个需要不同输出的上下文中执行相同类型的树遍历。你说没有[node0]。如果您确定所有节点都是有序的(没有丢失的数字),那么您可以执行如下操作:
for ($a=$i, $a>=1; $a--)
{
$b = $arrayData[$a];
$label = $b['label'];
}
$i=count($arrayData)//将为您提供节点数
您可以使用如下命令在数组中循环:
for ($a=$i, $a>=1; $a--)
{
$b = $arrayData[$a];
$label = $b['label'];
}
你确定,对于给定的id,你的数据会将你带回id为0的元素吗?乍看之下,代码似乎是正确的,如果问题出在数据上,我们对此无能为力。没有id=0的元素,它是在开始时故意从数组中删除的。你想过递归吗?谢谢,但我不知道它是如何构建$parts的从我最初的问题来看,这个函数的作用是慢慢地向上运行,直到父级=0,在运行过程中添加每个路径和面包屑,这样最终会有一个完整的路径,如/one/two/three(当然,当使用“/”内爆时!)更新的答案,一旦你有了到父级的路径ID,你应该能够按照你想要的方式构建你需要的输出。这个编辑非常棒,谢谢,但由于某种原因,我在函数递归的100个级别上遇到了一个PHP错误。你可能需要对递归大小写的字符串进行严格比较(
if($parent!=“0”)
)或者只做一个简单的相等性检查(如果($parent!=0)
)我更新了答案,只使用简单的相等性检查。这是一个非严格的比较加上数组键中的两位javascript(+而不是“.”),现在可以完美地工作了,谢谢。但是for循环不起作用,因为它在递归树中向上工作,每次都会捕获节点的父节点…for循环将递归整个数组,这是不需要的。只需要从一个元素开始向上工作,直到父节点=0,然后返回answer@J.Doe再看看这个循环-它是starts从末端开始,向上工作到顶部
for ($a=$i, $a>=1; $a--)
{
$b = $arrayData[$a];
$label = $b['label'];
}