2013-05-27 3 views
1

Я думаю, что моя проблема проста, но я не мог найти ничего, что могло бы соответствовать мне. У меня есть файл PHP, который позволяет мне отображать информацию из файла XML. Я хотел бы отобразить оттуда 3 случайных элемента из этого файла.Показать случайные элементы из XML в PHP

Вот мой XML

<?xml version="1.0" encoding="UTF-8"?> 
<items> 
    <item> 
     <id>1</id> 
     <thumb>images/portfolio/thumb/website1.jpg</thumb> 
     <titre>website1</titre> 
     <description>Lorem ipsum.</description> 
     <image>images/portfolio/website1.jpg</image> 
     <category>Cat 1</category> 
     <link>portfolio.html</link> 
    </item> 
    <item> 
     <id>2</id> 
     <thumb>images/portfolio/thumb/website2.jpg</thumb> 
     <titre>website2</titre> 
     <description>Lorem ipsum.</description> 
     <image>images/portfolio/website2.jpg</image> 
     <category>Cat 2</category> 
     <link>portfolio.html</link> 
    </item> 
    <item> 
     <id>3</id> 
     <thumb>images/portfolio/thumb/website3.jpg</thumb> 
     <titre>website3</titre> 
     <description>Lorem ipsum.</description> 
     <image>images/portfolio/website3.jpg</image> 
     <category>Cat 3</category> 
     <link>portfolio.html</link> 
    </item> 
    <item> 
     <id>4</id> 
     <thumb>images/portfolio/thumb/website4.jpg</thumb> 
     <titre>website4</titre> 
     <description>Lorem ipsum.</description> 
     <image>images/portfolio/website4.jpg</image> 
     <category>Cat 4</category> 
     <link>portfolio.html</link> 
    </item> 
    <item> 
     <id>5</id> 
     <thumb>images/portfolio/thumb/website5.jpg</thumb> 
     <titre>website5</titre> 
     <description>Lorem ipsum.</description> 
     <image>images/portfolio/website5.jpg</image> 
     <category>Cat 5</category> 
     <link>portfolio.html</link> 
    </item> 
    <item> 
     <id>6</id> 
     <thumb>images/portfolio/thumb/website6.jpg</thumb> 
     <titre>website6</titre> 
     <description>Lorem ipsum.</description> 
     <image>images/portfolio/website6.jpg</image> 
     <category>Cat 6</category> 
     <link>portfolio.html</link> 
    </item> 
</items> 

Там, мой PHP для отображения моих XML-элементов.

<?php 
    $xmldata = simplexml_load_file('portfolio.xml'); 
    foreach($xmldata->item as $item) { 
      echo '<li class="col4 item ' . $item->category . '">'; 
      echo '<img src="' . $item->thumb . '" alt="">'; 
      echo '<div class="col4 item-info">'; 
      echo '<h3 class="title"><a href="' . $item->image . '" data-rel="prettyPhoto['. $item->category .']">' . $item->titre . '</a></h3>'; 
      echo '</div>'; 
      echo '<div class="item-info-overlay">'; 
      echo '<div>'; 
      echo '<h4>' . $item->category . '</h4>'; 
      echo '<p>' . $item->description . '</p>'; 
      echo '<a href="' . $item->image . '" class="preview" data-rel="prettyPhoto['. $item->category .']">preview</a>'; 
      echo '</div>'; 
      echo '</div>'; 
      echo '</li>'; 
      } 

    ?> 

Благодарим за помощь.

+0

Когда есть более чем один элемент из некоторого типа в том же уровне, SimpleXML сделает массив этих элементов. Просто рандомизируйте индекс этого массива три раза (проверяя дубликаты). – jhc

ответ

0

array_rand Пригодится.

Попробуйте что-то вроде этого:

$xmldata = simplexml_load_file('portfolio.xml'); 
$random = array_rand($xmldata->xpath('item'), 3); 
foreach ($random as $key) { 
    $item = $xmldata->item[$key]; 
    echo '<li class="col4 item ' . $item->category . '">'; 
    echo '<img src="' . $item->thumb . '" alt="">'; 
    echo '<div class="col4 item-info">'; 
    echo '<h3 class="title"><a href="' . $item->image . '" data-rel="prettyPhoto['. $item->category .']">' . $item->titre . '</a></h3>'; 
    echo '</div>'; 
    echo '<div class="item-info-overlay">'; 
    echo '<div>'; 
    echo '<h4>' . $item->category . '</h4>'; 
    echo '<p>' . $item->description . '</p>'; 
    echo '<a href="' . $item->image . '" class="preview" data-rel="prettyPhoto['. $item->category .']">preview</a>'; 
    echo '</div>'; 
    echo '</div>'; 
    echo '</li>'; 
} 

Непроверено

Убедитесь, что вы прочитали о предупреждениях array_rand может производить и использовать счетчик(), чтобы убедиться, что имеется достаточное количество предметов в вашем XML.

+0

Рик, то, как вы называете 'array_rand', будет передавать объект вместо массива. Смотрите мое использование 'xpath', чтобы обойти это. – michi

+0

@michi Спасибо за хедз-ап, я отредактировал свой ответ :-) –

+0

Спасибо Рик и Мичи! он работает отлично. –

1

Здесь мы идем:

$xml = simplexml_load_string($x); // assume XML in $x 
$random = array_rand($xml->xpath("item"),3); 
foreach ($random as $n) echo $xml->item[$n]->titre. "<br />"; 

видеть, что это работает: http://codepad.viper-7.com/WAL1EB

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