You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP解析API返回XML为数组失败:数组为空问题排查

解决XML转数组后为空的问题

嘿,我仔细看了你的代码和API返回的XML内容,问题出在SimpleXMLElement的遍历和节点访问方式上,咱们一步步拆解问题并修正:

先说说你代码里的核心错误

  1. 根节点访问错误:$oXML本身就是根节点<distributionGroups>,你用$oXML["distributionGroups"]是在找这个节点的名为distributionGroups的属性,但你的XML里根节点并没有这个属性,所以遍历的是空对象,自然填充不出数组。
  2. 子节点访问错误:你要遍历的是根节点下的<group>子节点,正确的遍历对象应该是$oXML->group;另外访问<id>这类子元素时,用$value["id"]是找节点属性,而你需要的是节点文本内容,应该用$value->id。
  3. 排序时的键名错误:后面排序用$row["id"],但你的数组结构是$row["group"]["id"],这个键不存在会导致排序逻辑失效。

修正后的完整代码

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);

$groups = []; // 提前初始化数组,避免未定义变量警告
// 遍历根节点下的所有<group>子节点
foreach($oXML->group as $key => $value)
{
    // 把SimpleXMLElement对象转成对应的数据类型,后续使用更方便
    $groups[$key]["group"]["id"] = (string)$value->id;
    $groups[$key]["group"]["domain"] = (string)$value->domain;
    $groups[$key]["group"]["name"] = (string)$value->name;
    $groups[$key]["group"]["type"] = (string)$value->type;
    $groups[$key]["group"]["loggedIn"] = (string)$value->loggedIn === 'true';
    $groups[$key]["group"]["nightMode"] = (string)$value->nightMode === 'true';
    $groups[$key]["group"]["loggedInAgents"] = (int)$value->loggedInAgents;
    $groups[$key]["group"]["freeAgents"] = (int)$value->freeAgents;
    $groups[$key]["group"]["callsWaiting"] = (int)$value->callsWaiting;
}

// 修正排序的键名,对应数组结构
$temp = [];
foreach ($groups as $key => $row) {
     $temp[$key] = $row["group"]["id"];
}
array_multisort($temp, SORT_ASC, $groups);
$_SESSION["groups"] = $groups;

// 打印数组用print_r才能看到具体内容,直接echo只会输出Array
echo "groups: ";
print_r($groups);

额外的小优化

  • 提前初始化$groups数组,避免PHP抛出未定义变量的警告。
  • 将SimpleXMLElement的子元素转换为字符串、布尔值或整数,后续使用数组时不会意外拿到SimpleXMLElement对象,减少潜在问题。
  • 打印数组时用print_r()或者var_dump(),直接echo $groups只会输出Array,看不到实际的数组内容。

内容的提问来源于stack exchange,提问作者Kristian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:18:18