SimpleXMLElement foreach子数组/值

时间:2015-03-27 19:47:52

标签: php arrays simplexml

我有以下代码可行,但似乎是不正确的实现方法。忽视“....”,这是我们不必担心的所有额外的东西。我遇到的问题是Sup在某些时候是一个数组,有时它只是一个值(左右print_r声称,我想/希望它只是一个元素数组)。

$users是一个简单的XML元素。

foreach($users as $user) {
    if ($user->InstSup->Sup[1] == '') {
        foreach($user->InstSup as $affid) {
        ....
    } else {
        foreach($user->InstSup->Sup as $affid) {

以下是不同的实例......

<Users>
    <User>
        <InstSup><Sup>1</Sup></InstSup>
    </User>
    <User>
        <InstSup><Sup>2</Sup><Sup>3</Sup><Sup>4</Sup><Sup>5</Sup></InstSup>
    </User>
</Users>

感谢。

1 个答案:

答案 0 :(得分:1)

首先,当您处理 SimpleXMLElement 时,不要相信print_r(或var_dump)的输出。它没有显示整体情况,最好按原样查看XML,例如使用asXML() method

现在解决你遇到的问题。如果您想拥有<Sup><InstSup>元素的列表(对于&#34;数组&#34;),您最好使用 Xpath查询文档。它非常直接,可以为您提供所需的数组:

$users = new SimpleXMLElement($buffer);
$sups  = $users->xpath('/Users/User/InstSup/Sup');
foreach ($sups as $index => $sup) {
    printf("#%d: %s (%s)\n", $index, $sup, $sup->asXML());
}

这会创建以下输出:

#0: 1 (<Sup>1</Sup>)
#1: 2 (<Sup>2</Sup>)
#2: 3 (<Sup>3</Sup>)
#3: 4 (<Sup>4</Sup>)
#4: 5 (<Sup>5</Sup>)

这是完成示例的$buffer

$buffer = <<<XML
<Users>
    <User>
        <InstSup><Sup>1</Sup></InstSup>
    </User>
    <User>
        <InstSup><Sup>2</Sup><Sup>3</Sup><Sup>4</Sup><Sup>5</Sup></InstSup>
    </User>
</Users>
XML;

正如输出中的阵容显示的那样,即使<Sup>元素位于(同名但是)不同的父元素内, XPath查询表达式

/Users/User/InstSup/Sup

从文档中返回该路径中的所有元素。

所以希望你现在更好地理解,不仅print_r不是那么有用,因为它不能展示整个画面,而且还能通过理解文档是如何显示它的。 ; s节点有序,您甚至可以使用Xpath表达式更轻松地查询数据。