【问题标题】:PHP parse xml to arrayPHP将xml解析为数组
【发布时间】:2018-08-25 05:47:08
【问题描述】:

我需要将 xml 转换为数组。 我从在线 api 获取 xml。 到目前为止我的代码:

function download_page($path){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$path);
curl_setopt($ch, CURLOPT_FAILONERROR,1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
$retValue = curl_exec($ch);          
curl_close($ch);
return $retValue;
}
$sXML = download_page('https://url/api/user/distgroup/domain/user?t=ticketofuser');
echo "xml start: ". htmlentities($sXML);
$oXML = new SimpleXMLElement($sXML);

echo "xml: ". $oXML;
foreach($oXML["distributionGroups"] as $key=>$value)
{
  $groups[$key]["group"]["id"]=$value["id"];
    $groups[$key]["group"]["domain"]=$value["domain"];
    $groups[$key]["group"]["name"]=$value["name"];
    $groups[$key]["group"]["type"]=$value["type"];
    $groups[$key]["group"]["loggedIn"]=$value["loggedIn"];
    $groups[$key]["group"]["nightMode"]=$value["nightMode"];

    $groups[$key]["group"]["loggedInAgents"]=$value["loggedInAgents"];
    $groups[$key]["group"]["freeAgents"]=$value["freeAgents"];
    $groups[$key]["group"]["callsWaiting"]=$value["callsWaiting"];
}
$temp=array();
    foreach ($groups as $key => $row) {
         $temp[$key]  = $row["id"]; 
}
    array_multisort($temp, SORT_ASC, $groups);
    $_SESSION["groups"]=$groups;

    echo "groups: ". $groups;

下载 xml 后,当我使用 htmlentities($sXML) 回显它时,它看起来像这样;

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<distributionGroups>
<group>
<id>33247</id>
<domain>soluno.se</domain>
<name>Kamoda Support</name>
<type>ATTENDANT</type>
<loggedIn>true</loggedIn>
<nightMode>false</nightMode>
<loggedInAgents>1</loggedInAgents>
<freeAgents>1</freeAgents>
<callsWaiting>0</callsWaiting>
</group>
<group>
<id>33257</id>
<domain>soluno.se</domain>
<name>Test 5</name>
<type>ATTENDANT</type>
<loggedIn>false</loggedIn>
<nightMode>false</nightMode>
<loggedInAgents>0</loggedInAgents>
<freeAgents>0</freeAgents>
<callsWaiting>0</callsWaiting>
</group>
</distributionGroups>

我的问题是在我尝试 foreach 填充数组后我的数组是空的。 我做错了什么?

【问题讨论】:

    标签: php arrays xml api simplexml


    【解决方案1】:

    在您的第二次 foreach 中,您缺少密钥 group。此外,您可以使用$oXML-&gt;group 对 XML 元素进行迭代:

    $oXML = new SimpleXMLElement($sXML);
    $groups = [] ;
    foreach($oXML->group as $group)
    {
        $groups[]["group"] = [
            'id' => (string)$group->id,
            'domain' => (string) $group->domain,
            'name' => (string) $group->name,
            'type' => (string) $group->type,
            'loggedIn' => (string) $group->loggedIn,
            'nightMode' => (string) $group->nightMode,
            'loggedInAgents' => (string) $group->loggedInAgents,
            'freeAgents' => (string) $group->freeAgents,
            'callsWaiting' => (string) $group->callsWaiting,
        ];
    }
    $temp=array();
    foreach ($groups as $key => $row) {
        $temp[$key]  = $row['group']["id"]; // missing 'group' in $row['group']
    }
    array_multisort($temp, SORT_ASC, $groups);
    
    print_r($temp);
    print_r($groups);
    

    $temp 的输出:

    Array
    (
        [0] => 33247
        [1] => 33257
    )
    

    $groups的输出:

    Array
    (
        [0] => Array
            (
                [group] => Array
                    (
                        [id] => 33247
                        [domain] => soluno.se
                        [name] => Kamoda Support
                        [type] => ATTENDANT
                        [loggedIn] => true
                        [nightMode] => false
                        [loggedInAgents] => 1
                        [freeAgents] => 1
                        [callsWaiting] => 0
                    )
    
            )
    
        [1] => Array
            (
                [group] => Array
                    (
                        [id] => 33257
                        [domain] => soluno.se
                        [name] => Test 5
                        [type] => ATTENDANT
                        [loggedIn] => false
                        [nightMode] => false
                        [loggedInAgents] => 0
                        [freeAgents] => 0
                        [callsWaiting] => 0
                    )
    
            )
    
    )
    

    或者你可以在你的第一个数组中删除"group"

    $oXML = new SimpleXMLElement($sXML);
    $groups = [] ;
    foreach($oXML->group as $group)
    {
        $groups[] = [
            'id' => (string)$group->id,
            'domain' => (string) $group->domain,
            'name' => (string) $group->name,
            'type' => (string) $group->type,
            'loggedIn' => (string) $group->loggedIn,
            'nightMode' => (string) $group->nightMode,
            'loggedInAgents' => (string) $group->loggedInAgents,
            'freeAgents' => (string) $group->freeAgents,
            'callsWaiting' => (string) $group->callsWaiting,
        ];
    }
    $temp=array();
    foreach ($groups as $key => $row) {
        $temp[$key]  = $row["id"];
    }
    array_multisort($temp, SORT_ASC, $groups);
    

    【讨论】:

      【解决方案2】:

      new SimpleXMLElement($sXML) 创建一个 XML 元素的对象(不是数组)。因此,在您的情况下,此 $oXML = new SimpleXMLElement($sXML); 为您提供了 distributionGroups 元素。从那里您可以访问它的子元素,例如foreach($oXML-&gt;group as $group),但请记住$group 也是SimpleXMLElement() 的一个实例。要访问元素的内容,您实际上需要强制转换对象,即(int) $group-&gt;loggedInAgents,以获得整数值。否则$group-&gt; loggedInAgents 实际上会给你另一个SimpleXMLElement() 对象,而不是变量。

      阅读更多docs

      【讨论】:

        【解决方案3】:

        您可以通过将代码复制到组中的每个元素、将元素添加到具有元素名称的数组中来使其更加灵活。这意味着当 XML 更改(或如果)时,代码仍将保留所有传递过来的数据。

        我还合并了两个循环,因此 $temp 设置在与主数据相同的循环中。

        $oXML = new SimpleXMLElement($sXML);
        $groups = array();
        $temp=array();
        foreach ( $oXML->group as $group )  {
            $data = array();
            foreach ( $group as $element )  {
                $data[ $element->getName() ] = (string)$element;
            }
            $groups[]["group"] = $data;
            $temp[] = $data["id"];
        }
        print_r($temp);
        print_r($groups);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多