PHP dizileri ve 'undefined index' hatalara çözüm

7 Cevap php

Ben bir önceki geliştirici tarafından yapılan bazı kodu ile çalışıyorum. Ben bu sorun için herhangi bir iyi bilinen model veya çözüm varsa ben merak ediyorum PHP oldukça yeni.

Onları kullanmaya çalışırsa önce Temelde orijinal yazarın herhangi indekslediği kontrol etmez. Ben () kullanılmadan önce her kontrol etmek için isset kullanabilirsiniz biliyorum, ama şu anda bu hataları ortaya çizgiler yüzlerce vardır. Biraz müzik koymak ve benim klavye içine kafamı çarparak başlamadan önce Eminim bu işleme için bazı güzel kısayol yok olmak istiyorum. İşte ben bakıyorum kod tipik bir bölüm:

    /* snip */
"text" => $link . $top_pick_marker . $output['author'] . " " .  " " . 
                              $output['new_icon'] . $output['rec_labels'] . "   " 
                    . $output['admin_link']
                    . $output['alternate_title'] 
                    . $output['access_info'] 
                    . $output['description'] 
                    . $output['url']
                    . $output['subject_terms'] 
                    . $output['form_subdivisions'] 
                    . $output['dates_of_coverage']  
                    . $output['update_frequency']  
                    . $output['place_terms'],
    /* snip */

Ben de her madde için buraya isset () kullanabilirsiniz biliyorum. Ben şeyler biraz yeniden ve şimdi olduğu gibi tüm birleştirme kaldırmak olurdu. Bunu yapmak için başka kolay bir yolu var mı ya da ben sadece onunla şaşırıp?

7 Cevap

Tuşları $ çıktı dizisinde anlamaya ve boş dizeleri ile eksik olanları doldurunuz.

$keys = array_keys($output);
$desired_keys = array('author', 'new_icon', 'admin_link', 'etc.');

foreach($desired_keys as $desired_key){
   if(in_array($desired_key, $keys)) continue;  // already set
   $output[$desired_key] = '';
}

Bir SquareRootOf2 cevabı üzerine varyasyon, ancak bu $ çıkış değişkeninin ilk kullanımdan önce yerleştirilmesi gerekir:

$keys = array('key1', 'key2', 'etc');
$output = array_fill_keys($keys, '');

Başında dizideki her endeksi ayarlayın (veya $output dizisi kullanılır önce) muhtemelen durum için en kolay çözüm olacaktır.

Örnek

$output['admin_link'] = ""
$output['alternate_title'] = ""
$output['access_info'] = ""
$output['description'] = ""
$output['url'] = ""


Ayrıca, gerçekten durum hakkında ama sen nereye PHP için yeni olduğunu ve bu isset() birden fazla argüman alabilir gerçekten hemen belli değil dedi. Bu yerine Yani:

if(isset($var1) && isset($var2) && isset($var3) ...){
    // all are set
}

Sen yapabilirsin:

if(isset($var1, $var2, $var3)){
   // all are set 
}

Sen birleştirme kaybetmeden isset () kullanabilirsiniz:

//snip
$str = 'something'
 . ( isset($output['alternate_title']) ? $output['alternate_title'] : '' )
 . ( isset($output['access_info']) ? $output['access_info'] : '' )
 . //etc.

Ayrıca ayarlı ise dize döndürmek için bir işlev yazabilirsiniz - bu muhtemelen çok verimli değildir:

function getIfSet(& $var) {
    if (isset($var)) {
        return $var;
    }
    return null;
}

$str = getIfSet($output['alternate_title']) . getIfSet($output['access_info']) //etc

Değişken referans olarak geçirilen çünkü bir uyarı almazsınız.

Sen değer eğer varsa veya boş bir dize değilse dönecektir güzel bir işlevi kullanarak deneyebilirsiniz. Bu benim ne kullanın:

function arrayValueForKey($arrayName, $key) {
   if (isset($GLOBALS[$arrayName]) && isset($GLOBALS[$arrayName][$key])) {
      return $GLOBALS[$variable][$key];
   } else {
      return '';
   }
}

Sonra bu gibi kullanabilirsiniz:

echo ' Values: ' . arrayValueForKey('output', 'admin_link') 
                 . arrayValueForKey('output', 'update_frequency');

Ve herhangi bir hata kusmak olmaz!

Bu yardımcı olur umarım!

Aynı fikir Michael Şelale gibi

Dan CodeIgniter

// Lets you determine whether an array index is set and whether it has a value.
// If the element is empty it returns FALSE (or whatever you specify as the default value.)
function element($item, $array, $default = FALSE)
{
    if ( ! isset($array[$item]) OR $array[$item] == "")
    {
        return $default;
    }

    return $array[$item];
}