Soru - Cevap Bölümü
/ Kategori: Programlama
22/03/2010 - 10:19:57 cevap (4) Okunma : 2813 Bu yazıyı 2 kişi tuttu.
php recursive function dan array oluşturmak
merhaba
burdaki örnekde http://saltokunur.net/showpost.php?p=88885&postcount=2
mysql den verileri cekip ekrana basa biliyorum ancak veri tabanın dan aldıgım bilgiyi array a çevirmem gerekiyor.
şimdiden tesekkürler.
Cevaplar
( Faydalı Cevapları Göster )
merhaba
verdiginiz link i daha önceden göz gezdirmistim gidene çok tesekkürler. forumda sormadan önce baya bi google arastırması yapıyorum.
yapmaya çalısıtıgım sınırsız kategorili tree menu buldugum javascript tree örnegi json destekliydi php recursiveden array olusturamadıgım için mecbur başkabir tree buldum direk html bastım ekrana şimdilik sorunumu çözdüm.
php deki array ı json a çevirmek için şöle bir kod ögrendim ihtiyacı olana.
json_encode( $array)
recursive function dönerken döngünün derinligini ve konumunu kontrol etmeyi hala basaramadım
// function =========================================================================
function Listele($hedef){
$sorgu = mysql_query("select * from tree where parent_id = '".$hedef."'");
if(mysql_num_rows($sorgu) <= 0){
echo("</li>\r"); // enson açilan li etiketinin içerigi olmadigindan kapatiliyor.
return;
}
echo("<ul>\r"); // ul ile yeni bir kategori açiliyor.
while($sonuc = mysql_fetch_assoc($sorgu)){
echo( '<li><span _id="'.$sonuc["id"].'" _p_id="'.$sonuc["parent_id"].'" _u_id="'.$sonuc["urun_id"].'" _tip="'.$sonuc["tip"].'" class="text">'.$sonuc["title"] .'</span>' );
Listele($sonuc["id"]);
}
echo("</ul>\r"); // ul ile açilan kategori kapatiliyor.
}
// end function =========================================================================
kolaygelsin..<<
Derinliğinden kasıt ana menüye bağlı olan alt menüleri almakta mı zorlanıyorsunuz? Biraz daha bilgi verirseniz sanırım uygun bir çözüm yolu bulabiliriz. Benim anladığım veritabanı sorgu sonucunu, sıradaki kayıdın alt menu(kategori ya da içerik de olabilir)'lerini alarak iç içer geçmiş bir array oluşturmak istiyorsunuz?
Bunun için iki fonksiyon oluşturabilirsiniz, birincisi id parametresini aldığı içerie ait alt içerikleri döndürür, gördüğüm kadarı ile verdiğiniz örnekde parent isimli bir alan var, bu o kaydın bağlı olduğu üst kaydı gösteriyor sanırım.
İkinci fonksiyon sıradaki içeriğe ait alt kayıt var mı yok mu kontrol yapan fonksiyon olur. Kısa bir örnekleme yaparsak.
function altMenuVarMi($parent)
{
// varsayılan olarak false döndürelim
$alt_menu= false;
// gönderilen parent değişkenine bağlı içerik var mı sayalım
$sorgu= mysql_query(sprintf("select COUNT(*) AS kayit from tree where parent_id = %d", $parent));
$sonuc= mysql_fetch_assoc($sorgu);
// eğer kayıt var ise
if ($sonuc['kayit'] > 0)
{
$alt_menu= true; // true yani içerik var olarak işaret koyalım
}
return $alt_menu;
}
$dizi = array();
function Listele($hedef= 0, &$dizi)
{
/*
* hedef parametresi 0 dan büyük ise gönderilen değere ait alt kayıtları buluruz
* eğer sıfıra eşit ise parent_id değeri 0 olan ana menü içeriklerini alırız
*/
$sorgu = mysql_query(sprintf("select * from tree where parent_id = %d", $hedef));
// eğer bir kayıt dönmüş ise
if (mysql_num_rows($sorgu) > 0)
{
// kayıtları üzerine sıra ile döndüye girerek gerekli dizi yapısını oluşturalım
while ($sonuc= mysql_fetch_assoc($sorgu))
{
// sıradaki kaydın bilgilerini dizimizde oluşturduğumuz yeni elemana ekleyelim
// menu_3, menu_4, şeklinde dizi elemanlarımızı sıralıyoruz
$dizi['menu_'.$sonuc["id"]]= array (
'id' => $sonuc["id"],
'parent' => $sonuc["parent_id"],
'urun' => $sonuc["urun_id"],
'tip' => $sonuc["tip"],
'tip' => $sonuc["title"]
);
// bu menüye ait alt menüler için boş bir dizi oluşturalım
$dizi['menu_' . $sonuc["id"]]['childs']= array ();
// oluşturduğumuz bu childs elemanını Listele fonksiyonuna $dizi isimli değişkende referans olarak aktaracağız
// bu sayede $dizi['menu_'.$sonuc["id"] elemanının childs elemanına ona ait alt menüleri eklemiş olacağız
// öncelikle bakmamız gereken sıradaki elemana ait alt içerik var mı?
if (altMenuVarMi($sonuc["id"]))
{
// şimdi childs elemanımıza alt içerikleri dolduralım
Listele($sonuc["id"], &$dizi['menu_'.$sonuc["id"]]['childs']);
}
}
}
// sonuç olarak dizimizi döndürelim
return $dizi;
}
print_r(json_encode(Listele(0, &$dizi)))
100% emin değilim çalığ çalışmayacağından fazla zamanım olmadığı için deneme ya da farklı şekilde örneklendirme şansım yok, ancak buna benzer bir şekilde istediğin iç-içe diziyi oluşturman mümkün.
yapmaya çalıstıgım şey tam olarak buydu çok teşekkürler.
Etkinlikler
Toplantı
Özgür Yazılım ve Linux Günleri '10
Özgür Yazılım ve Linux Günleri '10
İstanbul Bilgi Üniversitesi Bilgisayar Bilimleri Bölümü ve Linux Kullanıcıları Derneği'nin 9 yıldır düzenlemekte oldukları etkinlikler bu yıl `Özgür Y...
Kategori:
Toplantı
MMIstanbul Blog'undan
Blog Bölümü Blogevi.com'a Taşınıyor
Selam arkadaşlar MMIstanbul'da , tasarımcı ve programcıların blog yazılarını "feedleyerek" MMIstanbul okurlarını MMIstanbul dışın ...
7.500'üncü üyemiz Cem Koç!
Neler Yapılabilir?
500 Hatası Hakkında!
Reklam, MMIstanbul ve Yeni Projeler (Durumumuz Bu Tarzında)









Selamlar
EPey geç bir yanıt olmakla ve Veritabanı bağlantısı olmamakla birlikte aşağıdaki 3 sayfalık makalede PHP Recursive Foksiyonlar konusu ayrıntılı olarak işlenmiş.
http://www.communitymx.com/content/article.cfm?page=1&cid=7CD16
umarım işine yarar
kolay gelsin