Bu çalışma kod, bu sorunun tipik bir çözüm gibi görünüyor.
O (derin giderse buna kaç seviyeleri üzerinde hiçbir zımni sınırlama ile) kategoriler ve bunların alt tutan ve ondan bir HTML Sırasız liste oluşturur, özyinelemeli bir işlev içinde, sayfanın üzerine dışarı yankılanan çok boyutlu bir dizi alır.
Alt seviyeleri _category_list adlı orijinal geri arama fonksiyonu () _ içerden, özyinelemeli array_walk her dizi elementin 'çocuk' tuşuna () için değer geçirerek varolmaktadırlar.
Tüm HTML kodu işlevi dışında, şablonda var ki böylece nasıl çıktı bu yöntem modifiye edilebilir?
Here's the rundown of the code:
Bu çok-boyutlu dizi çok düzeyli kategori ağacı tutar.
HTML kullanmak önemlidir anahtarları 'adı', 'category_id' ve 'çocuk' vardır. Diğer tuşlar basitlik uğruna aşağıdaki diziden tasfiye edilmiş, ancak yararlı eğer bunlar: 'parent_id' ve 'level' (seviye 1 ile başlayan).
<?php
// the array containing the tree
$categories = array (
'category_id' => '2',
'name' => 'Top Category Name',
'children' => array (
0 => array (
'category_id' => '188',
'name' => 'Category Name',
'children' => array (
0 => array (
'category_id' => '159',
'name' => 'Category Name',
'children' => array (),
),
1 => array (
'category_id' => '160',
'name' => 'Category Name',
'children' => array (),
),
2 => array (
'category_id' => '166',
'name' => 'Category Name',
'children' => array (),
),
),
),
1 => array (
'category_id' => '4',
'name' => 'Category Name',
'children' => array (
0 => array (
'category_id' => '141',
'name' => 'Category Name',
'children' => array (),
),
1 => array (
'category_id' => '142',
'name' => 'Category Name',
'children' => array (),
),
),
),
),
)
?>
.
Bu sonraki fonksiyon HTML çıktısının çoğunluğu üretir, ama kendi içinde HTML kilitler.
Ancak, bunun yerine sağ işlevi onu yankılanan, ben tasarımcıları özelleştirmek için samimi bir şekilde geri görünüm şablona bu verileri aktarmak için bir yol arıyorum.
<?php
// separate the HTML from this function,
// passing $v to the view template for handling
function category_list($v, $k){
switch ($k) {
case 'category_id':
echo "<li id="$v">";
break;
case 'name':
echo "$v";
break;
case 'children':
if(count($v) > 0){
echo "<ul>";
foreach($v as $k=>$v)
array_walk($v, 'category_list');
echo "</ul>";
}
echo "</li>";
break;
}
}
?>
.
Kod sonraki bloğu array_walk () ve yukarıdaki özyinelemeli işleve başvuran yoluyla dizinin ilk seviye çapraz çağrısı ile mevcut şablon html / php. Işlevi kendisini daha sonra 1 veya daha fazla çocuk ile derin kategoriler özyineleme ve yineleme işler. Tabii ki, bu tipik bir yaklaşımdır.
Bu kod yerine sadece dış etiketleri yerine, tüm HTML etiketleri olmalıdır.
<ul>
<?php array_walk($tree,'category_list'); ?>
</ul>
.
İdeal Çözüm:
Burada nihai hedef şablonu tasarımcılarının (erişilemez) yineleme işlevi oluşturmak veya değiştirmek zorunda kalmadan kendi ideal navigasyon yapısını oluşturmak için bir yol bulmak, ne de çok-boyutlu her seviye için bir foreach döngüsü kullanımını gerektiren etmektir dizi. Çözelti, herhangi bir derinlik sınırlamalara bağlı olmamalıdır.
HTML özelleştirmeleri örnekleri ul / li etiketleri içine ek özellikleri yerleştirerek, hatta genellikle CSS ile kayan kapılar efekti elde etmek gezilerinde kullanılan bu tür yayılma etiketleri gibi çıktı metin etrafında yeni etiketler, sarma aralığı olabilir. Bu yüzden uygun bir çözüm en azından bu durum senaryoları desteklemek gerekir düşünüyorum.
Array_walk kullanarak şablonu () gelen dizi yineleme hala sürece geri çağırma işlevi tasarımcının HTML ile birlikte kullanılmak üzere geri şablona istenen değişkenler geçtiği şekilde kullanılabilir olarak, iyi olurdu.
İdeal olarak, array_walk_recursive () kendi yineleyici aslında, ben bu marifetin çözmek çok daha kolay olacağını düşünüyorum kaç düzeyleri derin bilselerdi. Birisi bu konuya bir çözüm bilen sürece, çözüm tamamen farklı olabilir.
Ben de ağacı oluşturmanın javascript yöntemleri kullanmaktan kaçınmak istiyorum. Düğmesini kullanarak önlemek için bir yol varsa, ben de orada önerilere açığım.