2010-09-03 75 views
2

原諒我,如果這已被覆蓋之前,我搜查無濟於事。條件語句中的PHP「或」運算符 - newb問題!

我有一個腳本,查找目錄來查找裏面的文件。有條件線只查找具有特定擴展名的文件:

if(strtolower(substr($file, -3)) == "mp4"){... 

因此,這隻會查找具有'mp4'擴展名的文件。

我需要添加一些「或」運算符來添加兩個擴展類型。我嘗試了以下,但它沒有工作:

if(strtolower(substr($file, -3)) == "mp4" || == "mov" || == "flv"){... 

現在行似乎被忽略,它獲取目錄中的每個文件。 如果有人能幫助我,我會非常感激! 我知道這可能是因爲基本的,因爲它得到,但我的PHP的掌握是非常限制(雖然我看到它的美麗!)提前

感謝。

+0

請注意,文件擴展名可能多於或少於三個字符長。最好使用正則表達式,或者在每個點出現的地方拆分名稱並拿走最後一部分。 – 2010-09-03 08:31:05

回答

2
$ext = strtolower(substr($file, -3)); 

if($ext == "mp4" || $ext == "mov" || $ext == "flv"){... 
+0

當你添加15個擴展時會發生什麼?你結束了一大堆'|| $ ext =='blah''語句在一個非常笨拙的IF語句中。雖然這是一個可行的解決方案,但使用in_array()會更好。 – 2010-09-03 14:30:43

1

一個更簡潔的方式:

if (preg_match('/(mp4|mov|flv)$/', $file)) { ... 
+0

這不是很好的編碼習慣。用戶正在尋找特定的擴展名。這將在以下文件上返回true:mymoviescript.txt,因爲在文件名中找到了「mov」。這是錯誤的代碼。 – 2010-09-03 14:20:42

+0

@cdburgess:這是錯誤的,注意'$'錨點將搜索限制在字符串的末尾。在指責代碼不好之前,請理解正則表達式。 – 2010-09-03 14:34:14

+0

我的歉意。我完全錯過了'$'。 – 2010-09-03 14:48:45

4

的問題是,PHP不知道自動要比較strtolower(substr($file, -3))每個「或」部分。你需要明確說明這一點:

if(strtolower(substr($file, -3)) == "mp4" || strtolower(substr($file, -3)) == "mov" || strtolower(substr($file, -3)) == "flv"){... 

注意,它可能會更整潔做這樣的事情:

$tmp = strtolower(substr($file, -3)); 

if($tmp == "mp4" || $tmp == "mov" || $tmp == "flv"){... 
+0

我不是PHP大師,但使用strcmp比較字符串不是更好嗎?我想有一個很好的理由,爲什麼有這樣的功能。 – Bevor 2010-09-03 08:19:04

+0

@Bevor:唯一的原因是「因爲C也有這個功能」。 – kennytm 2010-09-03 08:27:59

12

你試過這是行不通的,因爲比較操作==是這樣的一個binary operator和期望兩個操作數,即operand1 == operand2。同樣適用於也是二元運算符的邏輯OR運算符,即operand1 || operand2

這意味着你需要寫這樣的事:

$ext = strtolower(substr($file, -3)); 
if ($ext == "mp4" || $ext == "mov" || $ext == "flv") 

這裏$ext只是用來避免重複strtolower(substr($file, -3))電話。在這種情況下,每個二元運算符有兩個操作數:

((($ext == "mp4") || ($ext == "mov")) || ($ext == "flv")) 
    \__/ \___/ 
    \__==___/  \__/ \___/ 
     \    \__==___/ 
      \_______||_______/ 
        \      \__/ \___/ 
        \      \__==___/ 
        \________________||_______/ 

我加了括號來突出其表達式求值順序)

因此,這是你怎麼也得寫。

但你也可以使用一個數組和in_array

in_array(strtolower(substr($file, -3)), array("mp4","mov","flv")) 

而且pathinfo可能是更好的獲取文件擴展名,所以:

in_array(pathinfo($file, PATHINFO_EXTENSION), array("mp4","mov","flv")) 
+0

你打敗了我41秒:-( – Toto 2010-09-03 08:20:11

+0

@Gumbo - 雖然你的回答很好,但它實際上並沒有解決OP的問題,這就是爲什麼他的「或者」沒有工作,我知道它已被其他人所覆蓋在這裏回答,但請考慮在他簡短的描述中加入他的代碼爲什麼不起作用,我會給你一個+1。 – Stephen 2010-09-03 08:39:27

+0

@Stephen:你去了嗎? – Gumbo 2010-09-03 10:36:28

2

另一種方式來做到這一點:

if (in_array(strtolower(substr($file, -3))), array('mp4', 'mov', 'flv')) { 
    // do something 
} 
+0

這在我看來是最好的解決方案。文件類型的數組可以擴展(或從數據庫自動化),不會影響代碼的效率。這是解決此問題的最優雅的解決方案。 – 2010-09-03 14:24:42

0

如果您想使用||進行比較,h ERE的語法:

if(strtolower(substr($file, -3)) == "mp4" || strtolower(substr($file, -3)) == "mov" || strtolower(substr($file, -3)) == "flv"){... 
當然

讓它快一點,填補strtolower(substr($file, -3))在一個變量中,這樣的PHP不執行這些功能不止一次:

$extension=strtolower(substr($file, -3)); 
if($extension == "mp4" || $extension == "mov" || $extension == "flv"){... 

的另一個好消息是, PHP有一個內置功能來搜索值的數組(in_array)是否存在價值:

if(in_array(strtolower(substr($file, -3)), array('mp4', 'mov', 'flv'))) 

最後一件事,如果你有簡單的字符串像茨艾倫e,那些你不想用php來擴展變量和內部的東西的人,use single qutations instead of doubles,這是一個很好的做法,並且節省了一些執行時間(當然幾乎沒有被一兩個字符串注意到,但這是一個很好的練習) 。

1

如果你想在一個目錄中只匹配特定的文件名,你可以使用glob

$files = glob('/path/to/dir/*.{mp4,mov,flv}', GLOB_BRACE); 

返回匹配的文件路徑的數組。

或者您使用fnmatch來匹配模式的文件名。

另外,如果你想以確保圖像是真正圖像,考慮checking against the MimeType代替或補充擴展

+0

這是一個如果你想循環訪問一個文件目錄,這是一個很好的解決方案但是,如果您正在上傳文件或需要檢查一個文件,則in_array()解決方案證明是更好的解決方案。 – 2010-09-03 14:28:36

+0

@cdburgess *我有一個腳本,查看目錄以查找*裏面的文件聽起來不像上傳或檢查單個文件(您仍然可以使用'fnmatch')。 – Gordon 2010-09-03 15:12:51

+0

我更關心glob。但是,也許你可以更新你的評論來展示'fnmatch'的一個好例子。 – 2010-09-03 15:51:20

0

$分機=用strtolower(SUBSTR($文件,-3));

開關($ EXT) { 情況下 'MP4': 案 'MOV': 情況下 'FLV': ///一些操作 中斷; }

+0

這不是很靈活。我也會考慮這種糟糕的編碼。 in_array()會容易得多。他們編寫代碼的方式需要開發人員在他們想添加新文件類型時編寫額外的代碼行(例如將來的mp5)。代碼應該使用變量,你不應該寫變量代碼。 – 2010-09-03 14:23:10