v2.5.2
Giriş yap

PHP İç İçe Diziler

singlestroke
980 defa görüntülendi

Bir iç içe dizi yapısı oluşturdum bu diziler şöyle;

Bilgisayar

-- Bilgisayar Bileşenleri
---- Ram
---- İşlemci
-- Çevre Birimleri
---- Monitor
---- Kulaklık

Ev Aletleri

-- Küçük Ev Aletleri

Eğer bir kategorinin alt kategorisi varsa bu subCats anahtarı ile bir alt dizin olarak tutuluyor.

Aşağıda ki kod da en altta ki dizine ulaşana kadar sürekli foreach döndürüp alt dizin var mı diye kontrol ettiriyorum ama sınırsız bir alt kategori sisteminde ve sağlıklı bir kod yapısına uygun olmadığı aşikar

Çünkü bu şekilde örnek veriyorum 5. alt dizine kadar kontrol sağlayabilirim ama ondan sonrası için sorun olur bunun yerine bir fonksiyon yazılabilir muhtemelen ancak işin içinden çıkamadım ve anlaşılır bir biçim de kodların temiz halini ekledim buyrunuz :)

Bir de sorun şu ki ekrana son hali olan diziyi basarken haliyle artık iç içe olmayan bir dizi haline dönüşecek ama ben alt kategorinin hangisi olduğunu anlamam gerekiyor ki onu ekrana bastırırken
ul - li düzenini sağlayabileyim.

Benim yazdığım kod dan daha bağımsız önerilerinize açığım benim gittiğim yoldan gitmek zorunda değilsiniz.

Şimdiden teşekkürler.

<?php
    $listcats = array();
    foreach($cats as $cat){
        
        array_push($listcats, $cat['title']);
        if (isset($cat['subCats']))
        {
            foreach($cat['subCats'] as $cat){
    
                array_push($listcats, $cat['title']);
                if (isset($cat['subCats']))
                {
                    foreach($cat['subCats'] as $cat){
            
                        array_push($listcats, $cat['title']);
                        if (isset($cat['subCats']))
                        {
                            foreach($cat['subCats'] as $cat){
                    
                                array_push($listcats, $cat['title']);
                                if (isset($cat['subCats']))
                                {
                                    foreach($cat['subCats'] as $cat){
                            
                                        array_push($listcats, $cat['title']);
                                        
                                            
                                    }
                                } 
                            }
                        }  
                    }
                } 
            }
        }
    }
    
    print_r($listcats);
?>
Cevap yaz
Cevaplar (12)
jct
1485 gün önce

@makifgokce Hocam çok teşekkürler yarın deneyip geri dönüş yapıcam, tekrar teşekkürler

makifgokce
1485 gün önce
function Tree($parent_id=0)
{
    global $db;
    $query = $db->prepare("SELECT `id`, `name`, `url`, `parent_id`, `sort_order` FROM `category` WHERE `parent_id` = :parent_id ORDER BY `parent_id`, `sort_order`, `name`");
    $query->bindValue(':parent_id', $parent_id, PDO::PARAM_INT);
    $query->execute();
    $data = [];
    if($query->rowCount() > 0)
    {
        while($category = $query->fetch(PDO::FETCH_ASSOC))
        {
            $sub = Tree($category["id"]);
            $data[] = $category["id"];
            if(!empty($sub)){
                $data['sub_category'] = $sub;
            }
        }
        
    }
    return $data;
}

function Single($parent_id=0)
{
    global $db;
    $query = $db->prepare("SELECT `id`, `name`, `url`, `parent_id`, `sort_order` FROM `category` WHERE `parent_id` = :parent_id ORDER BY `parent_id`, `sort_order`, `name`");
    $query->bindValue(':parent_id', $parent_id, PDO::PARAM_INT);
    $query->execute();
    $data = [];
    if($query->rowCount() > 0)
    {
        while($category = $query->fetch(PDO::FETCH_ASSOC))
        {
            $data[] = $category["id"];
            $sub = Single($category["id"]);
            if(!empty($sub)){
                array_push($data, ...$sub);
            }
        }
        
    }
    return $data;
}

// Örnek:
    print_r(Tree(5));
    /*
    Output:
    Array
    (
        [0] => 6
        [sub_category] => Array
            (
                [0] => 15
                [1] => 16
            )
    
        [1] => 7
        [2] => 8
        [3] => 9
    )
    */
    print_r(Single(5));
    
    /*
    Output:
    Array
    (
        [0] => 6
        [1] => 15
        [2] => 16
        [3] => 7
        [4] => 8
        [5] => 9
    )
    */
jct
1486 gün önce

@makifgokce hocam emeğine sağlık. Şöyle bir ilave yapman mümkünmü. Herhangi bir ana veya alt kategori altında tanımlanmış tüm kategorileri bir dizi halinde nasıl alabiliriz.

Sizin DB'e göre söylecek olursam; 5 ID numaralı "Front-end" kategorisinini alt kategorileri; 6-7-8-15-16 gibi.

makifgokce
1486 gün önce

Kendimce bişeyler yapmaya çalıştım umarım işinize yarar.
https://github.com/makifgokce/unlimited-category

jct
1487 gün önce

Konu PHP Sınırsız Kategori Mantığı ancak birçok yerde yarım yamalak bir sürü fonksiyon var çoğu için geri dönüşüm sıfır. Bende bir süre üzerinde çok kafa yordum ancak işin içinden çıkamadım. Tüm kategorileri hiyerarşik olarak sıralamak yada bir Select içine yazmakta sorun yok. Ancak işi herhangi bir sıradaki bir temel veya alt kategorinin hiyerarşik içeriğine gelince, su koyuvermiştim. Eğer birileri tüm ayrıntıları ile bir paylaşım yaparsa bende çok duacı olucam @TayfunErbilen

singlestroke
1487 gün önce

Şimdilik şöyle halletmiş gibiyim kategorileri listeleme konusun da biraz sıkıntı çekiyorum hala ama olsun :)

CategoryList fonksiyonu biraz gereksiz oldu gibi zaten hali hazır da alt alta olan dizini alıp sadece title anahtarları için tekrar alt alta koymuş olduk şimdi tekrar bu sefer de son halde ki dizin için ul + li yapısını kurmam gerek menü tasarımı yapabilmek için

function.php

        function subCats($topCat){

        include 'config.php';

        $query = $db->query("SELECT * FROM cats WHERE topcat = $topCat", PDO::FETCH_ASSOC);
        if ( $query->rowCount() ){
            
            $cats = array();

            foreach($query as $cat){

                if(!null == subCats($cat['id'])){

                    $cat['subCats'] = subCats($cat['id']);

                }

                array_push($cats, $cat);

            }  

            return $cats;
        }
        $db = null;    
    }

    function CategoryID($cats)
    {
        if (isset($cats))
        {
            $allcats = array();
            foreach($cats as $cat)
            {
                if (isset($cat['id']))
                {
                    array_push($allcats, $cat['id']);
                }
                if (isset($cat['subCats']))
                {
                    foreach($cat['subCats'] as $subcat)
                    {
                        array_push($allcats, $subcat['id']);
                        if (isset($subcat['subCats']))
                        {
                            array_push($allcats, CategoryID($subcat['subCats']));
                        }
                    }
                }
            }

        $allid = array();
        foreach ($allcats as $id){
            if(is_array($id)){
                foreach ($id as $subid){
                    array_push($allid,$subid);
                }
            }else{
                array_push($allid,$id);
            }
        }
        return $allid;
        }
    }
    
    function CategoryList($cats)
    {
        if (isset($cats))
        {
            $listcats = array();
            foreach($cats as $cat)
            {
                if (isset($cat['title']))
                {
                    array_push($listcats, $cat['title']);
                }
                if (isset($cat['subCats']))
                {
                    foreach($cat['subCats'] as $subcat)
                    {
                        array_push($listcats, $subcat['title']);
                        if (isset($subcat['subCats']))
                        {
                            array_push($listcats, CategoryList($subcat['subCats']));
                        }
                    }
                }
            }
            return $listcats;
        }
    } 

search.php

    $topCat = $_GET['cat'];
    $cats = subCats($topCat);


    print_r(CategoryList($cats));
    echo '</br></br>';
    print_r(CategoryID($cats));

Çıktı;

İlk dizinde ki her kategori isminin id değerini de tutmam lazım onun dışında şuan sıkıntı yok.

  1. dizinde ise seçilen kategori ve alt kategorilere ait ürünleri listelemek için seçilen ve alt kategorilerin id leri yer alıyor.
    
    Array ( [0] => Çevre Birimleri [1] => Klavye [2] => Array ( [0] => Mavi [1] => Kırmızı ) [3] => Fare [4] => Bilgisayar Bileşenleri )

    Array ( [0] => 3 [1] => 5 [2] => 7 [3] => 8 [4] => 6 [5] => 4 [6] => 1)
    
makifgokce
1487 gün önce
$listcats = array();
function Category($cats)
{
	global $listcats;
	foreach($cats as $cat)
	{
		if(isset($cat['title']))
		{
			array_push($listcats, strval($cat['title']));
			if (isset($cat['subCats']))
			{
				Category($cat['subCats']);
			}
		}
		
	}
}

Bu sefer oldu sanki :)

singlestroke
1487 gün önce
    Array ( [0] => Array ( [id] => 3 [title] => Çevre Birimleri [subtitle] => [topcat] => 1 [subCats] => Array ( [0] => Array ( [id] => 5 [title] => Klavye [subtitle] => [topcat] => 3 [subCats] => Array ( [0] => Array ( [id] => 7 [title] => Mavi [subtitle] => [topcat] => 5 ) [1] => Array ( [id] => 8 [title] => Kırmızı [subtitle] => [topcat] => 5 ) ) ) [1] => Array ( [id] => 6 [title] => Fare [subtitle] => [topcat] => 3 ) ) ) [1] => Array ( [id] => 4 [title] => Bilgisayar Bileşenleri [subtitle] => [topcat] => 1 ) )
singlestroke
1487 gün önce

Dur dizi bu değil

makifgokce
1487 gün önce

elindeki arrayi

    ```php
        // buraya yazarak
    ```

atarmısın.

singlestroke
1487 gün önce

Malesef çalışmadı.

@makifgokce

makifgokce
1487 gün önce

Bunu denermisin hata yapmadıysam bu işini görür.

	
$listcats = array();
function Category($cats)
{
	global $listcats;
	foreach($cats as $cat)
	{
		array_push($listcats, $cat['title']);
		if (isset($cat['subCats']))
        {
			Category($cat);
		}
	}
}