Bu kötü bir model mi?

6 Cevap php

Ben kendim gibi kod yazma bulabilirsiniz:

foreach($array as $key => $value) {
    switch($key) {
        case 'something':
            doSomething($value);
            break;
        case 'somethingelse':
            doSomethingElse($value);
            break;
    }
}

Bu konuda gitmek için daha iyi bir yolu var mı? Bana kirli görünüyor, ama ben sadece üzerine düşünce olabilir.

Aklıma tek alternatif daha iyi görünmüyor, her tuş için bir if deyimidir. Yani :

if($array[0] == 'something') {
    doSomething($array[0]);
}
if($array[1] == 'somethingelse') {
    doSomethingElse($array[1]);
}

(Veya böyle bir şey)

Gerekirse ben tam kodu gönderebilir, ama bu ne genel bir taslak olduğunu. Uzakta eleştirmek, ama ben burada yardım arıyorum unutmayın. Ben egregiously yanlış bir şey yapıyorum Yani eğer, o zaman işaret etmektedir.

6 Cevap

Bir sözlük / ilişkisel dizi tuşların işlevlerini Haritalama (@ jldupont belirtildiği gibi) bu durum için ortak bir yaklaşım - PHP ama ilişkilendirilebilir dizilerle birçok dinamik dilde değil. Örneğin, Python ve Lua hatta have bir switch ifadesi yok - bu oldukça fazla bir anahtarı öykünmek için tek yoldur.

Bu yaklaşım düşünün:

<?
$arr[] = "bye";
$arr[] = "hi";

function sayHi() { print("Hello.\n"); }
function sayBye() { print("Goodbye.\n"); }

$funcs["hi"] = sayHi;
$funcs["bye"] = sayBye;

foreach($arr as $k){
    $funcs[$k]();
}

?>

Çıktı:

Goodbye.
Hello.

Yalnızca iki ayrı değerleri var zaman overkill, ama belli ki sen artışlarını kapsar zorunda durumların sayısı gibi daha değerli bir yaklaşım olur.

Bu "kötü" bir çözüm değil, ama her zaman olduğu gibi, alternatifler vardır. Örneğin, switch ifadesinin kurtulmak ve dizeleri için bir yorumlanmış işleyicisi kullanın. Bu işlev işaretçileri listesine benzer, ancak yeni bir davranış eklemek için güncel bir listesini tutmak zorunda değilsiniz; sadece işleyicisi için yeni bir fonksiyon ekleyerek bunu ilgilenir.

$array = array(
  "something" => "itsasecret",
  "somethingelse" => "i can't tell you",
);

class Handler {
  static function something($value) {
    printf("something: %s\n", $value);
  }

  static function somethingelse($value) {
    printf("somethingelse: %s\n", $value);
  }
}

$handler = new Handler();
foreach($array as $key => $value) {
  $handler->$key($value);
}

Muhtemelen giriş dizelerini dezenfekte ve yöntemi işleyicisi var olmasını sağlamak için bazı kod gerekir, ama bu size bazı fikirler verebilir.

Ben foreach döngüsünde anahtarını kullanma eğiliminde. IMHO eğer bir demet daha az kirli.

Sen gibi, bir diğer fonksiyonu da anahtarı koyabilirsiniz:

foreach($array as $key => $value) {
   doTransaction($key , $value);
}

...

function doTransaction($key, $value){
     switch($key) {
        case 'something':
            doSomething($value);
            break;
        case 'somethingelse':
            doSomethingElse($value);
           break;
    }
}

Bu deneyin:

Her sürümü ile Run - anahtarı ile ve eğer ile - bir milyon kere. Zaman her çalıştırmak.

Bizi daha hızlı çalışır hangisini bilsin.

Başka bir olasılık (en azından) vardır: bir işlev için çalışma sevk için bir sözlük arama kullanın.

Arama-up "anahtarı" olarak $ tuşunu kullanarak fonksiyon, işlev başvurusu almak ve parametre olarak $ değeri ile uygulayın.

Beni affet ama benim PHP-fu biraz paslı.

Bunda yanlış bir şey yok.

Eğer sadece 2 ya da 3 öğe var ise, ben gitmek istiyorum sadece kod karmaşıklık uğruna eğer. Eğer fazla 5 var ise ben kesinlikle anahtarı ile gitmek istiyorum ...