Özyinelemeli menüsünü işlemek için PHP SPL

2 Cevap php

Ben kategori veri olan bir veritabanında bir tablo var:

id   title       parent 
1    category 1  0
2    category 2  2
3    category 3  3
4    category 4  0

Eeach ebeveyn üst satır kimliği olabilir.

Örneğin, kategori 3 kategori 1 çocuk kategorisinde 2, bir çocuk.

category 1
   category 2
      category 3

category 4

1 - Is there a better way to manipulate this technique? 2 - My implementation is to fetch all the rows in one SQL query, then use a recursive function to build a multi-dimensional array, then I loop through it using multi level foreach to build a menu or whatever. I need a better way using PHP SPL.

Ben tam bir menü ya da benzeri bir öğe yolu da oluşturmak istiyorsanız:

category1 -> catgory 2 -> etc.

ve her satırda kategori seviyesini tutan bir kılavuz oluşturmak.

2 Cevap

Veri kesinlikle hiyerarşik olduğunu ve öyle gibi görünüyor, ben senin veri depolamak için Modifiye Preorder Ağacı Geçişi yöntemini öneriyoruz.

Bir superb article at Sitepoint Bu sorunu tam anlatılır vardır. Sen bir sayfa üzerinde tartışılan komşuluk listesi modeli kullanarak görünür, ama MPTT verilerin bu tip bir okuma-ağır depolama için çok daha etkilidir.

page 2 örneklerini görmek için dışarı atın. Gerçekten mimarisi oldukça mükemmel bir parça bulunuyor.

Geçenlerde benzer kubbe şey tek bir sorgu ve tek bir döngü while kullanarak ettik. Bu, düz bir (dizi) vasıtasıyla bir ağaç veri yapıları (dizi) oluşturmak için başvurular kullanır. Ben bunun için bir ihtiyaç olduğunu hissettim çünkü dahil hiçbir SPL yok. a gist on GitHub iyi bir renk düzeni ile var :)

/**
* Each element in the return array has a 'data' key, holding category data,
* like name, and a 'children' key holding its subcategories.
*
* @param resource $resource MySQL resource resulted from mysql_query
* @param string $id_key Name of the 'id' field
* @param string $parent_id_key Name of the 'parent_id' field
* @param boolean $use_cache Use cached result from previous calls. Defaults to TRUE
* @return array
*/
function categories($resource, $id_key, $parent_id_key, $use_cache = true) {
    // Cache the categories in a static local variable. This way, the query
    // will be executed just for the first function call. Subsequent calls
    // will return imediatelly, unless you tell it not to.
    static $tree = array();

    if ($tree && $use_cache) {
        return $tree;
    }

    // Flat representation of the categories for fast retrieval using array
    // keys. Each element will be referenced in the $tree array. This
    // allows to build a tree data structure using a flat one.
    $flat = array();

    // Reset the $tree, in case $use_cache=false in a subsequent call
    $tree = array();

    while ($row = mysql_fetch_object($resource)) {
        $flat[$row->$id_key] = array(
            'data' => $row,
            'children' => array(),
        );

        if (array_key_exists($row->$parent_id_key, $flat)) {
            // Assign children by reference so that possible subcategories of
            // this one will appear in the tree structure ($tree)
            $flat[$row->$parent_id_key]['children'][] =& $flat[$row->$id_key];
        }

        if ($row->$parent_id_key == 0) {
            // Assign by reference for synchronizing $flat with $tree;
            $tree[] =& $flat[$row->$id_key];
        }
    }

    return $tree;
}

Ayrıca, işlev veritabanının yapısından ayrılmış edilir. Bunu bir mysql_query kaynak, id alanını temsil eden bir dize ve parent_id alanını temsil eden bir dize geçmek gerekir. Kötü kısmı mysql_fetch_object bir çağrı kullanır çünkü PHP mysql uzantısı bağlanmış olmasıdır. Muhtemelen geliştirilebilir.

Diğer bazı avantajı dördüncü (boolean) parametresi önbelleği, geçersiz kılmak için bunu söylemek sürece, sonucu aramalar için sonuç önbelleğe olmasıdır.

Bir göz atın ve size yardımcı olmadığını görmek.