'未定义'注意填充数组时注意

时间:2009-10-12 10:08:58

标签: php arrays

在使用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

4 个答案:

答案 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设置。