2016-11-03 2 views
0

Я работаю с списком продуктов XML, который отображает список из примерно 20 продуктов, и в каждом <item> есть <description>, а затем один <bullet> для каждого. Вот пример:Разбор нескольких вложенных элементов как неупорядоченный список с помощью SimpleXML с использованием PHP foreach

XML File with <bullet> List

Я использую foreach петлю с SimpleXML тянуть в данном продукте, и все отдельные теги, такие как <image> и <title> работает отлично.

Моя проблема заключается в том, что он обрабатывает только первый <bullet> для каждого продукта, а не все из них. Чтобы исправить это, я попытался добавить цикл for, который нацелен на все вложенные элементы в теге <description> и выводит, как многие из них есть. Но теперь он дает мне первый <bullet> первого элемента XML-файла и помещает его под каждый продукт, вместо того, чтобы показывать несколько патронов для каждого соответствующего продукта, чего я хочу.

Я отправлю свой сценарий и, надеюсь, кто-то сможет указать, где я ошибаюсь.

<?php 
$items = simplexml_load_file('http://www.itclear.com/BestSellers.xml'); 

foreach ($items->channel->item as $item): 
    $title=$item->title; 
    $image=$item->image; 
    $price=$item->price; 
    $description=$item->description; 
    $link=$item->link; 

    echo ' 
      <div class="xsmall-12 medium-6 large-4 columns product"> 
       <div class="inner"> 
        <div class="product-image"> 
         <img class="product-image" src="',$image,'"/> 
        </div> 
       <h2 class="product-title"><strong>',$title,'</strong></h2> 

       <ul>'; 

    $bullets = $items->channel->item->description; 
    for($i=0;$i<=$bullets;$i++){ 
     echo '<li>',$bullets[$i]->bullet,'</li>'; 
    } 

    echo' 
       </ul><span class="product-price">&pound;',$price,'</span> 
       <a class="product-link" href="',$link,'" target="_blank" title="Visit ITC Sales to buy ',$title,'">View Deal <i class="fa fa-angle-right" aria-hidden="true"></i></a> 
      </div> 
     </div>'; 
    endforeach; 

>

Rendered HTML & CSS

ответ

1

Ваша проблема с этой линией:

$bullets = $items->channel->item->description; 

Эта линия не имеет никакого упоминания элементов вы сквозные над во внешнем foreach цикле , так что не имеет никакого способа узнать, на что вы хотите посмотреть: item. Он просто говорит: «Посмотрите на первый <channel> в документе, а затем посмотрите на первый <item>, а затем посмотрите на элементы <description> в этом».

Что вы хотите использовать $item переменную, определенную в цикле, и посмотреть на <description> элементов там:

$bullets = $item->description; 

Но это имя переменной не совсем верно - переменная $bullets теперь занимает одно или более <description> элементов, а не <bullet> элементов под ним. Таким образом, мы должны вместо этого сказать:

$description = $item->description; 
$bullets = $description->bullet; 

Обратите внимание, что мы теперь не нужны $bullets[$i]->bullet, потому что $bullets[$i] уже должен быть <bullet> элементом; вам также понадобится count() пули, которые отсутствуют в вашем коде. Итак, мы имеем:

for($i=0;$i<=count($bullets);$i++){ 
    echo '<li>',$bullets[$i],'</li>'; 
} 

Чтобы упростить все это, вы можете просто использовать один и тот же стиль foreach петли у вас уже есть в верхней части файла:

foreach ($item->description->bullet as $bullet) { 
    echo '<li>',$bullet,'</li>'; 
} 
+0

Для тех, кто читает это, это отлично работает для меня, я уверен, что я пробовал это, но я должен был сделать это по-другому. Спасибо IMSoP – Danny

0

Я также нашел альтернативное решение это для тех, кто тоже сталкивался с подобной проблемой.Вот код:

<?php 

     $xml = 'http://www.itclear.com/BestSellers.xml'; 

     $items = simplexml_load_file($xml); 

     foreach ($items->channel->item as $item) { 

      $title = $item->title; 
      $image=$item->image; 
      $price=$item->price; 
      $description=$item->description; 
      $link=$item->link; 

      echo ' 
      <div class="xsmall-12 medium-6 large-4 columns product"> 
       <div class="inner"> 
        <div class="product-image"> 
         <img class="product-image" src="',$image,'"/> 
        </div> 
       <h2 class="product-title"><strong>',$title,'</strong></h2> 

       <ul class="product-description">'; 

      foreach ($item->description->bullet as $bullet) { 
       echo '<li>'; 
       $b = $bullet; 
       echo $b; 
       echo "</li>"; 

      } 


      echo' 
       </ul><span class="product-price">&pound;',$price,'</span> 
       <a class="product-link" href="',$link,'" target="_blank" title="Visit ITC Sales to buy ',$title,'">View Deal <i class="fa fa-angle-right" aria-hidden="true"></i></a> 
      </div> 
     </div>'; 

     } 

    ?> 
+1

Это не «альтернативное» решение, это именно то, что я написал в конце моего ответа. (За исключением того, что здесь вы создаете переменную '$ b' с точно таким же значением, как' $ bullet', без всякой причины.) – IMSoP

Смежные вопросы