繁体   English   中英

PHP:SimpleXML和数组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM