PHP Alt Kategori Algoritması

Merhabalar,

PHP ile sınırsız alt kategori mantığı uygulaması yeni başlayanlar için biraz karmaşık bir yapıdır. Özyinelemeli fonksiyonlar kullanılarak sınırsız alt üyeye sahip elementlerimizi array list olarak sunan bir fonksiyonu sizlerle paylaşmak istiyorum.

Veritabanından kategorilerinizi çektiğinizi ve aşağıda ki şekilde bir diziye sahip olduğunuzu varsayalım.

$categories = array(
    array('id' => 1,  'parent' => 0, 'name' => 'Category A'),
    array('id' => 2,  'parent' => 0, 'name' => 'Category B'),
    array('id' => 3,  'parent' => 0, 'name' => 'Category C'),
    array('id' => 4,  'parent' => 0, 'name' => 'Category D'),
    array('id' => 5,  'parent' => 0, 'name' => 'Category E'),
    array('id' => 6,  'parent' => 2, 'name' => 'Subcategory F'),
    array('id' => 7,  'parent' => 2, 'name' => 'Subcategory G'),
    array('id' => 8,  'parent' => 3, 'name' => 'Subcategory H'),
    array('id' => 9,  'parent' => 4, 'name' => 'Subcategory I'),
    array('id' => 10, 'parent' => 9, 'name' => 'Subcategory J'),
);

Bu diziyi aşağıda hazırladığımız fonksiyona girdi olarak vererek ister en üst kategori düzeyinden istersek alt kategori düzeyinden çıktı alabiliriz.

function findChild(array &$elements, $parentId = 0) {

    $branch = array();    
    foreach ($elements as $element) {
        if ($element['parent_id'] == $parentId) {
            $children = findChild($elements, $element['id']);
            if ($children) {
                $element['children'] = $children;
            }
            $branch[$element['id']] = $element;
        }
    }
    return $branch;
}

Bu fonksiyonu tüm kategorileri listelemekte kullanmak için

$cikti = findChild($categories , 0);

Yada alt kategoriden başlayarak listelemek için

$cikti = array();

$cikti[1] = $categories[0];

$cikti[1][‘children’] = findChild($categories, 1);

Şeklinde kodumuzu çalıştırabiliriz.

Takıldığınız yerde yorum yaparak sorunuzu iletebilirsiniz.

Teşekkürler.

(Not: Fonksiyonu internetten hazır şekilde buldum. Kendi kodum değildir.)

Sevebilirsin...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.