簡體   English   中英

PHP類別反向遍歷算法

[英]PHP Category Reverse Traversal Algorithm

我正在嘗試優化具有無限類別深度(除非存在系統內存限制)的電子商務類別系統。 我立即檢索所有類別,並將它們排序為大致如下所示的多維數組:

[array] (
  [0] (
    'CategoryId' => 1,
    'ParentCategoryId' => 0,
    'Title' => 'Category A',
    'SubCategories' => [array] (
      [0] (
        'CategoryId' => 2,
        'ParentCategoryId' => 1,
        'Title' => 'Category B',
        'SubCategories' => [array] (
          [0] (
            'CategoryId' => 3,
            'ParentCategoryId' => 2,
            'Title' => 'Category C'
          )
        )
      )
    )
  )
)

數組中的每個項目實際上都是一個對象,但為簡單起見,我將其寫成類似於數組格式的形式。

我可以使用此功能向下遍歷我的樹:

/**
* Find Branch using Recursive search by Object Key
* @param String     Needle
* @param Array      Haystack
* @return Array
*/
public static function findBranchByKey($key, $needle, $haystack)
{
    foreach ($haystack as $item) 
    {
        if ( $item->$key == $needle || ( is_object($item) && $item = self::findBranchByKey($key, $needle, $item->SubCategories)) ) 
        {
            return $item;
        }
    }
    return false;
}

這將找到具有匹配鍵的對象並將其返回(可能包含更多子類別)。

我的問題是弄清楚如何穿越另一個方向。 例如,使用上面的數據,假設我正在顯示“類別C”,並希望為其父母創建面包屑。 我想不出一個好方法來獲取我的數組,跳轉到特定的子類別,然后向上迭代以獲取每個父級。 這樣的結果數組可能是這樣的,因此很容易將它們吐出面包屑:

 array( 'Category A', 'Category B', 'Category C' )

我可能可以在數據庫中使用SQL進行此操作,但我想一次檢索一次樹,對其進行緩存,並在需要時對該對象執行遍歷,而不是進行大量查詢。

TL; DR; 如何在多維類別的數組中向上遍歷?

可以通過遞歸來完成。

假設此功能應該起作用:

function getPath($id, $tree, &$path = array()) {
    foreach ($tree as $item) {
        if ($item['CategoryId'] == $id) {           
            array_push($path, $item['CategoryId']);
            return $path;
        }
        if (!empty($item['SubCategories'])) {
            array_push($path, $item['CategoryId']);
            if (getPath($id, $item['SubCategories'], $path) === false) {
                array_pop($path);
            } else {
                return $path;
            }

        }
    }
    return false;
}

這個:

$data = array(
    array(
        'CategoryId' => 10,
        'ParentCategoryId' => 0,
        'SubCategories' => array(
            array(
                'CategoryId' => 12,
                'ParentCategoryId' => 1,
                'SubCategories' => array()
            ),
        )
    ),
    array(
        'CategoryId' => 1,
        'ParentCategoryId' => 0,
        'SubCategories' => array(
            array(
                'CategoryId' => 2,
                'ParentCategoryId' => 1,
                'SubCategories' => array()
            ),
            array(
                'CategoryId' => 3,
                'ParentCategoryId' => 1,
                'SubCategories' => array()
            ),
                        array(
                'CategoryId' => 4,
                'ParentCategoryId' => 1,
                'SubCategories' => array(
                    array(
                        'CategoryId' => 5,
                        'ParentCategoryId' => 4,
                        'SubCategories' => array()
                    ),
                )
            )
        )
    )
);

$result = getPath(5, $data);
print_r($result);

將導致:

Array ( [0] => 1 [1] => 4 [2] => 5 )

暫無
暫無

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

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