PHP'de sınırsız altkategori listeleme.

Bu yazımızda PHP Programlama Dilin'nde sınırsız alkategori listeleme algoritmasından ve mantığından bahsediyorum.

PHP'de sınırsız altkategori listeleme.
PHP sınırsız altkategori

Merhabalar , bildiğimiz üzere E-ticaret sistemlerinden tutun blog sitelerine kadar çoğu sistemde sınırsız altkategori listeleme kullanılmaktadır (Benim sitemde dahil). 
Bu yazımda ben de sizlere PHP dilinde bunun nasıl yapılacağından bahsedeceğim. Öncelik olarak recursive(Özyinelemeli) fonksiyonlar hakkında bilgi sahibi olmanızda fayda var çünkü algoritmamızda çok önemli bir yere sahip.

Aşağıda gördüğünüz şekilde tablomuzu oluşturuyoruz. Tabloda önemli olan kısım 'ust_kategori
Üst kategori id'si sayesinde bir kategorinin hangi kategorinin altkategorisi olduğunu anlamış oluyoruz.

Veritabanı bağlantı kodlarımızı ve sorgu çekme fonksiyonunu yazıyoruz.

<?php


try{
    $db = new PDO ("mysql:host=localhost;dbname=category",'root','');
    $db->query("SET NAMES utf8");

    function getQuery($query){
        global $db;
        $result = $db->prepare($query);
        $result->execute();
        return $result->fetchAll(PDO::FETCH_ASSOC);
    }
}
catch (PDOException $ex){
    echo "Bir hata ile karşılaşıldı hata kody \n".$ex->getMessage();
}

Kategorileri hiyerarşik yapıda diziye ekleme fonksiyonu.

Bunun ardından veritabanını yormadan kategorileri dizi olarak çekiyoruz. ve aşağıdaki fonksiyonu yazıyoruz.
Fonksiyonun ağaçOlustur olmasının nedeni her kategorinin altkategorisini bulurken altkategorinin de altkategorisini buluyoruz , yani parça parça
dal şeklinde diziler oluşturup ana dizimize aktarıyoruz, bu nedenle ismi agacOlustur.

 

function agacOlustur($dizi, $ustKategori = 0)
{
    $dal = array();
    foreach ($dizi as $eleman) {
        
        if ($eleman['ust_kategori'] == $ustKategori) {

            $alt = agacOlustur($dizi, $eleman['id']);
            if ($alt) {
                $eleman['alt'] = $alt;
            } else {
                $eleman['alt'] = array();
            }
            $dal[] = $eleman;
        }
    }
    return $dal;
}
  1. Fonksiyona parametre olarak yolladığımız $dizi değişkeni bizim veritabanından çektiğimiz kategorilerimiz olacak ve fonksiyon oluşturacağı $dal dizisine ilk olarak atacağı verileri üst kategorisi '0' olanlar olarak belirliyor çünkü onlar anakategoriler.
  2. Ardından , dönen foreach döngümüz dönerken bir kontrol sağlıyor, kontrolde gelen elemanın üstkategori değeri parametre olarak gelen değere eşit mi , eşit ise alta geçiyoruz.
  3. $alt değişkenimiz gelen elemanın da kendine ait verileri var mı diye fonksiyonu tekrar çağırıyor ve tüm kategorileri tekrar yolluyor ancak bu sefer üstkategori olarak gelen elemanın 'id' değerini yolluyor.
  4. Bu sefer fonksiyon diğer eleman için tekrar çalışıyor eğer üstkategori değeri bu yeni elemena ait bir değer var ise özyineleme devam ediyor eğer yok ise bu elemanı $dal dizisine ekleyip return ediyor.
  5. Bu sefer ana kategorimiz için çalışan fonksiyona tekrar gelmiş oluyoruz. ve $alt değişkenimiz dönen diziye eşit oluyor.
  6. $alt değişkenimizin içinin dolu olup olmadığını kontrol ediyoruz.
  7. Eğer dolu ise şu anda ana kategorimiz olan $eleman dizisinin içerisine bir alan daha açıp gelen veriyi yani bir alt kategoriyi ekliyoruz.
  8. Eğer dolu değil ise 'alt' alanına($eleman['alt']) boş bir dizi ekliyoruz.
  9. Bunun ardından bu $eleman dizisini yani ana kategorimiz ve alt kategorilerini $dal dizisine atıyoruz.
  10. Bu işlem üstkategoriler için ana fonksiyonumuzda foreach ile devam ediyor. Diğer alt elemanlar için ise özyineleme olarak çalışmaya devam ediyor.

Dizimizi düzgün bir şekilde listelemek ve kontrol etmek amaçlı aşağıdaki kodu yazıyoruz.

<pre>
    <?php
     print_r(agacOlustur((getQuery("Select * from categories"))));
    ?>
</pre>

 Ardından elde edeceğimiz görüntünün bir kısmı bu şekilde olacaktır, gördüğünüz gibi 
 

 [2] => Array
        (
            [id] => 3
            [cagtegory_name] => Yabancı Dil
            [ust_kategori] => 0
            [alt] => Array
                (
                    [0] => Array
                        (
                            [id] => 4
                            [cagtegory_name] => İngilizce
                            [ust_kategori] => 3
                            [alt] => Array
                                (
                                )

                        )

                    [1] => Array
                        (
                            [id] => 5
                            [cagtegory_name] => Rusça
                            [ust_kategori] => 3
                            [alt] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 6
                                            [cagtegory_name] => Rus dili ve edebiyatı

                                            [ust_kategori] => 5
                                            [alt] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [id] => 7
                                                            [cagtegory_name] => Rus kızları
                                                            [ust_kategori] => 6
                                                            [alt] => Array
                                                                (
                                                                )

                                                        )

                                                )

                                        )

                                )

                        )

                )

Burada gördüğünüz gibi verileri hiyerarşik olarak sıraladık, altkategorisi olmayanların da 'alt' alanınını boş bir dizi olarak ekledik.

Kategorileri hiyerarşik bir şekilde ekrana bastırmak.

Evet dizimizi kendimize uygun olarak oluşturduk peki bu diziyi nasıl kullanacağız ekrana veya herhangi bir tasarıma nasıl uygun bir şekilde kullanacağız ? 
aşağıdaki yazdığım örnek fonksiyon sayesinde "Ul" ve "Li" liste etiketlerini kullanarak şık bir şekilde listeleyebilirsiniz.

/ Kategorileri hiyerarşik bir şekilde yazdırmak için örnek fonksiyon.
function yazdir($dizi){
    
    echo '<ul>';
        foreach ($dizi as $kategori){
            echo '<li>'.$kategori['cagtegory_name'].'</li>';
            if($kategori['alt'])
                yazdir($kategori['alt']);
        }
    echo '</ul>';
}

Bu yazdığımız fonksiyona parametre olarak göndereceğimiz dizi yeni oluşturduğumuz dizi olacaktır. Aşağıda kullanımını ve örnek çıktıyı görebilirsiniz.

 <?php yazdir(agacOlustur((getQuery("Select * from categories"))));
    ?>

Örnek çıktı:

  • Yazılım
  • Teknoloji
  • Yabancı Dil
    • İngilizce
    • Rusça
      • Rus dili ve edebiyatı
        • Rus kızları
  • Babacan

Burada can alıcı nokta özyinelemeli fonksiyon, eğer onun mantığını kavrarsanız yazılım hayatınızda önünüzde bir kapı daha açılmış olacak wink 

Anlamadığınız yerler olursa ve video tarzı birşey yapmamı isterseniz severek yardımcı olacağım.

Anlatacaklarım bu kadardı .
 

Ders videosu: