[英]PHP: SimpleXML and Arrays
當我運行此代碼時:
foreach($xml->movie as $movie) {
if(isset($movie->photos)) {
foreach ($movie->photos as $photo) {
echo $photo." ";
}
echo "<hr/>";
}
}
我得到了很好的實際數據輸出,例如一行看起來像
06397001.jpg 06397002.jpg 06397003.jpg 06397004.jpg 06397005.jpg
但是,當我將其放入數組時,它包含所有SimpleXML包裝器標簽,而jpgs不在數組的根目錄。
碼:
foreach($xml->movie as $movie) {
if(isset($movie->photos)) {
$photos = array();
foreach ($movie->photos as $photo) {
$photos[] = $photo;
}
} else $photos = "";
var_dump($photos);
echo "<hr />";
}
例如同一行看起來像
array(5) {
[0]=> object(SimpleXMLElement)#11 (1) {
[0]=> string(12) "06397001.jpg"
}
[1]=> object(SimpleXMLElement)#12 (1) {
[0]=> string(12) "06397002.jpg"
}
[2]=> object(SimpleXMLElement)#13 (1) {
[0]=> string(12) "06397003.jpg"
}
[3]=> object(SimpleXMLElement)#14 (1) {
[0]=> string(12) "06397004.jpg"
}
[4]=> object(SimpleXMLElement)#15 (1) {
[0]=> string(12) "06397005.jpg"
}
}
為什么會發生這種情況/如何刪除它,以便像在回顯時一樣在根級別獲得一系列照片?
SimpleXMLElement結果看起來像簡單的對象和數組,但是做了一些普通對象和數組無法做到的神奇事情。 它是通過這種方式設計的,因此您可以使用更少的代碼。
您可能可以通過以下方式解決您的問題:
foreach($xml->movie as $movie) {
if(isset($movie->photos)) {
$photos = array();
foreach ($movie->photos as $photo) {
$photos[] = "$photo";
// or you could use, I believe: $photos[] = $photo[0]
}
}
else $photos = "";
var_dump($photos); echo "<hr />";
}
為什么會這樣呢? 因為當將SimpleXML元素視為字符串時,其行為就像是字符串一樣,其值是該元素的文本內容。 在您的第一個示例中,echo的使用將元素視為字符串,因此它只是返回了字符串。
我知道這個問題已經很老了,而且已經得到了回答,但是由於我今天遇到了這個問題,並且我發現了相對更好,更簡單的解決方案,並且不涉及大量循環,所以我想與大家分享一下。
首先,考慮到您的xml結構以及您不需要電影信息的事實,您不需要遍歷它們,而是收集所有照片,並且只能通過xpath來完成。
如果你有多部電影
$photos = $xml->xpath('//movie//photos'); // double slash means get all elements with that tag name.
換句話說,從所有電影中獲取所有照片。 此代碼將為您提供一個SimpleXMLElements數組,該數組具有鍵[0]和圖像名稱的值。 為了獲得圖像名稱而不會僅僅將其作為字符串循環,可以簡單地將該元素轉換為字符串,然后將其輸出為字符串,而不是SimpleXMLElement!
您現在可能需要的唯一循環是:
foreach($photos as $photo) {
dump( (string) $photo); // this will output the image name as a string e.g. "06397002.jpg"
}
干杯,我希望它能幫助需要它的人
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.