PHP İç İçe Diziler
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);
?>
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (12)
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
)
*/
@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.
Kendimce bişeyler yapmaya çalıştım umarım işinize yarar.
https://github.com/makifgokce/unlimited-category
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
Ş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.
- 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)
$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 :)
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 ) )
elindeki arrayi
```php
// buraya yazarak
```
atarmısın.
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);
}
}
}