2010-09-28 8 views
6

Kullanıcı profilleri olan kullanıcıları içeren bir web sitesi yapıyorum. Profildeki alanların çoğu isteğe bağlıdır.Bu nested if/elseif ifadeleri için daha zarif bir çözüm nedir?

Çok sayıda kullanıcı tarafından oluşturulan içerik için bir fırsat var ve bu yüzden bu içeriğin yazarını sitenin birçok farklı yerinde (yorum, yayın vb.) Göstermem gerekiyor. Kullanıcının profilinde, (isteğe bağlı olarak) "ilk adı", "soyadı" ve "görünen adı" nı doldurabilir.

yazarı görüntülemek için ben tercih bu sırada bu alanların bir sağlanan dizide arama yaparak kullanıcı için en uygun isim döndüren bir yardımcı yöntemini yazdı:

  1. kullanıcı doldurduğu takdirde display_name, bu görüntülenecektir. kullanıcı sadece first_name doldurduğu takdirde
  2. kullanıcı doldurduğu takdirde first_name ve last_name, ancak hiçbir display_name, bunun first_name gösterecektir, hem adları
  3. gösterecektir.
  4. Kullanıcı yalnızca last_name doldurduysa, last_name gösterecektir.
  5. Bütün bunlardan, bir kullanıcı kimliği dizisi anahtarların hiçbiri mevcut veya parametre NULL ise, adı yöntem inşaat büyük NULL

olarak gösterecektir user123

  • yani görüntülenir başarısız ama çirkin./Else ifadelerinde iç içe geçmişe alternatif olarak bunu güzelleştirmenin bir yolu olmalı. Bu 'Temel mantık' olacağını

    if(empty($names['display_name'])) { 
        $name = $names['first_name'] . ' ' $names['last_name']; 
    else 
        $name = $names['display_name']; 
    
    $name = trim($name); 
    if(empty($name)) 
        $name = 'user'.$names['id']; 
    if(empty($name)) 
        $name = 'NULL'; 
    

    :

    public function nameify($names = NULL) { 
        $name = 'NULL'; 
        if (!empty($names)) { 
         if (!empty($names['display_name'])) { 
          $name = $names['display_name']; 
         } elseif (!empty($names['first_name'])) { 
          $name = $names['first_name']; 
          if (!empty($names['last_name'])) { 
           $name .= ' ' . $names['last_name']; 
          } 
         } elseif (!empty($names['last_name'])) { 
          $name = $names['last_name']; 
         } 
    
         if ($name=='NULL' && !empty($names['id'])) { 
          $name = 'user' . $names['id']; 
         } 
        } 
        return $name; 
    } 
    
  • +3

    Sadece 'return' operatörü kötüye. Sadece işlevin sonunda değil, her yerde çağrılabilir. Ve daha fazla yürütmeyi * sonlandıracak *. Tıpkı goto'nun yaptığı gibi. X3'un örnek –

    cevap

    6
    public function nameify($names = NULL) { 
        if ($names) { 
         if (!empty($names['display_name'])) { 
          return $names['display_name']; 
         } 
         if (!empty($names['first_name'])) { 
          $name = $names['first_name']; 
         } 
         if (!empty($names['last_name'])) { 
          $name .= ' ' . $names['last_name']; 
         } 
         if (empty($name) && !empty($names['id'])) { 
          $name = 'user' . $names['id']; 
         } 
        } 
        return $name ? ltrim($name) : 'NULL'; 
    } 
    

    ve iade başka bir şey eşleşirse söyledi. O zaman biz her zaman ekran ismini döndürmek istediğimizden sadece bunu yaparız.

    DÜZENLEME:) Biraz daha az okunabilir "NULL"

    +0

    Bu çok okunabilir görünüyor. Bunu sevdim. – Stephen

    +0

    Olumlu sonuçlar için sınama yapmayın, sonra if ifadesinin içinde devam edin, ancak "hatalar" için sınayın ve görünürlerse geri dönün. Bu şekilde karmaşıklığı ve girintiyi azaltırsınız. – fresskoma

    +0

    @ x3ro kendi cevabınız ile tavsiyenize uyarak başladı, ancak ikinci şartlı tam olarak ne yapmamanızı söyler. – Stephen

    0

    kadar, ama $ name çünkü en azından NULL'dur değildir ... $names != NULL veya başka bir şey olması gerekir ..

    0

    ben gelirdim:

    public function nameify($names = NULL) { 
        $name = ''; 
        if (!empty($names)) { 
         if (!empty($names['display_name'])) { 
          $name = $names['display_name']; 
         } elseif (!empty($names['first_name'])) { 
          $name = $names['first_name']; 
          if (!empty($names['last_name'])) { 
           $name .= ' ' . $names['last_name']; 
          } 
         } elseif (!empty($names['last_name'])) { 
          $name = $names['last_name']; 
         } 
    
         if (empty($name) && !empty($names['id'])) { 
          $name = 'user' . $names['id']; 
         } else { 
          $name = 'NULL'; 
         } 
        } else { 
         $name = 'NULL'; 
        } 
        return $name; 
    } 
    
    +0

    numaralı cevabına bakın .............. – Stewie

    +1

    Sanırım bir satırda 'boş' ve 'boş' demek değilsiniz. – Stephen

    +0

    @Stephen haklısınız. Düzenleyecek Lütfen başkalarının cevaplarını düzenlemek için çekinmeyin. – jrharshath

    2

    Üçlü koşulları kullanarak kısaltabiliriz kodu güzelleştirmek d: varsayılan ilk Set

    public function nameify($names = NULL) { 
        $name = 'NULL'; 
    
        if (!empty($names)) { 
    
         $name = ($names['display_name']) ? $names['display_name'] : trim($names['first_name']." ".$names['last_name']); 
    
         if(!$name) $name = ($names['id'] > 0) ? 'user'.$names['id'] : 'NULL'; 
        } 
    
        return $name; 
    } 
    
    +0

    Ben inanmıyorum. Uyarılarım var ve hiçbir şey alamıyorum. Sadece –

    +0

    Oops boş değer olarak görecektir. Bir ihbarda bulunmak istedim. php dokümantasyonundan '' tanımlanmamış bir dizi anahtarına erişme girişimi, tanımlanmamış diğer herhangi bir değişkene erişim ile aynıdır: E_NOTICE seviyesinde bir hata mesajı verilecektir ve sonuç NULL olacaktır. ' – Stephen

    +0

    Ah, evet. Uyarıları yok saymak için benim hata seviyem var. Beklenen sonuç bir NULL olarak görülüyorsa, bildirim sadece bilgilendirme amaçlıdır ve herhangi bir soruna yol açmayacaktır (normalde bir üretim ortamında bulunmadığınıza dair bildirimleriniz olmadıkça) –

    0
    //pointers to functions 
    $arrayOfSulutions{"display_name_strategy", "full_name_strategy" ..., "null_strategy" } 
    function display_name_strategy{ 
        return $names['display_name']; 
    } 
    $i = 0; 
    while($res == null){ 
        $res = call($arrayOfSulutions[$i++]); 
    } 
    
    +0

    @Stephen: Bunlar Java dünyasından çözümdür) –

    +0

    -1 İki şeyden dolayı: Maksimum karmaşıklık (== maksimum hata ayıklama süresi) ve minimum performans (call_user_func PHP'de oldukça yavaştır) – fresskoma

    +0

    @ x3ro: minimum performans - evet. karmaşıklık - hayır. Esneklik-evet! –

    0

    dönen önlemek için Tweak, ama etkili:

    list($idx,$name) = array_shift(array_filter(array(
        $names['display_name'], 
        implode(' ',array_filter(array($names['first_name'],$names['last_name']))), 
        'user'.$names['id']; 
        ))); 
    
    +0

    -1 "Biraz daha az okunabilir" ... Cidden, kim böyle bir şey hata ayıklayacak ... İşte bu yüzden PHP'den nefret ediyorum ... – fresskoma

    +0

    Lütfen benim yorumumu yanlış anlamayın, onun temiz bir fikir, sadece – fresskoma

    +0

    Bah, bunu yapmak için başka bir yol olmadığı sürece hiç kimsenin üretimde kullanması gereken hiçbir şey yok.Daha okunabilir hale getirilebilir, ancak bu, php'nin gizli kısımlarından bazılarına güzel bir örnektir. –

    1

    bu önereceğini:

     
    public function nameify($names = null) { 
        if(empty($names)) 
         return null; 
    
        if(!empty($names['display_name'])) 
         return $names['display_name']; 
    
        if(!empty($names['first_name'])) { 
         $name = $names['first_name']; 
         if (!empty($names['last_name'])) { 
          $name .= ' ' . $names['last_name']; 
         } 
         return $name; 
        } 
    
        if(!empty($names['id])) 
         return 'user' . $names['id']; 
    
        return null; 
    } 
    
    0

    A State machine eserler çok güzel için Böyle mantık dahil. Aynı zamanda uygulamak çok basit (bir anahtar deyimi kullanarak).

    +0

    Bu soyutlamayı benim problemim için nasıl uygulayacağınıza dair bir örnek var mı? Sözde kodda olsa bile görmek isterim. – Stephen

    +0

    Saniye, bunun için kodu görmek isterim. –

    +0

    Chuck Vose'un cevabını kabul etmeme rağmen, hala bununla ilgileniyorum. – Stephen

    0

    benim sürümü simplier olurdu emin değilim, ama işte burada:

    public function nameify($names = null) { 
        $result = array(); 
    
        if(!empty($names['display_name'])) { 
         array_push($result,$names['display_name']); 
        } else { 
         if(!empty($names['first_name'])) { 
          array_push($result, $names['first_name']); 
         } 
         if(!empty($names['last_name'])) { 
          array_push($result, $names['last_name']); 
         } 
        } 
    
        if(empty($result) && !empty($names['id'])) { 
         array_push($result, 'user'.$names['id']); 
        } 
    
        return (empty($result) ? 'NULL' : implode(' ', $result)); 
    } 
    
    İlgili konular