首页 > 解决方案 > 如何打破 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汽车配件 -> 发动机相关 -> 发动机油


我无法解决这个问题,如果有人能提供任何解决方案来解决这个问题,我将不胜感激。

标签: phparraysbreadcrumbs

解决方案


当你在函数中声明一个静态变量时,它会永远记住它的值。在您第一次通话时,它工作正常,因为它$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
}

推荐阅读