php - 如何打破 PHP 面包屑循环?
问题描述
我正在使用以下函数来显示数组中的类别面包屑
function breadcrumber($array, $id) {
// declare the storage variable without losing elements during recursion
static $result = [];
if (isset($array[$id])) { // if target exists
$result[] = $array[$id]['name']; // store title text
$parent = $array[$id]['parentID']; // assign new target
unset($array[$id]); // remove possibility of an infinite loop
breadcrumber($array, $parent); // recurse
}
return array_revers($result);
}
调用者:
echo implode(' -> ',breadcrumber(array_column($category,NULL,'id'),4));
大批:
$category = array(
1 => array(
'id' => 1,
'parentID' => 0,
'name' => 'SUV auto parts'
),
2 => array(
'id' => 2,
'parentID' => 1,
'name' => 'Engine Related'
),
3 => array(
'id' => 3,
'parentID' => 2,
'name' => 'Spark Plugs'
),
4 => array(
'id' => 4,
'parentID' => 2,
'name' => 'Engine Oil'
),
5 => array(
'id' => 5,
'parentID' => 1,
'name' => 'Body related'
),
6 => array(
'id' => 6,
'parentID' => 0,
'name' => 'Sedan auto parts'
),
7 => array(
'id' => 7,
'parentID' => 6,
'name' => 'Engine Related'
),
);
这适用于单页/项目页面
SUV汽车配件 -> 发动机相关 -> 发动机油
但是,当我尝试在一页中显示特定类别的所有内容时,此函数输出如下
SUV 汽车配件 -> 发动机相关 -> 机油 -> SUV 汽车配件 -> 发动机相关 -> 发动机油
它以一个循环结束,
例如; 我在机油下面有 3 件物品,并在小盒子的一页中显示,我期待它是,
项目标题 1
迷你说明
商品价格
SUV汽车配件 -> 发动机相关 -> 发动机油
项目标题 2
迷你说明
商品价格
SUV汽车配件 -> 发动机相关 -> 发动机油
项目标题 3
迷你说明
商品价格
SUV汽车配件 -> 发动机相关 -> 发动机油
相反,我得到的输出是
项目标题 1
迷你说明
商品价格
SUV汽车配件 -> 发动机相关 -> 发动机油
项目标题 2
迷你说明
商品价格
SUV 汽车配件 -> 发动机相关 -> 机油 -> SUV 汽车配件 -> 发动机相关 -> 发动机油
项目标题 3
迷你说明
商品价格
SUV汽车配件 -> 发动机相关 -> 发动机油 -> SUV汽车配件 -> 发动机相关 -> 发动机油 -> SUV汽车配件 -> 发动机相关 -> 发动机油
我无法解决这个问题,如果有人能提供任何解决方案来解决这个问题,我将不胜感激。
解决方案
当你在函数中声明一个静态变量时,它会永远记住它的值。在您第一次通话时,它工作正常,因为它$result
是空的。当您第二次调用它时,第一次调用的结果仍然存在,并且只是附加了新结果。这就是面包屑越来越长的原因。
我以不使用静态变量的方式重写了您的方法(如果您不是很小心,很容易导致错误)。
function breadcrumber($array, $id)
{
if (!isset($array[$id])) return [];
$result = [];
$result[] = $array[$id]['name']; // store title text
$parent = $array[$id]['parentID']; // assign new target
unset($array[$id]); // remove possibility of an infinite loop
// prepend the recursion result to the already existing results (effectively replacing the array_reverse)
return array_merge(breadcrumber($array, $parent), $result); // recurse
}
推荐阅读
- c - 函数“gmtime_r”的隐式声明
- r - 如何在 R 中将 Box-Tidwell 函数与逻辑回归一起使用
- java - 如何捕获嵌套的 SMTPAddressFailedException
- c++ - 涉及 const_cast 的意外行为
- node.js - 如何部署 NodeJS 多模块/包项目?(前端和后端)
- r - 无法在 R 3.2.1 中安装 dplyr
- javascript - 如何使用 HTML 和 JS 移动图像
- typescript - Can't use redux-observable with Stencil@one : "Class constructor Observable cannot be invoked without 'new'" error on ActionsObservable class
- flask - Flask: Unknown error although 200 response code is returned
- python - How To Index Range Of 2-D Numpy Array From Different Start Points Sourced From Other Array