2010-08-14 61 views
4

我有一個foreach循環,它將遍歷一個數組,但根據這個特定應用程序的邏輯,數組可能不存在。PHP處理可能未設置的變量的最佳方法是什麼?

我的問題涉及到我想最好的做法,例如,是否確定要做到這一點:

if (isset($array)) 
{ 

    foreach($array as $something) 
    { 
     //do something 
    } 
} 

看來凌亂的我,但在這種情況下,如果我不這樣做,它的錯誤的foreach。我應該傳遞一個空數組嗎?我沒有發佈特定的代碼,因爲它是關於處理可能或可能不會設置變量的一般問題。

+0

爲什麼不設置'$ array'?你能給個例子嗎? – strager 2010-08-14 03:12:56

回答

8

只是要注意:這裏是'最安全'的方式。

if (isset($array) && is_array($array)) { 
    foreach ($array as $item) { 
     // ... 
    } 
} 
+1

這是一個好方法。 +1 – Stephen 2010-08-14 03:20:30

1

嘗試:

if(!empty($array)) 
{ 
    foreach($array as $row) 
    { 
     // do something 
    } 
} 
+1

這與isset一樣糟糕,因爲如果存在一個值集並且它不是一個數組,coede將繼續並可能產生不可預測的結果。 – prodigitalson 2010-08-14 03:10:02

+2

@prodigitalson我不得不說,如果變量可能包含一個數組,或可能包含其他類似字符串,或可能不存在....你做錯了什麼。 – Stephen 2010-08-14 03:13:07

+0

是的,這就是我對isset/empty的想法,你真的需要了解它們的確切目的..但是,也像你說的那樣,變量可能包含不同的東西。你在什麼地方確保數據是正確的類型?我認爲'類型檢查'或什麼?當人們說PHP是一種loosley類型的語言時,它是什麼意思?從某種意義上說,它將允許你交換數據類型,而其他一些語言則要求你聲明它們等。 – Tim 2010-08-14 03:18:11

0

這不是凌亂的。事實上,這是最好的做法。如果我不得不指出任何雜亂的東西,那就是使用Allman支架風格,但那是個人喜好。 (我是一個1TBS的那種人);)

我通常會做到這一點在我所有的類方法:

public function do_stuff ($param = NULL) { 
    if (!empty($param)) { 
     // do stuff 
    } 
} 

字空了()。有些情況下,isset更可取,但如果變量沒有設置,或者它包含「空」值,如空字符串或數字0,則爲空。

+0

ah男人,不要讓我開始支撐造型,我只是切換到這一個,因爲我讀(我認爲)Codeigniter指導方針誰推薦它大聲笑 – Tim 2010-08-14 03:14:34

+0

@ user270797這很有趣!我的同事剛剛寫了一些正則表達式查找和替換調用來解析整個codeigniter核心文件並將它們轉換爲1TBS,因爲allman風格非常煩人! – Stephen 2010-08-14 03:16:41

+0

沒有problamo!評論刪除。 – Stephen 2010-08-14 03:17:33

0

如果您傳遞一個空數組以便foreach很好,但如果你傳遞一個未初始化的數組變量,那麼它將產生錯誤。

當數組爲空或甚至未初始化時,它將工作。

if(!empty($array) && is_array($array)) { 
    foreach(...) 
} 
+0

如果'$ array'不是空的,而是不是數組,則會產生警告。 – NullUserException 2010-08-14 03:18:27

+0

@NullUserException:是的你是對的,但我想當你使用一個名爲「數組」的變量,那麼它可能只是數組或你忘了初始化根據問題。無論如何,** is_array **條件是可以的。 – NAVEED 2010-08-14 03:25:10

+1

沒有什麼能阻止我說'$ array = null',是嗎? – NullUserException 2010-08-14 03:26:13

-1

我會說這是很好的做法,被設置爲0(PHP的錯誤),以啓動一個「布爾」等價值,任何時間部分功能添加到這個數組,添加+1布爾,所以你會有一個明確的方法來知道你是否應該搞亂數組?

這就是我在面嚮對象語言中採用的方法,在PHP中它可能會變得更加混亂,但我仍然發現最好有一個故意變量保持跟蹤,而不是嘗試分析數組本身。理想情況下,如果這個變量總是一個數組,將第一個值設置爲0,並將其用作標誌:

<?PHP 
//somewhere in initialization 
$myArray[0] = 0; 
... 
//somewhere inside an if statement that fills up the array 
$myArray[0]++; 
$myArray[1] = someValue; 

//somewhere later in the game: 
if($myArray[0] > 0){   //check if this array should be processed or not 
     foreach($myArray as $row){  //start up the for loop 
      if(! $skippedFirstRow){ //$skippedFirstRow will be false the first try 
       $skippedFirstRow++; //now $skippedFirstRow will be true 
       continue;   //this will skip to the next iteration of the loop 
      } 
      //process remaining rows - nothing will happen here for that first placeholder row 
     } 
} 
?> 
+0

只是一個說明 - 你應該儘量避免這樣做,上述方法是最後的手段,因爲它肯定還是很混亂。 – 2010-08-14 04:28:14

+0

他在問什麼是檢查變量是否是數組的最佳做法。我不確定在什麼情況下你的代碼是有意義的。 0不是PHP的錯誤:false(或FALSE)是PHP的錯誤,您爲什麼會將其他正常數組中的第一個元素設置爲false?這段代碼試圖完成什麼? – 2010-08-14 04:31:23

+0

好吧,PHP的真/假生鏽了一點,不管這個還是有效的。 如果您再次閱讀該問題,他正在討論可能存在或不存在的數組,並使用此數組的存在作爲邏輯決策。我會說,對於任何主要的代碼來說,在任何情況下使用數組的存在都不是好習慣,你應該製作一個變量來跟蹤它。在這種情況下,我選擇將true/false作爲1/0存儲在數組本身中。 再次閱讀代碼,你應該能夠弄清楚它是如何工作的,我徹底評論過。 – 2010-08-15 00:12:13

相關問題