2009-03-14 22 views
6

Ich Looping ein zweidimensionales Array wie folgt:PHP Notice: Undefined index, wenn Array Looping

if (!empty($aka)) { 
    foreach ($aka as $ak) { 
     if($ak["lang"]=="es") { 
      $sptitle=$ak["title"]; 
     } 
    } 
} 

Ziemlich einfach. Wenn das Array ($ aka) nicht leer ist, schlinge ich es durch und wenn es feststellt, dass der "lang" Index gleich "es" ist, speichere ich einfach den "title" Wert für diesen Index in $ sptitle.

Das Problem ist, dass das Array ($ aka) enthält eine Menge von Informationen und manchmal gibt es keine "lang" Index ... und ich bekomme diesen Fehler: Hinweis: Undefinierter Index: lang.

Wie kann ich das reparieren ???

Dies ist ein Auszug aus dem Array zum besseren Verständnis. Beachten Sie, dass [1] keinen [lang] Index hat, aber [2] hat:

[1] => Array 
    (
     [title] => "The Lord of the Rings: The Motion Picture" 
     [year] => "" 
     [country] => "USA" 
     [comment] => "promotional title" 
    ) 

[2] => Array 
    (
     [title] => "Señor de los anillos: La comunidad del anillo, El" 
     [year] => "" 
     [country] => "Argentina" 
     [comment] => "Chile, Mexico, Peru, Spain" 
     [lang] => "es" 
    ) 

Vielen Dank!

Antwort

15

Testen Sie einfach mit isset, z.

if (!empty($aka)) { 
     foreach ($aka as $ak) { 
       if(isset($ak["lang"]) && ($ak["lang"]=="es")) { 
         $sptitle=$ak["title"]; 
       } 
     } 
} 

Wenn Sie nicht wissen, wie ein boolean Operator wie & & kann kurzgeschlossen werden, wenn der erste Operand falsch ist, dann der zweite Operand nicht ausgewertet werden. Sie werden dieses Idiom oft bei der Überprüfung der Verfügbarkeit von etwas sehen, bevor es im zweiten Operanden darauf reagiert.

Sie auch array_key_exists ('lang', $ aka) statt isset, es hat etwas andere Semantik obwohl verwenden könnte - es wahr zurück, wenn ein Element null gesetzt, whereis isset würde return false.

Interessanterweise isset is at least twice as fast as array_key_exists, möglicherweise aufgrund der Tatsache, dass es ein Sprachkonstrukt ist, anstatt einen regulären Funktionsaufruf.

+1

ich persönlich array_key_exists bevorzugen, aber die Verwendung isset speziell, weil es (überraschend) ein LOT schneller http://us.php.net/manual/en/function.array-key-exists.php#82867 – enobrev

+0

Um, isset ($ ak ['lang']) wird immer noch eine E_NOTICE von undefinierten Index. array_key_exists() wird nicht. – cletus

+4

isset wird keine Benachrichtigung auslösen, versuchen Sie es. –

0

wäre es falsch, zu verwenden:

if (@$ak['lang']) 

verpassen ich wirklich die Tatsache, dass wir nicht noch die 2 Kontrollen wie so

if ($ak['lang']) 

in 1 tun können, es war eines der schönen Dinge über PHP und ich sehe einfach nicht den Zweck der Warnung, ob ein Array-Schlüssel in einer transienten Skriptsprache wie PHP initialisiert wird.

Ich bin mir nicht sicher, wo die Entwickler von PHP damit gehen. persönlich bin ich ein bisschen besorgt, dass sie PHP in etwas anderes verwandeln. lass es einfach in Ruhe. es war toll.

+0

Das Handbuch besagt auf [dieser Seite] (http://php.net/manual/en/errorfunc.configuration.php): "In PHP 4 und PHP 5 ist der Standardwert E_ALL & ~ E_NOTICE. Diese Einstellung wird nicht angezeigt E_NOTICE-Level-Fehler."Die Anzeige dieses E_NOTICE ist ein Konfigurationsproblem, kein PHP-Problem. – Unsigned

0
if (@!empty($aka)) { 
     foreach ($aka as $ak) { 
       if($ak["lang"]=="es") { 
         $sptitle=$ak["title"]; 
       } 
     } 
} 

or 


if (@$_POST['value'] == 'yes') 
{ 
    state; 
} 

in den meisten Fällen durch die Verwendung @ Zeichen entfernt bemerkt .............