2009-03-14 12 views
6

sto loop un array bidimensionale come questo:PHP Avviso: undefined indice quando il ciclo di matrice

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

Abbastanza semplice. Se l'array ($ aka) non è vuoto, lo faccio attraverso e quando scopre che l'indice "lang" è uguale a "es", salvo solo il valore "title" per quell'indice in $ sptitle.

Il problema è che la matrice ($ aka) contiene molte informazioni e talvolta non esiste l'indice "lang" ... e ottengo questo errore: Avviso: indice indefinito: lang.

Come posso risolvere questo ???

Questo è un estratto della matrice per aiutarti a capire. Si noti che [1] non ha un indice [lang] ma [2] ha:

[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" 
    ) 

Grazie!

risposta

15

Basta provare per questo con isset, ad es.

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

Se siete a conoscenza di come un operatore booleano come & & può essere cortocircuitato, se il primo operando è falso, allora il secondo operando di valutazione non sarà. Vedrai spesso questo idioma utilizzato per verificare la disponibilità di qualcosa prima di agire nel secondo operando.

Si potrebbe anche usare array_key_exists ('lang', $ alias) al posto di isset, ha leggermente diverse semantiche anche se - restituisce true se un elemento è impostato su null, whereis isset sarebbe tornato falso.

È interessante notare che, isset is at least twice as fast as array_key_exists, probabilmente perché è un costrutto di linguaggio piuttosto che una normale chiamata di funzione.

+1

Io personalmente preferisco array_key_exists, ma l'uso isset specificamente perché è (sorprendentemente) un Molto più veloce http://us.php.net/manual/en/function.array-key-exists.php#82867 – enobrev

+0

Um, isset ($ ak ['lang']) continuerà a generare un E_NOTICE di indice non definito. array_key_exists() non lo farà. – cletus

+4

isset non solleverà un avviso, provalo. –

0

sarebbe sbagliato usare:

if (@$ak['lang']) 

mi manca molto il fatto che non possiamo ancora fare i controlli 2 in 1 in questo modo

if ($ak['lang']) 

è stato uno dei più bella cose su PHP e io non vedo lo scopo di avvertire se una chiave array è inizializzata in un linguaggio di scripting transitorio come PHP.

Non sono sicuro di dove si trovino gli sviluppatori di PHP. personalmente, sono un po 'preoccupato che stanno trasformando PHP in qualcos'altro. lascia stare. è stato fantastico

+0

Il manuale indica su [questa pagina] (http://php.net/manual/en/errorfunc.configuration.php): "In PHP 4 e PHP 5 il valore predefinito è E_ALL & ~ E_NOTICE. Questa impostazione non viene visualizzata Errori di livello E_NOTICE."La visualizzazione di questo E_NOTICE è un problema di configurazione, non un problema con PHP. – Unsigned

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

or 


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

nella maggior parte dei casi questo notato eliminare con @ segno .............

Problemi correlati