2013-02-08 2 views
0

Я пытаюсь создать дерево меню с помощью 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 и т. Д.), Но когда я нажимаю, чтобы показать детям этого предмета (рукавицы, лук, арбалет и т. Д.), Он дает мне эту ошибку: Предупреждение: неверный аргумент, предоставленный foreach() в test.php в строке 14.

Я знаю, что есть что-то делать с $classes в

foreach ($xml->weapons->$classes->weapon as $cl_weapon) {` 

Я просто не могу придумать другой способ, чтобы получить детей в только той части, хотя (если это имеет смысл).

+0

в основном вы пытаетесь получить '$ xml-> оружие-> Segita Hunter-> weapon', которого не существует. Вам нужно проверить класс '-> weapon-> class [title = Segita Hunter]. Не уверен, как именно симплекс будет обрабатывать подобные вещи. Возможно, нужно «обновить» до полного dom. –

+0

Я понял. Мне просто нужно начать с '$ classes' и перейти оттуда. Пример: '$ classes-> weapon'. Удерживает true и в следующем блоке foreach. – Matt

ответ

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> 
Смежные вопросы