簡體   English   中英

如何跳出 PHP 面包屑循環?

[英]how to break out of PHP breadcrumb loop?

我正在使用以下函數來顯示數組中的類別面包屑

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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM