PHP Recursive Fonksiyonlar & Sınırsız alt kategori
Recursive Fonsiyonlar & Sınırsız alt kategori
Önce recursive (özyenilemeli) fonksiyon nedir ona bakalım. Recursive iç içe demek doğru olacaktır. Yani bir fonksiyonu tekrar tekrar kendi yada başka bir fonksiyon içinde kullanmak.
Önce basit bit örnek verelim biraz pekişsin.
burada islem diye fonksiyonumuzda rastgele 0 den 10 a kadar sayı döndürüyoruz. Olayımız islem fonksiyonu kendi için çalıştırıyor olmamız. 5 şi bulduğumuzda fonksiyon duruyor. Değilse kendini yeniliyor. Zaten burayı anladıkmı gerisi daha da kolay recursive fonksiyonda.
function islem(){
$sayi = rand(0,10);
echo $sayi.'
';
if($sayi==5){
echo 'sayı 5 tir
';
} else {
islem();
}
}
echo islem();
/* çıktısı : 9
7
0
10
5 yukarıdaki rakamlar her seferinde değişebilir
sayı 5 tir */
Biraz daha karmaşık yapalım 2 fonksiyonu kendi içlerinden çalıştıralım.
buradaki olayımız bir fonksiyonumuza başlangıçta 1 değerini atıyoruz. Ve yine bir fonksiyonu içinde iki fonksiyonunu çalıştırıyoruz. Gelelim iki fonksiyonuna birden gelen değeri eğer ona gelene kadar çalıştırıyoruz. Sonra basit 1 den 10 sayılarımız ekranda yazılıyor. return ile de fonksiyon içindeki değerleri dışa aktarıyoruz.
function bir($deger=1){
echo $deger.'
';
iki($deger);
return;
}
function iki($gelen){
$gelen++;
if($gelen <= 10){
bir($gelen);
}
return;
}
bir();
/* çıktısı :
1
2
3
4
5
6
7
8
9
10
*/
Sınırsız kategori oluşturabilmenin mantığı çok basit her seferinde üst kategoriyi bulmak yeterli olacaktır.
Örnek :
$urunler = [
[
'id'=>1,
'parent'=>0,
'baslik'=>'Bilgisayar'
],
[
'id'=>2,
'parent'=>0,
'baslik'=>'Elektronik Ürünler'
],
[
'id'=>3,
'parent'=>0,
'baslik'=>'Yazıcılar'
],
[
'id'=>4,
'parent'=>0,
'baslik'=>'Cep Telefonu'
],
[
'id'=>5,
'parent'=>1,
'baslik'=>'Samsung'
],
[
'id'=>6,
'parent'=>1,
'baslik'=>'İphone'
],
[
'id'=>7,
'parent'=>5,
'baslik'=>'S20'
],
[
'id'=>8,
'parent'=>5,
'baslik'=>'S15'
] ,
[
'id'=>9,
'parent'=>8,
'baslik'=>'S15 Kapak'
] ,
[
'id'=>10,
'parent'=>8,
'baslik'=>'S15 Şarjz'
]
];
// dizide ki en önemli unsur parent = kısmı üst kategoriyi belirliyor burasını doğru yazmak yeterli.
function listele($kategori, $parent=0){ // parent yoksa 0 yaz
echo '
- '; foreach($kategori as $kat){ // kategori yi kat değişkenine aktardık if($kat['parent']==$parent){ // olayımızın ilk hanesi burası parent 0 olursa ilk sıramız gelir echo '
- '.$kat['baslik']; listele($kategori, $kat['id']); // ikinci ve asıl olayımız burası listele fonksiyonu tekrar çalıştırıyoruz. Yani her seferinde üst kategoriyi burada belirliyoruz. echo ' '; } } echo '
';
}
echo listele($urunler); // aşağıdaki resimdeki gibi olması gerekiyor