我想我在这里遗漏了一些非常明显的东西,但是有人可以向我解释为什么我得到的是我的输出,而不是我在以下 var 转储中期望的输出:
这是原始的xml:
<result>
<category>
<id>3</id>
<name>Category 1</name>
<subcategory>
<id>9</id>
<name>SubCat 1</name>
</subcategory>
<subcategory>
<id>10</id>
<name>SubCat 2</name>
</subcategory>
<subcategory>
<id>11</id>
<name>SubCat 3</name>
</subcategory>
</category>
</result>
我在做什么:
$xml = new SimpleXMLElement($file);
foreach($xml->category as $node)
{
echo "dump 1:
";
var_dump($node);
echo "**********************************************
dump 2:
";
var_dump($node->subcategory);
die();
}
这输出:
dump 1:
object(SimpleXMLElement)#130 (3) {
["id"]=>
string(1) "3"
["name"]=>
string(10) "Category 1"
["subcategory"]=>
array(3) {
[0]=>
object(SimpleXMLElement)#133 (2) {
["id"]=>
string(1) "9"
["name"]=>
string(8) "SubCat 1"
}
[1]=>
object(SimpleXMLElement)#135 (2) {
["id"]=>
string(2) "10"
["name"]=>
string(8) "SubCat 2"
}
[2]=>
object(SimpleXMLElement)#136 (2) {
["id"]=>
string(2) "11"
["name"]=>
string(8) "SubCat 3"
}
}
}
**********************************************
dump 2:
object(SimpleXMLElement)#138 (2) {
["id"]=>
string(1) "9"
["name"]=>
string(8) "SubCat 1"
}
第一个 var 转储输出我所期望的,但我期望第二个 var_dump 的输出是:
array(3) {
[0]=>
object(SimpleXMLElement)#133 (2) {
["id"]=>
string(1) "9"
["name"]=>
string(8) "SubCat 1"
}
[1]=>
object(SimpleXMLElement)#135 (2) {
["id"]=>
string(2) "10"
["name"]=>
string(8) "SubCat 2"
}
[2]=>
object(SimpleXMLElement)#136 (2) {
["id"]=>
string(2) "11"
["name"]=>
string(8) "SubCat 3"
}
}
甚至是一个包含所有数组项的对象。为什么不是这样?
我可以看到当我调用var_dump($node->subcategory)
它时它正在转储它找到的第一个“子类别”节点,但为什么它会将所有“子类别”节点转换为第一个 var 转储的数组而不是第二个?我将如何模仿这种行为来检测“子类别”是否包含多个对象(就像它在第一个 var 转储中所做的那样)?
基本上我想要做的是检测 SimpleXMLElement 的属性是否包含更多值的数组(即它是否包含子节点)
我已经尝试了各种方法,但我似乎无法检测到 simpleXml 对象的一个属性是否包含一组数组。
更新:
我发现这有效:
if(count($node->subcategory)>1)
{
// we have more than one subcategory
}
但这不是最优雅的方式,我敢肯定一定有更清洁的方法吗?