我很想知道PHP是如何从XML文档中形成SimpleXMLElement对象的,但是我认为在此过程中可能有些未知的事情。
当我们遍历PHP中的对象时,将遍历公共属性。因此,如果第一个属性是一个数组,则我们应该在第一个循环内需要另一个循环来对其进行迭代,但是,对于SimpleXMLElement对象似乎并非如此。例如看这个对象:
object(SimpleXMLElement)#1 (1) {
["user"]=>
array(5) {
[0]=>
object(SimpleXMLElement)#2 (3) {
["firstname"]=>
string(6) "Sheila"
["surname"]=>
string(5) "Green"
["contact"]=>
object(SimpleXMLElement)#7 (3) {
["phone"]=>
string(9) "1234 1234"
["url"]=>
string(18) "http://example.com"
["email"]=>
string(18) "pamela@example.com"
}
}
[1]=>
object(SimpleXMLElement)#3 (3) {
["firstname"]=>
string(5) "Bruce"
["surname"]=>
string(5) "Smith"
.
.
.
它包含一个“用户”属性,其中有一个数组(包含5个元素)。因此,当我们遍历此对象时,应该得到以下错误:
注意:...中的数组到字符串的转换
我已经在以下代码段中对此进行了测试:
$var = (object)array(
'user'=>['joe','mia'],
);
现在此循环给出了我上面刚刚提到的错误:
foreach ($test as $property => $val){
echo $property.':'.$val.'<br>';
}
答案 0 :(得分:1)
$val
是一个数组,因此无法回显它。使用print_r($val)
来显示其值。
foreach ($test as $property => $val){
echo $property.':';
print_r($val);
echo '<br>';
}
答案 1 :(得分:1)
值得了解基本的SimpleXML处理是如何工作的,尝试破解对象的内部结构不会有帮助。尝试访问元素时,请使用->elementName
您可能拥有的数据的简单模拟...
$data = "<base>
<user>
<firstname>Sheila</firstname>
<surname>Green</surname>
<contact>
<phone>1234 1234</phone>
</contact>
</user>
</base>";
如果要打印出<user>
下的所有元素,则可以使用foreach()
并使用->user->children()
,如...
$xml = simplexml_load_string($data);
//print_r($xml);
foreach ( $xml->user->children() as $tag => $value ) {
echo $tag."-".$value.PHP_EOL;
}
哪个输出...
firstname-Sheila
surname-Green
contact-
由于联系本身就是一种结构,因此您可以添加
if ( $value->count() > 0 ) {
foreach ( $value->children() as $tag => $sub ) {
echo $tag."-".$sub.PHP_EOL;
}
}
允许您打印出来。