从多维数组生成 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>";
  }