使用PHP和XML的树菜单

时间:2013-02-08 18:06:23

标签: php xml

我正在尝试使用PHP和XML创建树状菜单。

    <MARKET>
      <weapons>
        <class title="Bagi Warrior" div="bagi">
          <weapon name="Gauntlet" div="gauntlet">
          </weapon>
        </class>
        <class title="Segita Hunter" div="hunter">
          <weapon name="Bow" div="bow">
          </weapon>
          <weapon name="Crossbow" div="xbow">
          </weapon>
          <weapon name="Dagger" div="dagger">
          </weapon>
        </class>
        <class title="Incar Magician" div="mage">
          <weapon name="Wand" div="wand">
          </weapon>
          <weapon name="Staff" div="staff">
          </weapon>
        </class>
        <class title="Azure Knight" div="ak">
          <weapon name="1h Axe" div="1ha">
          </weapon>
          <weapon name="2h Axe" div="2ha">
          </weapon>
          <weapon name="1h Mace" div="1hm">
          </weapon>
          <weapon name="2h Mace" div="1hm">
          </weapon>
          <weapon name="1h Sword" div="1hs">
          </weapon>
          <weapon name="2h Sword" div="1hs">
          </weapon>
          <weapon name="Shield" div="shield">
          </weapon>
        </class>
        <class title="Vicious Summoner" div="summy">
          <weapon name="Twin Blades" div="tb">
          </weapon>
          <weapon name="Staff" div="staff">
          </weapon>
        </class>
        <class title="Segnale" div="seg">
          <weapon name="Whip" div="whip">
          </weapon>
        </class>
        <class title="Aloken" div="alo">
          <weapon name="Spear" div="spear">
          </weapon>
        </class>
        <class title="Seguriper" div="ripper">
          <weapon name="Scythe" div="scythe">
          </weapon>
        </class>
        <class title="Concerra Summoner" div="concerra">
          <weapon name="Duel Blades" div="db">
          </weapon>
          <weapon name="Staff" div="staff">
          </weapon>
        </class>
        <class title="Black Wizard" div="wizard">
          <weapon name="Orb" div="orb">
          </weapon>
        </class>
        <class title="Half Bagi" div="hb">
          <weapon name="Great Falchion" div="gf">
          </weapon>
          <weapon name="Katar" div="katar">
          </weapon>
        </class>
      </weapons>
    </MARKET>

我正在尝试使用的PHP:

<?php $xml = simplexml_load_file('market.xml'); ?>
<ul>
  <?php
    foreach ($xml->weapons->class as $classes) {
      $class = $classes["title"];
      $div = $classes["div"]; 
  ?>
  <li><a onClick="document.getElementById('<?=$div ?>').style.display=(document.getElementById('<?=$div ?>').style.display =='none')?'':'none'"><?=$class?></a></li>
    <div id="<?=$div ?>" class="tree" style="display:none">
      <ul>
        <?php
        foreach ($xml->weapons->$classes->weapon as $cl_weapon) {
          $weapon = $cl_weapon["name"];
          $weap_div = $cl_weapon["div"];
        ?>
        <li><a onClick="document.getElementById('<?=$weapon ?>').style.display=(document.getElementById('<?=$weapon ?>').style.display =='none')?'':'none'"><?=$weapon ?></a></li>
    <li>
      <div id="<?=$weap_div ?>" style="display:none">
        <ul>
          <?php
            foreach ($xml->weapons->$classes->$cl_weapon->item as $item) {
              $name = $item->name;
              $level = $item->level;
              echo "<li><a name='".$name."' level='".$level."'>".$name." (".$level.")</a></li>";
            }
          ?>
        </ul>
      </div>
    </li>
    <? } ?>
  </ul>
</div>
  <? } ?>
</ul>

预期结果应为:

Bagi Warrior
->Gauntlet
--->Item (not in XML yet)
--->Item
Segita Hunter
->Bow
--->Item (not in XML yet)
--->Item
->Crossbow
--->Item
--->Item

到目前为止,它正在给我所有的主要物品(Bagi,Hunter等)但是当我点击显示那个项目的孩子(长手套,弓,弩等)时,它给了我这个错误:警告:在第14行的test.php中为foreach()提供的参数无效。

我知道它与

中的$classes有关
foreach ($xml->weapons->$classes->weapon as $cl_weapon) {`

我只是想到了让孩子们只参与那个部分的另一种方式(如果这样做有意义的话)。

1 个答案:

答案 0 :(得分:0)

我明白了。我需要从$classes开始,然后继续前进。正确的编码:

<?php $xml = simplexml_load_file('market.xml'); ?>
<ul>
  <?php
    foreach ($xml->weapons->class as $classes) {
      $class = $classes["title"];
      $div = $classes["div"]; 
  ?>
  <li><a onClick="document.getElementById('<?=$div ?>').style.display=(document.getElementById('<?=$div ?>').style.display =='none')?'':'none'"><?=$class?></a></li>
    <div id="<?=$div ?>" class="tree" style="display:none">
      <ul>
        <?php
        foreach ($classes->weapon as $cl_weapon) {
          $weapon = $cl_weapon["name"];
          $weap_div = $cl_weapon["div"];
        ?>
        <li><a onClick="document.getElementById('<?=$weapon ?>').style.display=(document.getElementById('<?=$weapon ?>').style.display =='none')?'':'none'"><?=$weapon ?></a></li>
    <li>
      <div id="<?=$weap_div ?>" style="display:none">
        <ul>
          <?php
            foreach ($cl_weapon->item as $item) {
              $name = $item->name;
              $level = $item->level;
              echo "<li><a name='".$name."' level='".$level."'>".$name." (".$level.")</a></li>";
            }
          ?>
        </ul>
      </div>
    </li>
    <? } ?>
  </ul>
</div>
  <? } ?>
</ul>