foreach函数只显示一个

时间:2014-04-12 10:55:38

标签: php xml parsing foreach

PHP的新手,如果问题真的很愚蠢,就不要发疯。

我已经制作了这段代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style>
img {float: left; margin-right: 30px; margin-bottom: 10px;}
</style>
<script src="js/jquery-1.7.2.min.js"></script>
<script src="js/lightbox.js"></script>
<link href="css/lightbox.css" rel="stylesheet" />
<title>Untitled Document</title>
</head>

<body>
<?php
// specify url of xml file
$url = "http://travelplaza.ro/turcia/belek/Belek.xml" ;
// get xml file contents
$xml = simplexml_load_file($url);

// loop begins
foreach ($xml->hotel[0] as $hotel) {
echo $hotel["hotelname"];
echo "&nbsp";
echo $hotel["stars"];
echo "<p>";
echo $hotel->description . "</br>";
echo "</p>";
echo "<p>";
echo "</p>";
}
foreach ($xml->hotel[0]->images[0] as $i) {
echo '<a href="' . $i["url"] . '" rel="lightbox"><img src="' . $i["url"] . '" width="100"     height="100">';
echo "</a>";

}

以上是xml本身..当然有很多酒店。 我想要的结果是从第一家酒店的饲料中获得标题,描述和图片,然后是第二家酒店,依此类推。 相反,我只得到图像。如果我删除了atributes [0],它会给出一个列表,其中包含名称,描述和图片的酒店。我的错误在哪里?我只想展示酒店,描述和图像。任何帮助都会被贬低。 谢谢。 编辑:如果我只想显示酒店[45]的描述和图像?

xml看起来像这样:

<hotels>
<hotel hotelcode="xxx">
<description>
 bla bla
 </description>
 <images>
 <image url="http"/>
 </images>
 </hotel>

以上重复,最后一个我有结束标记。 xml文件是这样的:     http://travelplaza.ro/turcia/belek/Belek.xml

3 个答案:

答案 0 :(得分:2)

由于您没有发布该xml文件的内容,我们只能猜测其内容......

很可能$xml->hotel是一系列酒店。但是你在那里迭代了frist元素,而不是在酒店列表上。试试这个:

foreach($xml->hotel as $hotel)

对于图像:您很可能必须将第二个foreach循环放置在第一个循环内的图像中,因为每个酒店最有可能保存对多个图像的引用。所以第二个循环应该是这样的:

foreach($hotel->images as $i)

所以最终的代码可能是这样的:

$url = "http://travelplaza.ro/turcia/belek/Belek.xml";   
// get xml file contents
$xml = simplexml_load_file($url);

// loop over the hotels
foreach($xml->hotel as $hotel){  
  echo $hotel["hotelname"]."&nbsp".$hotel["stars"]."\n";
  echo "<p>\n".$hotel->description."\n</p>\n";

  // loop this hotels images
  echo "<p>\n";
  foreach($hotel->images as $image) {
    echo '<a href="'.$image["url"].'" rel="lightbox">'."\n";
    echo '<img src="'.$image["url"].'" width="100" height="100">'."\n";
    echo "</a>"\n;
  }
  echo"</p>\n";
}

但是如上所述:没有更多细节,我们只能猜测 ......

答案 1 :(得分:0)

hotel[0]表示列表中的第一家酒店;当你循环遍历时,SimpleXML假设你想要它的孩子。在这种情况下,每家酒店都有两个孩子,一个description和一个images

您依次想要每家酒店,即所有名为hotel的元素,请删除[0]:

foreach($xml->hotel as $hotel)

对于图像,您希望在名称和描述的同时获取它们,但是您有两个单独的循环,因此在显示所有描述之前,您不会开始查看图像。

将图像循环移动到主循环内,并将其更改为查看您当前正在检查的酒店。同样,你不需要[0],但是看一下XML在一个image元素中有多个images元素,所以你需要这个:

foreach($hotel->images->image as $i)

(在这种情况下[0]也有效,因为$ hotel-&gt; images [0]是第一个也是唯一的images元素,其子元素是个体image我认为以上更好地表明了你的意图。)

答案 2 :(得分:0)

试试这个:

<?php
$url = "http://travelplaza.ro/turcia/belek/Belek.xml";   
// get xml file contents
$xml = simplexml_load_file($url);
// loop begins
foreach($xml->hotel as $hotel) {
echo <<<EOD
<div>
  <p>{$hotel['hotelname']}</p>
  <p>{$hotel['stars']};</p>
  <p>{$hotel->description}</p>
  <p>
EOD;
  foreach ($hotel->images[0] as $i) {
  echo <<<EOD
  <p>
        <a href="{$i["url"]}" rel="lightbox"><img src="{$i["url"]}" width="100"     height="100">'</a>
  </p>
EOD;
  }
  echo <<<EOD
 </div>
EOD;
}
?>