2013-12-16 29 views
0

我對PHP很陌生,並且被要求編寫一個基於時間顯示圖像的腳本。我已經扣除了我需要使用PHP的本地'日期'功能,直到我被要求實施銀行假期和聖誕節,一切順利。如何阻止我的IF語句發生衝突,以及如何選擇哪個語句具有優先級?

我試圖添加聖誕節和銀行假期作爲單獨的if語句,但那是在災難來臨時,我無法弄清楚爲什麼它會停下來。我試過使用在線PHP驗證器無濟於事。

請不要害怕向我拋出細節和術語,因爲我真的希望擴展我對PHP的知識,並且更少依靠網絡論壇的支持!

下面是代碼:

所有的
<?php 

     // Date-time (day of month, month) 

     $d = date('j'); // Day of month: Numeric without leading zeroes 
     $m = date('n'); // Month: As above 
     $D = date('w'); // Day of week 
     $H = date('G'); // Hour of day 

     // REGULAR OPENING TIMES 
     // Closed before 9am on weekdays 
     if ($H < 9 && $D <= 5) : 
       $showroom_img = '/media/gbu0/pagehead/showroom_closed.jpg'; 
     // Open before 5pm (but after 9, as first if statement overrides this) on weekdays 
     elseif ($H < 17 && $D <= 5) : 
       $showroom_img = = '/media/gbu0/pagehead/showroom_open.jpg'; 
     // Closed before 10am on Saturdays 
     elseif ($H < 10 && $D == 6) : 
       $showroom_img = = '/media/gbu0/pagehead/showroom_closed.jpg'; 
     // Open between 10am and 2pm on Saturdays 
     elseif ($H < 14 && $H > 10 && $D == 6) : 
       $showroom_img = = '/media/gbu0/pagehead/showroom_open.jpg'; 
     // Any other time, display closed image :) 
     else : 
       $showroom_img = = '/media/gbu0/pagehead/showroom_closed.jpg'; 
     endif; 

     // Holidays 2014 

     $xmas_starts = ($d == 23 && $m == 12 && $d > 17); 
     $xmas_ends = ($d == 26 && $m == 12); 
     $nyd   = ($d == 1 && $m = 1); 

     // Easter Friday: April 18 
     // Easter Monday: April 21 
     // Early Spring B/H: May 5 
     // Late Spring B/H: May 26 
     // Summer B/H: August 25 

     // All bank holidays: 10am - 2pm 

     if(date >= $xmas_starts && $day <= $xmas_ends) : 
       $xmas = true; 
     elseif(date = $nyd) : 
       $nyd = true; 
     else : 
       $bankhol = false; 
     endif; 

     if($xmas = true) : 
       $showroom_img = "/media/gbu0/pagehead/showroom_xmas.jpg"; 
     elseif($bankhol = true && date('F', 'j') = strpos('April 18' || 'April 21' || 'May 5' || 'May 26' || 'August 25') || date('w') = 6) : 
       $showroom_img = "/media/gbu0/pagehead/showroom_bhol.jpg"; 
     elseif(date('w') = 7) : 
       $showroom_img = "/media/gbu0/pagehead/showroom_closed.jpg"; 
     else : 
       $showroom_img = "/media/gbu0/pagehead/showroom_open.jpg"; 
     endif; 

?> 
+0

'if($ xmas = true)' - 這將永遠是真的;一個'='分配一個值。如果你想比較,那麼你需要'==' – andrewsi

+0

通過應用邏輯 - 這適用於編程的一個主體。 –

+0

我想說的是,如果$ xmas被設置爲'true',如前面的語句所指定的那樣($ xmas的值取決於服務器時間是在兩個之間日期),然後將主變量設置爲聖誕節圖像,否則使用銀行假日圖像或關閉,或依此類推。 我是否需要指定'$ xmas'是否爲true,然後忽略它並關注其後的'elseif's中的其他變量? –

回答

2

第一。我注意到一對夫婦的bug:

elseif(date = $nyd) : 
       $nyd = true; 

if($xmas = true) : 
       $showroom_img = "/media/gbu0/pagehead/showroom_xmas.jpg"; 

在PHP中, '=' 是賦值運算符,用於賦值給變量。你需要的是比較運算符'=='。例如:

if($xmas == true) : 

或者你也可以這樣做(它指出,在已經評論):

if($xmas) : 

Rgarding優先級時,如果報表是要在爲了檢查你寫他們你的代碼。爲確保條件獲得最高優先級,必須首先進行檢查。

+0

事實上,if($ a == true)很可能是if($ a)',考慮到==不是一個嚴格的等式,它不會改變任何東西。 –

+0

根據我的理解:'if($ a)'自動檢查它是真還是假,如果它真的「激活」它後面的條件/行? (對不起,如果這是令人困惑,我仍然在學習術語。) –

+1

是的,你可以認爲它是「激活」,但在適當的編程術語中,它被稱爲「執行」。條件滿足時,將執行該條件塊內的語句。否則,執行下一個語句,依此類推。下一個陳述可以是另一個條件陳述,或者任務等。 – Raiyan

0

您是否考慮過使用switch case函數而不是elseif?

開關箱方法:

switch ($i) { 
case 0: 
    echo "i equals 0"; 
    break; 
case 1: 
    echo "i equals 1"; 
    break; 
case 2: 
    echo "i equals 2"; 
    break; 
} 

在這裏閱讀更多:http://www.php.net/manual/en/control-structures.switch.php

+0

我不認爲'switch'在這裏會有用,因爲條件太複雜了。 –

+0

我認爲這樣做的好處是,一切都將在一個語句中,而不是幾個語句來確定特定變量的值?我聽說它比具有許多不同條件但我沒有看過它的語句更好地優化。我現在通過:) –

0

if語句不能衝突,且沒有優先級的概念。除非它被代碼分支跳過(例如,如果同一鏈中的前一個ifelseif評估爲true,則會跳過elseif),否則每個代碼都會按其出現的順序進行評估和執行。

問題的原因很可能是您對賦值和相等運算符(===)的混淆。

在所有情況下,x = y是一項任務;即它將值y分配給變量x。即使您將它放在if聲明中,情況也是如此,因此通常您需要避免這種情況(儘管在某些情況下它很有用)。

在所有情況下,x == y是一個等式比較;即它檢查x的值是否(或可以被轉換成)與值y相同。這是您通常在if條件下需要的一個。

換一種方式,要改變這樣的:

if($xmas = true) 

要這樣:

if($xmas == true) 

你需要做同樣的事情在一對夫婦的其他地方以及。

+0

謝謝你的詳細解釋!我想到了操作員的一些事情,但我不確定是什麼。 –