【问题标题】:how to break out of PHP breadcrumb loop?如何打破 PHP 面包屑循环?
【发布时间】:2020-01-10 10:55:04
【问题描述】:

我正在使用以下函数来显示数组中的类别面包屑

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 汽车配件 -> 发动机相关 -> 发动机油


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

【问题讨论】:

  • 在“坏”情况下如何调用面包屑导航功能?
  • 在不知道如何调用函数的情况下,我会尽量不在函数内部使用静态变量,而是通过引用递归调用来传递变量
  • echo implode(' -> ',breadcrumber(array_column($category,NULL,'id'),$item['category_id']));

标签: php arrays breadcrumbs


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-01-18
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多