【问题标题】:foreach function only one showsforeach 函数只有一个显示
【发布时间】:2014-04-12 10:55:38
【问题描述】:

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本身..当然还有很多酒店。 我想要的结果是获得第一家酒店的标题、描述和图片,然后是第二家酒店,依此类推。 相反,我只得到图像。如果我删除属性 [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

【问题讨论】:

  • 请格式化您的代码,谢谢。
  • @birgire 这个地方的指导方针明确规定,所有相关信息都必须包含在问题中。不允许使用指向场外信息的 URL。它们是试图提供帮助的用户的安全线程。
  • @arkascha 虽然我同意鼓励使用内联示例,但在不危及安全的情况下下载 XML 文件非常简单。
  • @IMSoP 当然是的,这是可能的。但是,为什么要强迫所有试图帮助下载该文件的人呢?为什么不把它一次发布给所有人看?我认为向 OP 指出这一点是有道理的。
  • @arkascha 当然。不过,您也许可以将其更多地表述为请求,而不是暗示它违反了规则。我认为这更像是一个质量问题,而不是“不允许”。

标签: php xml parsing foreach


【解决方案1】:

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

$xml-&gt;hotel 很可能是一系列酒店。但是,您迭代其中的第一个元素,而不是酒店列表。试试这个:

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";
}

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

【讨论】:

  • 就个人而言,我认为他需要一个 for 循环。他可以计算数组中的键数并遍历它,正确显示每个酒店的所有图像。只是我的意见。
  • 这显然取决于未知的xml文件的内容。但考虑到它是 xml,我会说图像更有可能是酒店定义中的标签。
  • 该问题包含源 XML 的公共 URL,因此无需猜测。
  • @IMSoP 请在问题本身下方阅读我对此的评论。
  • @arkascha 你可以只能猜测这仍然不是真的;您宁愿猜测也不愿下载外部文件。换句话说,您的选择。
【解决方案2】:

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

你要每家酒店依次,也就是所有的元素都叫hotel所以去掉[0]:

foreach($xml->hotel as $hotel)

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

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

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

(在这种情况下 [0] 也可以,因为 $hotel->images[0] 是第一个也是唯一的 images 元素,它的子元素是单独的 image 元素。我认为以上更能说明你的意图。)

【讨论】:

  • 是的,hotel[0] 是第一个元素。问题是我正在尝试获取酒店 [0] 的描述和图像,然后在酒店 [1] 的另一个文件中等等。我必须制作一些 iframe,我只想使用一个 xml 文件。
  • 好的,问题并不清楚,但在这种情况下,您根本不需要第一个循环 - 只需编写 $hotel = $xml-&gt;hotel[0];,然后编写其余代码。
【解决方案3】:

试试这个:

<?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;
}
?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    相关资源
    最近更新 更多