2016-03-26 21 views
-1

Eğer/else işlevlerimde "else" i kaldıracak olsaydım, $ on_sale değişkeni bazı nedenlerden dolayı değişecek " true "if ifadesi yanlış olduğunda bile. Anahtar durumlarımdaki "else" (if/else) yedeklemesinden nasıl sakınırım

$mm = date('n'); 
$on_sale = false; 
foreach ($services as $service) { 

    switch ($service) { 
     case 'Example Service': 
      if ($mm == 3 || $mm == 4) { #pretend this returns false 
       $service = '1% Off ' .$service; 
       $on_sale = true; 
      } else { 
       $on_sale = false; #<---- why must I do this? 
      } 
      break; 
     default: 
      $service; 
      $on_sale = false; 
      break; 
    } 

    #more code... 
} 

işe beklenen Ne:

$mm = date('n'); 
$on_sale = false; 
foreach ($services as $service) { 

    switch ($service) { 
     case 'Example Service': 
      if ($mm == 3 || $mm == 4) { #pretend this returns false 
       $service = '1% Off ' .$service; 
       $on_sale = true; 
      } 
      break; 
     default: 
      $service; 
      $on_sale = false; 
      break; 
    } 

    #more code... 
} 

DÜZENLEME: değişken değildi on_sale her $ yinelemenin için çok

Yanlışlıkla, foreach döngüsü değişken dış on_sale benim $ ilan "reset".

Kötü:

$mm = date('n'); 
$on_sale = false; 
foreach ($services as $service) { 
    ... 

iyi:

$mm = date('n'); 
foreach ($services as $service) { 
    $on_sale = false; 
    ... 
+1

böylece, işlev, işleri BTW senin 'switch' bir' foreach' içeride ne olduğunu bilmiyoruz - eğer '$ on_sale' TRUE' ayarlanırsa - takip eden aşamada 'True' kalır. '$ For_sale = false;' foreach 'öğesini taşıyabilirsiniz – fusion3k

+1

' Foreach'ı hatırlayın. Hizmetlerin bir dizisini (sanırım) tekrarlıyorsunuz, bu yüzden "$ on_sale" sadece son yinelemenin son değerini içerir. –

+1

Aynı yorum için özür dilerim. Ben benim yayınlandığında ben sayfayı @ fusion3k –

cevap

0

(. Bu muhtemelen iyi bir cevap değil, ama sen anahtarları hakkında bir şeyler öğrenmek olabilir)

emin değilim neyi default kasasında $service; olması gerekiyordu, ancak:

a için
switch (x) { 
    case a: 
     do A 
     // don't break 
    case b: 
     do B 
     break; 
} 

, bu irade do A VE do B, case a çünkü durmuyor: 210 Sen break deyimi hareketli bir vaka (re) sonraki haline kanatacağımı olun. b için, bu yalnızca do B olacaktır. Senin durumunda

:

switch ($service) { 
    case 'Example Service': 
     if ($mm == 3 || $mm == 4) { #pretend this returns false 
      $service = '1% Off ' .$service; 
      $on_sale = true; 
      break; // BREAK HERE 
     } 
     // DON'T BREAK HERE 
    default: 
     $service; // ?? 
     $on_sale = false; 
     break; 
}