从多维数组生成HTML

时间:2015-01-31 22:44:55

标签: php html arrays 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>文本需要是数组中的名称。

我需要使用数组中的所有子项。

现在我有这样的事情:

    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>生成多个级别?

2 个答案:

答案 0 :(得分:2)

对于您的情况,似乎递归函数最好。以下可能会:

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,以防止过于深入,我总是添加它作为降低无限递归概率的方法。

希望有所帮助。

答案 1 :(得分:1)

以下是适合您数据的递归示例:

<?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>";
  }