'Tanımlanmamış' Notice diziler doldurma sırasında

4 Cevap php

Bir SimpleXMLElement çağrı veri ile bir dizi doldurmamak, PHP 'tanımsız' tuşları olarak inandığı için istisna atar ise, ancak, çıkış aslında doğru.

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

Bu aslında beklediğim çıkışı, yani {"user":[{"id":"4843977","name":"Test New User","email":"test@newuser.com"}]}

Ancak, aşağıdaki hatalar da mevcut, ve ben neden tamamen emin değilim - Bu 5.2.6 görünmüyor ama yok 5.2.10 için

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 Cevap

Ben sadece değiştirmeniz gerekir düşünüyorum. "=" Ile "=" hatları:

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

You don't define what are $result['user'] and $result['user'][$x]. You need to instantiate them as array so you won't get that error.

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

Alanlarında tanımlanmamış dizinler, sorun benzer. Kullanmak ". =" Değişkeni henüz mevcut değil zaman. Yani boş bir dize ile ilk örnekleriz gerekir.

$result['user'][$x]['name'] = '';

Önce $result diziyi başlatmak gerekiyor:

$result = array('user' => array());

Eğer dize birleştirme ve atama operatörü .= kullanıyorsanız beri, bu da $result['user'][$x] diziler için geçerli olacaktır:

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++;
}

Ayrıca bu gibi yazabilirsiniz beri Ama bu gerekli değil:

$result = array('user' => array());
foreach($doc->users->user as $item) {
    $result['user'][] = array(
        'id'    => $item->id,
        'name'  => $item->name,
        'email' => $item->email
    );
}


Edit yana biz $item niteliklerini SimpleXMLElement objects too, $item->attr[0] dize değerini kendisi gidermek için gerekli olduğunu geliştirdiler. Böylece:

$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]
    );
}

Sadece dizi değerlerini ayarlayarak değil, çünkü olur, ancak akım değerine birleştirerek konum:

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

Bu hat "$result['user'][$x]['id'] mevcut değerini almak ve $item->id bunu eklemek" anlamına gelir. Akım değeri henüz mevcut değil çünkü bildirim sonra, atılır.

Bu kodu değiştirebilir

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

ve güvenli olmalıdır. 5.2.6 hatalar atma değil Hiçbir fikrim neden olsa da, belki php.ini içinde error_reporting ayarı ile kontrol etmelisiniz.