在使用SimpleXML调用的数据填充数组时,PHP会将异常抛出为它所认为的“未定义”键,但输出实际上是正确的。
$doc = new SimpleXmlElement($http_result, LIBXML_NOCDATA);
$result = array();
$x = 0;
foreach($doc->users->user as $item) {
$result['user'][$x]['id'] .= $item->id;
$result['user'][$x]['name'] .= $item->name;
$result['user'][$x]['email'] .= $item->email;
$x++;
}
print json_encode($result);
这实际上输出了我所期望的,即{"user":[{"id":"4843977","name":"Test New User","email":"test@newuser.com"}]}
但是,也存在以下错误,我不完全确定原因 - 这不会出现在5.2.6中,而是出现在5.2.10中
Notice: Undefined index: user in /var/vhosts/sys-dev/docs/file.php on line 36
Notice: Undefined offset: 0 in /var/vhosts/sys-dev/docs/file.php on line 36
Notice: Undefined index: id in /var/vhosts/sys-dev/docs/file.php on line 36
Notice: Undefined index: name in /var/vhosts/sys-dev/docs/file.php on line 37
Notice: Undefined index: email in /var/vhosts/sys-dev/docs/file.php on line 38
Notice: Undefined offset: 1 in /var/vhosts/sys-dev/docs/file.php on line 36
Notice: Undefined index: id in /var/vhosts/sys-dev/docs/file.php on line 36
Notice: Undefined index: name in /var/vhosts/sys-dev/docs/file.php on line 37
Notice: Undefined index: email in /var/vhosts/sys-dev/docs/file.php on line 38
Notice: Undefined offset: 2 in /var/vhosts/sys-dev/docs/file.php on line 36
Notice: Undefined index: id in /var/vhosts/sys-dev/docs/file.php on line 36
Notice: Undefined index: name in /var/vhosts/sys-dev/docs/file.php on line 37
Notice: Undefined index: email in /var/vhosts/sys-dev/docs/file.php on line 38
答案 0 :(得分:3)
我认为你必须在行中改变“。=”到“=”:
$result['user'][$x]['id'] = $item->id;
$result['user'][$x]['name'] = $item->name;
$result['user'][$x]['email'] = $item->email;
答案 1 :(得分:3)
您没有定义$ result ['user']和$ result ['user'] [$ x]。 您需要将它们实例化为数组,这样您才不会收到该错误。
$result['user'] = array();
foreach($doc->users->user as $item) {
$result['user'][$x] = array();
$x++;
}
对于字段中未定义的索引,问题类似。当变量尚不存在时,使用“。=”。所以你应该先用空字符串实例化它。
$result['user'][$x]['name'] = '';
答案 2 :(得分:1)
您需要先初始化$result
数组:
$result = array('user' => array());
由于你正在使用字符串连接和赋值运算符.=
,这也适用于$result['user'][$x]
数组:
foreach($doc->users->user as $item) {
$result['user'][$x] = array(
'id' => null,
'name' => null,
'email' => null
);
$result['user'][$x]['id'] .= $item->id;
$result['user'][$x]['name'] .= $item->name;
$result['user'][$x]['email'] .= $item->email;
$x++;
}
但这不是必要的,因为你也可以这样写:
$result = array('user' => array());
foreach($doc->users->user as $item) {
$result['user'][] = array(
'id' => $item->id,
'name' => $item->name,
'email' => $item->email
);
}
修改由于我们已经详细说明$item
的属性也是SimpleXMLElement个对象,因此需要$item->attr[0]
来解决字符串值本身。因此:
$result = array('user' => array());
foreach($doc->users->user as $item) {
$result['user'][] = array(
'id' => $item->id[0],
'name' => $item->name[0],
'email' => $item->email[0]
);
}
答案 3 :(得分:0)
会发生这种情况,因为您不只是设置数组值,而是连接到当前值:
$result['user'][$x]['id'] .= $item->id;
此行表示“获取$result['user'][$x]['id']
的当前值并向其添加$item->id
”。然后抛出通知,因为当前值尚不存在。
修改此代码
$result['user'][$x]['id'] = $item->id;
你应该安全。不知道,为什么5.2.6不会抛出错误,也许你应该检查php.ini中的error_reporting设置。