淺談PHP中foreach/in_array的使用
php在開(kāi)發(fā)效率很高,這是無(wú)可厚非的,但是卻是在犧牲執(zhí)行效率的。php數(shù)組功能非常強(qiáng)大,但是也要多加考慮,多試幾種情況情況,以防萬(wàn)一,這里,我就簡(jiǎn)單的說(shuō)兩個(gè)遇到的坑,以后如果有發(fā)現(xiàn)更多的,再補(bǔ)上吧!
foreach 提供了遍歷數(shù)組的簡(jiǎn)單方式,可以很方便的讀取到數(shù)據(jù)或?qū)ο蟮膬?nèi)容,但是官方文檔說(shuō)了,由于 foreach 依賴內(nèi)部數(shù)組指針,在循環(huán)中修改其值將可能導(dǎo)致意外的行為。所以,基本上,
1、不要想在循環(huán)內(nèi)部修改里面的值,否則結(jié)果將超出你想要的;
2、使用'&'是一個(gè)安全的方式,雖然很少用到,但是在用到時(shí),在引用結(jié)束后,應(yīng)立即調(diào)用unset函數(shù)銷毀該變量,否則,在接下來(lái)的代碼里,如果有再次使用到此變量,那么循環(huán)的最后一次值就將被修改了,從而得到了意外的值,比如:在列表循環(huán)輸出時(shí),最后一行輸出將會(huì)出現(xiàn)許多亂七八糟的值或者空值。使用unset可解決此問(wèn)題。
我們來(lái)看個(gè)示例
<?php
/*-------------------------------------------------------------------------*/
/* foreach example 1: value only */
echo "foreach example 1: value only ".'<br />';
$a = array(1, 2, 3, 17);
foreach ($a as $v) {
echo "Current value of ".$a.":". $v."<br />";
}
?>
// 運(yùn)行結(jié)果
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
in_array,其含義是檢查前一個(gè)字符串是否存在于后一個(gè)數(shù)組當(dāng)中,而且大多數(shù)情況下,它也是這么工作的,但是當(dāng)后面的數(shù)組是整數(shù)時(shí),如array(0,1,2,3)時(shí),就出問(wèn)題了,php會(huì)將前的字符串進(jìn)行intval,從而都會(huì)得到0這個(gè)值,那么如果恰巧,你的數(shù)組當(dāng)中有這個(gè)值,那么等式就成立了,是不是又超出了預(yù)期呢?
所以,當(dāng)確定后面的數(shù)據(jù)是整數(shù)時(shí),尤其是還有可能為0(這個(gè)可能代替所有的字符串了),你就千萬(wàn)不能再使用這個(gè)函數(shù)了,可使用key_exists來(lái)代替,但是后面的數(shù)據(jù)則需要使用array_flip進(jìn)行倒轉(zhuǎn)操作了。
我們?cè)賮?lái)看個(gè)示例
function search($keyWord, $stack) {//此處判斷是應(yīng)該更新還是插入
foreach ($stack as $key => $val) {
if (in_array($keyWord, $val)) {
return TRUE;
}
}
return FALSE;
}
當(dāng)一個(gè)字符串被當(dāng)作數(shù)組來(lái)去取值時(shí),又會(huì)發(fā)生什么呢?php是一門容錯(cuò)性很強(qiáng)的語(yǔ)言,它會(huì)盡量幫你改正錯(cuò)誤,所以很聰明地將你的引用下標(biāo)轉(zhuǎn)化為整數(shù),當(dāng)然就得到0了,那么字符串下標(biāo)為0取值則又會(huì)得到第一個(gè)字符串的值,是不是又超出了你的預(yù)期呢?解決方法是,在引用下標(biāo)之前,還是確認(rèn)一下這個(gè)變量是不是一個(gè)數(shù)組吧,is_array。
雖然有許許多多的前輩遇到這樣或那樣的問(wèn)題,也在不停地說(shuō),但是我們終究還是免不了,不停去犯錯(cuò)。這也許就是社會(huì)吧!大家都這么忙,哪有時(shí)間去破解你那爛代碼! 哈哈
- 淺談PHP中關(guān)于foreach使用引用變量的坑
- PHP 數(shù)組遍歷foreach語(yǔ)法結(jié)構(gòu)及實(shí)例
- PHP中使用foreach()遍歷二維數(shù)組的簡(jiǎn)單實(shí)例
- PHP模板引擎Smarty內(nèi)建函數(shù)foreach,foreachelse用法分析
- PHP中foreach()用法匯總
- php中使用in_array() foreach array_search() 查找數(shù)組是否包含時(shí)的性能對(duì)比
- PHP循環(huán)遍歷數(shù)組的3種方法list()、each()和while總結(jié)
- php下foreach提示W(wǎng)arning:Invalid argument supplied for foreach()的解決方法
- php each 返回?cái)?shù)組中當(dāng)前的鍵值對(duì)并將數(shù)組指針向前移動(dòng)一步實(shí)例
相關(guān)文章
使用php實(shí)現(xiàn)網(wǎng)站驗(yàn)證碼功能【推薦】
本文主要介紹了使用php實(shí)現(xiàn)網(wǎng)站驗(yàn)證碼功能的方法。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-02-02
php實(shí)現(xiàn)的pdo公共類定義與用法示例
這篇文章主要介紹了php實(shí)現(xiàn)的pdo公共類定義與用法,結(jié)合具體實(shí)例形式分析了php實(shí)現(xiàn)的pdo操作類定義及查詢、插入等使用技巧,需要的朋友可以參考下2017-07-07
php讀取富文本的時(shí)p標(biāo)簽會(huì)出現(xiàn)紅線是怎么回事
這篇文章主要介紹了php讀取富文本的時(shí)p標(biāo)簽會(huì)出現(xiàn)紅線是怎么回事,需要的朋友可以參考下2014-05-05

