首頁  >  文章  >  後端開發  >  php:foreach和in_array用法實例詳解

php:foreach和in_array用法實例詳解

伊谢尔伦
伊谢尔伦原創
2017-06-23 14:42:282095瀏覽

php在開發效率很高,這是無可厚非的,但是卻是在犧牲執行效率的。 php陣列功能非常強大,但是也要多加考慮,多試幾種情況情況,以防萬一,這裡,就簡單的說兩個遇到的坑,以後如果有發現更多的,再補上吧!

1. foreach 提供了遍歷數組的簡單方式,可以很方便的讀取到資料或物件的內容,但是官方文件說了,由於foreach 依賴內部數組指針,在循環中修改其值將可能導致意外的行為。所以,基本上,
1、不要想在循環內部修改裡面的值,否則結果將超出你想要的;
2、使用'&'是一個安全的方式,雖然很少用到,但是在用到時,在引用結束後,應立即調用unset函數銷毀該變量,否則,在接下來的程式碼裡,如果有再次使用到此變量,那麼循環的最後一次值就將被修改了,從而得到了意外的值,例如:在列表循環輸出時,最後一行輸出將會出現許多亂七八糟的值或空值。使用unset可解決此問題。

我們來看個範例

<?php 
/*-------------------------------------------------------------------------*/ 
/* foreach example 1: value only */ 
echo "foreach example 1: value only ".&#39;<br />&#39;; 
$a = array(1, 2, 3, 17); 
foreach ($a as $v) { 
echo "Current value of ".$a.":". $v."<br />"; 
} 
?> 
// 运行结果 
foreach example 1: value only 
Current value of $a: 1 
Current value of $a: 2 
Current value of $a: 3 
Current value of $a: 17

2. in_array,#其意義是檢查前一個##字符字串是否存在於後一個數組當中,而且大多數情況下,它也是這麼工作的,但是當後面的數組是整數時,如array(0,1,2,3)時,就出問題了,php會將前的字串進行intval,從而都會得到0這個值,那麼如果恰巧,你的數組當中有這個值,那麼等式就成立了,是不是又超出了預期呢?

所以,當確定後面的資料是整數時,尤其是還有可能為0(這個可能取代所有的字串了),你就千萬不能再使用這個函數了,可使用key_exists來代替,但是後面的資料則需要使用

array_flip進行倒轉作業了。

我們再來看個範例

function search($keyWord, $stack) {//此处判断是应该更新还是插入

      foreach ($stack as $key => $val) {

        if (in_array($keyWord, $val)) {

          return TRUE;

        }

      }

      return FALSE;

    }

  當一個字串被當作陣列來去取值時,又會發生什麼事呢? php是一門容錯性很強的語言,它會盡量幫你改正錯誤,所以很聰明地將你的引用下標轉換為整數,當然就得到0了,那麼字串下標為0取值則又會得到第一個字串的值,是不是又超出了你的預期呢?解決方法是,在引用下標之前,還是確認一下這個變數是不是數組吧,is_array。

3. foreach中引用變數遇到的問題

寫PHP好多年,但仍會犯低階錯誤,今天遇到個foreach中引用變數時的問題,PHP版本為5.6.12 程式碼如下:

<?php
$arr = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;, &#39;e&#39;];
foreach ($arr as $i=>&$a) {
  $a = $a.&#39;_&#39;. $a;
  echo $a .&#39;<br>&#39;;
}
echo &#39;<hr>&#39;;
foreach ($arr as $i=>$a) {
  echo $a .&#39;<br>&#39;;
}
echo &#39;<hr>&#39;;
print_r($arr);

輸出結果

#開始看到第二個foreach 輸出的結果感覺很是莫名其妙,怎麼會輸出兩個d_d 呢?

仔細想了想,原來因為PHP foreach 中的$a 的作用域是整個

函數的局部變量,在循環外部仍然有效,而不是被封閉在循環內的,

所以當執行第二個foreach 時的$a 並不是新的變量,而是仍然指向$arr

數組第5個元素的位址引用,

當第二個foreach 在迴圈時實際上是在不停的給$arr 數組的第5個元素賦值,

具體賦值情況,

第一次:a_a 賦值為第5個元素, 結果為: [a_a, b_b, c_c, d_d,a_a]

第二次:b_b 賦值給第5個元素,結果為: [a_a, b_b, c_c, d_d,b_b]

第三次:c_c 賦值為第5個元素,結果為: [a_a, b_b, c_c, d_d,c_c]

第四次:d_d 賦值為第5個元素,結果為: [a_a, b_b, c_c, d_d,d_d]

第五次:此時因為第五個元素已經變成d_d 又重新把d_d 賦值給第5個元素,結果還是為: [a_a, b_b, c_c, d_d,d_d]

#解決方案: #

1.尽量不使用相同的循环变量名

2.每次使用完或再次使用前进行 unset($a); 处理,解除地址应用

还是用上面代码示例:

$arr = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;, &#39;e&#39;];
foreach ($arr as $i=>&$a) {
  $a = $a.&#39;_&#39;. $a;
  echo $a .&#39;<br>&#39;;
}
echo &#39;<hr>&#39;;
echo $a;
echo &#39;<hr>&#39;;

// 这里 unset 掉
unset($a);

echo $a = &#39;ccc&#39;;
echo &#39;<hr>&#39;;
print_r($arr);
echo &#39;<hr>&#39;;
foreach ($arr as $i=>$a) {
  echo $a .&#39;<br>&#39;;
}
echo &#39;<hr>&#39;;
print_r($arr);

输出结果:

现在就正常了,这些小细节一定要注意了。

以上是php:foreach和in_array用法實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn