从多维数组生成 HTML
Generate HTML from multidimensional array
我想用 php:
生成这样的 HTML 代码
<li id="821">Accessoires tablette et cellulaire
<ul>
<li id="426">Accessoires pour cellulaire
<ul>
<li id="675">Supports et stations d'accueil</li>
<li id="680">Chargeurs maison et automobile
<ul>
<li id="689">Chargeurs pour cellulaire</li>
<li id="690">Chargeurs pour téléphone intelligent</li>
</ul>
</li>
<li id="681" >Pellicules protectrices</li>
<li id="682" >Câbles et adaptateurs pour cellulaire</li>
<li id="683" >Autres accessoires</li>
<li id="684" >Lentilles pour iPhone</li>
<li id="687" >Étuis pour cellulaire</li>
<li id="688" >Accessoires Bluetooth et mains libres</li>
</ul>
<li id="132">Accessoires - iPod et lecteur MP3
<ul>
<li id="238" >Émetteurs FM</li>
<li id="254" >Étuis protecteurs et sacs de transport</li>
<li id="272" >Accessoires</li>
<li id="356" >Lecteurs MP3</li>
</ul>
</li>
<li id="347">Accessoires pour tablette
<ul>
<li id="481" >Stylos et clavier</li>
<li id="482" >Câbles et adaptateurs</li>
<li id="486" >Chargeurs maison et automobile</li>
<li id="489" >Étuis protecteurs et sacs de transport</li>
<li id="485" >Supports et stations d'accueil</li>
</ul>
</li>
</ul>
</li>
来自我在示例中显示的数组。
该数组如下所示:Array example
<li>
HTML id 需要是数组中的 category_id,<li>
文本需要是数组中的名称。
我需要使用数组中的所有 children 到。
现在我有这样的东西:
function generate_tree($item, $key)
{
if ($key == "category_id"){
echo "<li id=\"$item\">";
}
if ($key == "name"){
echo "$item</li>\n";
}
}
array_walk_recursive($cat, 'generate_tree');
但此示例代码将所有项目放在同一级别,如下所示:
<li id="18">Produits</li>
<li id="821">Accessoires tablette et cellulaire</li>
<li id="426">Accessoires pour cellulaire</li>
<li id="675">Supports et stations d'accueil</li>
<li id="680">Chargeurs maison et automobile</li>
<li id="689">Chargeurs pour cellulaire</li>
<li id="690">Chargeurs pour téléphone intelligent</li>
<li id="681">Pellicules protectrices</li>
<li id="682">Câbles et adaptateurs pour cellulaire</li>
<li id="683">Autres accessoires</li>
<li id="684">Lentilles pour iPhone</li>
<li id="687">Étuis pour cellulaire</li>
<li id="688">Accessoires Bluetooth et mains libres</li>
<li id="132">Accessoires - iPod et lecteur MP3</li>
<li id="238">Émetteurs FM</li>
<li id="254">Étuis protecteurs et sacs de transport</li>
<li id="272">Accessoires</li>
<li id="356">Lecteurs MP3</li>
<li id="347">Accessoires pour tablette</li>
<li id="481">Stylos et clavier</li>
<li id="482">Câbles et adaptateurs</li>
<li id="486">Chargeurs maison et automobile</li>
<li id="489">Étuis protecteurs et sacs de transport</li>
<li id="485">Supports et stations d'accueil</li>
<li id="136">Alarmes et sécurité</li>
<li id="825">Domotique</li>
<li id="828">Capteur de température</li>
<li id="618">Carillon de porte et accessoires</li>
<li id="826">Contrôle d'électroménager et de luminaire</li>
如何使用 <ul>
生成多个关卡?
对于您的情况,递归函数似乎是最好的。以下可能会做:
function recursion($level, $data)
{
if($level < 10)
{
foreach($data as $key => $value)
{
//echo <li>
if(!empty($value['children']))
{
//echo <ul> here
recursion($level+1. $value)
//echo </ul> here
}
//echo </li> here
}
}
}
这可以防止编写重复代码,并且是一种相当普遍的做法。我还添加了一个带有检查的变量 $level 以防止走得太深,我总是添加它作为一种减少无限递归概率的方法。
希望对您有所帮助。
这是一个适用于您的数据的递归示例:
<?php
$var1 = array(
'0' => array(
'one' => '426', 'two' => 'alpha', 'three' => array(
'0' => array(
'one' => '675', 'two' => 'beta', 'three' => array() ),
'1' => array(
'one' => '680', 'two' => 'gamma', 'three' => array(
'0' => array(
'one' => '689', 'two' => 'delta', 'three' => array() ),
'1' => array(
'one' => '690', 'two' => 'epsilon', 'three' => array() ), ) ),
'2' => array(
'one' => '681', 'two' => 'zeta', 'three' => array() ),
'3' => array(
'one' => '682', 'two' => 'eta', 'three' => array() ) ) ) );
doit($var1, '');
function doit($a1, $indent) {
if (count($a1) == 0) return;
echo "$indent<ul>\n";
foreach ($a1 as $a2) {
$v1 = $a2['one'];
$v2 = $a2['two'];
echo " $indent<li id=\"$v1\">$v2</li>\n";
doit($a2['three'], " $indent"); }
echo "$indent</ul>\n";
}
?>
编辑:使其通过 HTML 验证:
(Proper way to make HTML nested list?)
function doit($a1, $indent) {
if (count($a1) == 0) return;
echo "\n$indent<ul>\n";
foreach ($a1 as $a2) {
$v1 = $a2['one'];
$v2 = $a2['two'];
echo "$indent<li id=\"$v1\">$v2";
doit($a2['three'], " $indent");
echo "</li>\n"; }
echo "$indent</ul>";
}
我想用 php:
生成这样的 HTML 代码<li id="821">Accessoires tablette et cellulaire
<ul>
<li id="426">Accessoires pour cellulaire
<ul>
<li id="675">Supports et stations d'accueil</li>
<li id="680">Chargeurs maison et automobile
<ul>
<li id="689">Chargeurs pour cellulaire</li>
<li id="690">Chargeurs pour téléphone intelligent</li>
</ul>
</li>
<li id="681" >Pellicules protectrices</li>
<li id="682" >Câbles et adaptateurs pour cellulaire</li>
<li id="683" >Autres accessoires</li>
<li id="684" >Lentilles pour iPhone</li>
<li id="687" >Étuis pour cellulaire</li>
<li id="688" >Accessoires Bluetooth et mains libres</li>
</ul>
<li id="132">Accessoires - iPod et lecteur MP3
<ul>
<li id="238" >Émetteurs FM</li>
<li id="254" >Étuis protecteurs et sacs de transport</li>
<li id="272" >Accessoires</li>
<li id="356" >Lecteurs MP3</li>
</ul>
</li>
<li id="347">Accessoires pour tablette
<ul>
<li id="481" >Stylos et clavier</li>
<li id="482" >Câbles et adaptateurs</li>
<li id="486" >Chargeurs maison et automobile</li>
<li id="489" >Étuis protecteurs et sacs de transport</li>
<li id="485" >Supports et stations d'accueil</li>
</ul>
</li>
</ul>
</li>
来自我在示例中显示的数组。 该数组如下所示:Array example
<li>
HTML id 需要是数组中的 category_id,<li>
文本需要是数组中的名称。
我需要使用数组中的所有 children 到。
现在我有这样的东西:
function generate_tree($item, $key)
{
if ($key == "category_id"){
echo "<li id=\"$item\">";
}
if ($key == "name"){
echo "$item</li>\n";
}
}
array_walk_recursive($cat, 'generate_tree');
但此示例代码将所有项目放在同一级别,如下所示:
<li id="18">Produits</li>
<li id="821">Accessoires tablette et cellulaire</li>
<li id="426">Accessoires pour cellulaire</li>
<li id="675">Supports et stations d'accueil</li>
<li id="680">Chargeurs maison et automobile</li>
<li id="689">Chargeurs pour cellulaire</li>
<li id="690">Chargeurs pour téléphone intelligent</li>
<li id="681">Pellicules protectrices</li>
<li id="682">Câbles et adaptateurs pour cellulaire</li>
<li id="683">Autres accessoires</li>
<li id="684">Lentilles pour iPhone</li>
<li id="687">Étuis pour cellulaire</li>
<li id="688">Accessoires Bluetooth et mains libres</li>
<li id="132">Accessoires - iPod et lecteur MP3</li>
<li id="238">Émetteurs FM</li>
<li id="254">Étuis protecteurs et sacs de transport</li>
<li id="272">Accessoires</li>
<li id="356">Lecteurs MP3</li>
<li id="347">Accessoires pour tablette</li>
<li id="481">Stylos et clavier</li>
<li id="482">Câbles et adaptateurs</li>
<li id="486">Chargeurs maison et automobile</li>
<li id="489">Étuis protecteurs et sacs de transport</li>
<li id="485">Supports et stations d'accueil</li>
<li id="136">Alarmes et sécurité</li>
<li id="825">Domotique</li>
<li id="828">Capteur de température</li>
<li id="618">Carillon de porte et accessoires</li>
<li id="826">Contrôle d'électroménager et de luminaire</li>
如何使用 <ul>
生成多个关卡?
对于您的情况,递归函数似乎是最好的。以下可能会做:
function recursion($level, $data)
{
if($level < 10)
{
foreach($data as $key => $value)
{
//echo <li>
if(!empty($value['children']))
{
//echo <ul> here
recursion($level+1. $value)
//echo </ul> here
}
//echo </li> here
}
}
}
这可以防止编写重复代码,并且是一种相当普遍的做法。我还添加了一个带有检查的变量 $level 以防止走得太深,我总是添加它作为一种减少无限递归概率的方法。
希望对您有所帮助。
这是一个适用于您的数据的递归示例:
<?php
$var1 = array(
'0' => array(
'one' => '426', 'two' => 'alpha', 'three' => array(
'0' => array(
'one' => '675', 'two' => 'beta', 'three' => array() ),
'1' => array(
'one' => '680', 'two' => 'gamma', 'three' => array(
'0' => array(
'one' => '689', 'two' => 'delta', 'three' => array() ),
'1' => array(
'one' => '690', 'two' => 'epsilon', 'three' => array() ), ) ),
'2' => array(
'one' => '681', 'two' => 'zeta', 'three' => array() ),
'3' => array(
'one' => '682', 'two' => 'eta', 'three' => array() ) ) ) );
doit($var1, '');
function doit($a1, $indent) {
if (count($a1) == 0) return;
echo "$indent<ul>\n";
foreach ($a1 as $a2) {
$v1 = $a2['one'];
$v2 = $a2['two'];
echo " $indent<li id=\"$v1\">$v2</li>\n";
doit($a2['three'], " $indent"); }
echo "$indent</ul>\n";
}
?>
编辑:使其通过 HTML 验证:
(Proper way to make HTML nested list?)
function doit($a1, $indent) {
if (count($a1) == 0) return;
echo "\n$indent<ul>\n";
foreach ($a1 as $a2) {
$v1 = $a2['one'];
$v2 = $a2['two'];
echo "$indent<li id=\"$v1\">$v2";
doit($a2['three'], " $indent");
echo "</li>\n"; }
echo "$indent</ul>";
}