folder Tahribat.com Forumları
linefolder Asp - Php - Cgi - Perl
linefolder [PHP] Recursive Mantığı



[PHP] Recursive Mantığı

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    sokoban
    sokoban's avatar
    Kayıt Tarihi: 23/Ocak/2010
    Erkek

    Hocalar elimde şekildeki gibi birbirine parent-child mantığıyla bağlantılı bir tablo olduğunu varsayalım.

    Ben öyle bir script yazmak istiyorum ki bu parent-child ağacını gezerek bir haritasını çıkartacak ve şuna benzer bir rapor dökecek.

    -Ana kategori

    --1.alt kategori

    ---1.alt kategorinin 1.alt kategorisi

    ----1.alt kategorinin 1.alt kategorisinin 1.alt kategorisi

    ---1. alt kategorini 2.alt kategorisi

    --2.alt kategori

    ---2.alt kategorinin 1.alt kategorisi

    vs. vs.

     

    bun mantığada recursive deniyor sanırım.bu işi yapacak scriptin bana mantığını anlatarak kodla örnekleyecek bir arkadaş arıyorum ki tbt'de %100 vardır öyle birisi :) ama lütfen sadece hazır kodları yapıştırıp al bunu kullan demeyin ben olayı kavramak istiyorum mantığı anlatın.


    .
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Cosmic
    Cosmic's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    ben şu şekil kullanıyorum.

    kategoriid kategori parentid



    1 Anakategori 0
    -2 altkategori 1
    --3 altaltkategori 2
    2 2. Anakategori 0

    gibi gibi


    Bittik biz bittik
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    sokoban
    sokoban's avatar
    Kayıt Tarihi: 23/Ocak/2010
    Erkek
    Cosmic bunu yazdı

    ben şu şekil kullanıyorum.

    kategoriid kategori parentid



    1 Anakategori 0
    -2 altkategori 1
    --3 altaltkategori 2
    2 2. Anakategori 0

    gibi gibi

    Hocam tek katmanlı oluyor o zaman bende öyle yapıyordum ama şöyle bir durum var misal 2.alt kategorinin 2.kategorisinin alt kategorisinin 2. alt kategorisi gibi dıdısının dıdısı kategoriler oluşturunca onu gördüremiyorum çünkü script bütün alt kategorilere inip çıkamıyor.inip çıksa bile doğru raporlayamıyor aslında ben bu istediğim şeyin örneğinide buldum ama hem ingilizce hem çok karışık kodlanmış açıkçası bişey anlamadım o yüzden bir yardımsever anlatır diye umuyorum :D çok işime yarar bir şey değil yapmasamda olur ama tamamen merak hocam .Günlerdir bunu düşünüyorum öğrenmem lazım kafayı yerim taktım :D


    .
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    NmC
    NmC's avatar
    Kayıt Tarihi: 23/Kasım/2008
    Erkek

    Hocam şöyle düşün bi class olsun node isminde. (Bu arada syntax a pek dikkat etmicem mantığı anlaman için yazıyorum sadece)

    class Node{

    string deger;

    Node solNode;

    Node sagNode;

    }

    bu ağaç üzerindeki her elemanı temsil ediyor.

    function agacTara(Node agac){

    // agactaki elemanin degerini yaz

    echo agac->deger;

    // agacin sag ve sol yapragi da bos ise en son adima geldik demektir fonksiyondan cik.

    if(agac->solNode == null && agac->sagNode == null){

     

    return;

    }else {

    // agacin sol yapragi bos degil ise ayni fonksiyonu sol için cagir.

    if(agac->solNode != null){

    return agacTara(agac->solNode);

    }

    // agacin sag yapragi bos degil ise ayni fonksiyonu sol için cagir.

    if(agac->sagNode != null){

    return agacTara(agac->sagNode);

    }

     

    }

    }

     

    yüzeysel olarak bu şekilde. Hata yapmış olabilirim emin değilim şu an :)

    Bu yapıya depth first search deniyor. Farklı çözümler de var ayrıntısına burdan bakarsın.

    http://en.wikipedia.org/wiki/Tree_traversal

     


    There are 10 types of people in the world. Those who knows binary and those who dont...
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    sokoban
    sokoban's avatar
    Kayıt Tarihi: 23/Ocak/2010
    Erkek
    NmC bunu yazdı

    Hocam şöyle düşün bi class olsun node isminde. (Bu arada syntax a pek dikkat etmicem mantığı anlaman için yazıyorum sadece)

    class Node{

    string deger;

    Node solNode;

    Node sagNode;

    }

    bu ağaç üzerindeki her elemanı temsil ediyor.

    function agacTara(Node agac){

    // agactaki elemanin degerini yaz

    echo agac->deger;

    // agacin sag ve sol yapragi da bos ise en son adima geldik demektir fonksiyondan cik.

    if(agac->solNode == null && agac->sagNode == null){

     

    return;

    }else {

    // agacin sol yapragi bos degil ise ayni fonksiyonu sol için cagir.

    if(agac->solNode != null){

    return agacTara(agac->solNode);

    }

    // agacin sag yapragi bos degil ise ayni fonksiyonu sol için cagir.

    if(agac->sagNode != null){

    return agacTara(agac->sagNode);

    }

     

    }

    }

     

    yüzeysel olarak bu şekilde. Hata yapmış olabilirim emin değilim şu an :)

    Bu yapıya depth first search deniyor. Farklı çözümler de var ayrıntısına burdan bakarsın.

    http://en.wikipedia.org/wiki/Tree_traversal

     

    Hocam yazdığın çözüm tam bahsettiğim şey aslında ama mesela bu 3 yapraklı bir sistem (sağ , sol , orta ) için ya 4-5 tane yaprak varsa bi katmanda o zaman ne yapacağız.Yani her duruma karşı çözüm üreten tek bir mantık yok mu :D ?  ya da ben mi yanlış anladım bu hepsine ortak bir çözüm mü


    .
  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    NmC
    NmC's avatar
    Kayıt Tarihi: 23/Kasım/2008
    Erkek

    Hocam o zaman else içinde döngü ile çağıracaksın diğer fonksiyonları :)

    Node arrayin olduğunu varsayıyorum.

    for(int i = 0; i < agac->size; i++)
    return agacTara(agac->agacArray[i]);

     

    şeklinde olacak else kısmı. if kısmında da bütün hepsi null mı diye kontrol edeceksin. Aslında bu biraz amelece bir yöntem normalde kontrol en alt basamakta yapılır. Yani bulunduğum node null mı? eğer null ise çık şeklinde. Fakat bu şekilde yapınca biraz daha anlaşılır oluyor o yüzden böyle yaptım.

     


    There are 10 types of people in the world. Those who knows binary and those who dont...
  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    sokoban
    sokoban's avatar
    Kayıt Tarihi: 23/Ocak/2010
    Erkek
    NmC bunu yazdı

    Hocam o zaman else içinde döngü ile çağıracaksın diğer fonksiyonları :)

    Node arrayin olduğunu varsayıyorum.

    for(int i = 0; i < agac->size; i++)
    return agacTara(agac->agacArray[i]);

     

    şeklinde olacak else kısmı. if kısmında da bütün hepsi null mı diye kontrol edeceksin. Aslında bu biraz amelece bir yöntem normalde kontrol en alt basamakta yapılır. Yani bulunduğum node null mı? eğer null ise çık şeklinde. Fakat bu şekilde yapınca biraz daha anlaşılır oluyor o yüzden böyle yaptım.

     

    sağol hocam şimdi çok güzel anladım eyv :f 


    .
  8. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Buremba
    Buremba's avatar
    Kayıt Tarihi: 16/Haziran/2006
    Erkek

    recursive algoritma biraz sıkıntılı aslında hele de bi database kullanıyorsan ölümden başka bişey değil. farklı algoritmalar var leaf gibi nmc anlatmış, ben şöyle birşey kullanmıştım:

    atıyorum 79 id'li bir kategori 23 ve 45 idli kategorilerinin altında olsun. 

    "23-45-79-" şeklinde bir sütun daha atıyordum. mesela 45 id'li bir ürünün altındakileri listelemek istedim, parent kısmı 23-45- ile başlayan node'ları sort ediyordum mesela "like '23-45-%'" şeklinde bir sorgu yapıyordum sql'de. sorting işlemi yavaş diyebilirsin ama sutünü indexlediğinde diğer algoritmalardan hızlı çalışacaktır emin ol. araya node ekleme, node silme gibi işlemlerde çok güzel çalışıyor ve leaf algoritması gibi fazla birşey de istemiyor, tek sıkıntısı bir node'un altındaki node'larda ekstradan bir sıralama yapmak istediğinde karışıyor baya işler. zannediyorum sen de böyle birşey istemiyorsun.


    . . .. . ... .
  9. KısayolKısayol reportŞikayet pmÖzel Mesaj
    sokoban
    sokoban's avatar
    Kayıt Tarihi: 23/Ocak/2010
    Erkek
    Buremba bunu yazdı

    recursive algoritma biraz sıkıntılı aslında hele de bi database kullanıyorsan ölümden başka bişey değil. farklı algoritmalar var leaf gibi nmc anlatmış, ben şöyle birşey kullanmıştım:

    atıyorum 79 id'li bir kategori 23 ve 45 idli kategorilerinin altında olsun. 

    "23-45-79-" şeklinde bir sütun daha atıyordum. mesela 45 id'li bir ürünün altındakileri listelemek istedim, parent kısmı 23-45- ile başlayan node'ları sort ediyordum mesela "like '23-45-%'" şeklinde bir sorgu yapıyordum sql'de. sorting işlemi yavaş diyebilirsin ama sutünü indexlediğinde diğer algoritmalardan hızlı çalışacaktır emin ol. araya node ekleme, node silme gibi işlemlerde çok güzel çalışıyor ve leaf algoritması gibi fazla birşey de istemiyor, tek sıkıntısı bir node'un altındaki node'larda ekstradan bir sıralama yapmak istediğinde karışıyor baya işler. zannediyorum sen de böyle birşey istemiyorsun.

    hocam 23-45-79 mantığını ben de bir ilan sisteminde kullanmıştım çok fazla alt kategori vardı bende map diye bir alan açtıydım 1@25@33 gibi bir harita oluşturdum senin gibi ama bu sefer direk bir algoritma yardımıyla bu işi çözmek istedim :D şimdi php'De üzerinde çalışıyorum eğer başarılı olursam oluşturduğum mantığı bu konuda paylaşırım.


    .
  10. KısayolKısayol reportŞikayet pmÖzel Mesaj
    SpArK
    SpArK's avatar
    Kayıt Tarihi: 17/Temmuz/2005
    Erkek

    SAX parserler yukarda belirttiğin tipte okuyup sana nodeları veriyorlar. Ama kendim dolaşıcam dersen Pre-Order treversal yapacaksın.

     

    http://en.wikipedia.org/wiki/Tree_traversal

     

    SpArK tarafından 03/May/13 22:20 tarihinde düzenlenmiştir
  11. KısayolKısayol reportŞikayet pmÖzel Mesaj
    sokoban
    sokoban's avatar
    Kayıt Tarihi: 23/Ocak/2010
    Erkek
    SpArK bunu yazdı

    SAX parserler yukarda belirttiğin tipte okuyup sana nodeları veriyorlar. Ama kendim dolaşıcam dersen Pre-Order treversal yapacaksın.

     

    http://en.wikipedia.org/wiki/Tree_traversal

     

    sağol hocam inceliyim onuda 


    .
Toplam Hit: 1952 Toplam Mesaj: 18