Уведомление «Не определено» при заполнении массивов - PullRequest
0 голосов
/ 12 октября 2009

При заполнении массива данными из вызова 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 ]

3 голосов
/ 12 октября 2009

Вы не определяете, что такое $ result ['user'] и $ result ['user'] [$ x]. Вам нужно создать их как массив, чтобы не было этой ошибки.

$result['user'] = array();
foreach($doc->users->user as $item) {
    $result['user'][$x] = array();
    $x++;
}

Для неопределенных индексов в полях проблема аналогична. Вы используете ". =", Когда переменная еще не существует. Поэтому вам следует сначала создать его с пустой строкой.

$result['user'][$x]['name'] = '';
3 голосов
/ 12 октября 2009

Я думаю, вы должны изменить просто ". =" На "=" в строках:

$result['user'][$x]['id'] = $item->id;
$result['user'][$x]['name'] = $item->name;
$result['user'][$x]['email'] = $item->email;
1 голос
/ 12 октября 2009

Сначала необходимо инициализировать массив $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]
    );
}
0 голосов
/ 12 октября 2009

Это происходит потому, что вы не просто устанавливаете значения массива, а объединяете его с текущим значением:

$result['user'][$x]['id'] .= $item->id;

Эта строка означает «принять текущее значение $result['user'][$x]['id'] и добавить к нему $item->id». Уведомление тогда брошено, потому что текущее значение еще не существует.

Изменить код к этому

$result['user'][$x]['id'] = $item->id;

и вы должны быть в безопасности. Хотя понятия не имею, почему 5.2.6 не генерирует ошибки, возможно, вам следует проверить это с помощью параметра error_reporting в php.ini.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...