簡(jiǎn)單了解PHP編程中數(shù)組的指針的使用
要使用數(shù)組中的元素,就需要數(shù)組的定位。定位的實(shí)現(xiàn)需要借助數(shù)組指針來完成。PHP中有很多函數(shù)可以移動(dòng)數(shù)組指針。下面將給大家介紹幾個(gè)。
將指針移動(dòng)到下一個(gè)數(shù)組位置next()
next()函數(shù)返回緊接著放在當(dāng)前數(shù)組指針下一個(gè)位置的數(shù)組值。其形式如下:
mixed next(array array)
以下是一個(gè)例子:
$fruits = array("apple", "banana", "orange", "pear"); echo next($fruits); echo next($fruits); // banana // orange
還可以將指針前移,也可以直接移動(dòng)到數(shù)組的開始和結(jié)尾位置。
將指針移動(dòng)到前一個(gè)數(shù)組位置prev()
prev()函數(shù)返回位于當(dāng)前指針前一個(gè)位置的數(shù)組值,如果指針本來就位于數(shù)組的第一個(gè)位置,則返回false。其形式如下:
mixed prev(array array)
prev()的用法與next()相同,例子就省略了。
將指針移到第一個(gè)數(shù)組位置reset()
reset()函數(shù)用于將數(shù)組指針設(shè)置回?cái)?shù)組的開始位置。其形式如下:
mixed reset(array array)
如果需要在腳本中多次查看或處理一個(gè)數(shù)組,就經(jīng)常使用這個(gè)函數(shù),另外這個(gè)函數(shù)還經(jīng)常在排序結(jié)束時(shí)使用。
將指針移動(dòng)到最后一個(gè)數(shù)組位置end()
end()函數(shù)將指針移動(dòng)到數(shù)組的最后一個(gè)位置,將返回最后一個(gè)元素。其形式如下:
mixed end(array array)
下面的例子展示了如果獲取第一個(gè)和最后一個(gè)數(shù)組值:
$fruits = array("apple", "banana", "orange", "pear"); echo current($fruits); echo end($fruits); // apple // pear
對(duì)于數(shù)組作為參數(shù)在函數(shù)間傳遞時(shí)又存在這樣一個(gè)規(guī)律:我們知道,函數(shù)調(diào)用時(shí),系統(tǒng)會(huì)將實(shí)參copy一份賦值給形參(引用調(diào)用除外),而對(duì)于數(shù)組,不僅僅 copy了實(shí)參的值,而且還copy了實(shí)參數(shù)組當(dāng)前內(nèi)部指針的位置。如果實(shí)參內(nèi)部指針的位置指向了數(shù)組末尾,那么系統(tǒng)會(huì)將形參的內(nèi)部指針重置,指向形參數(shù) 組的第一個(gè)單元;如果實(shí)參內(nèi)部指針的位置不在數(shù)組末尾,即指向了有效的單元,那么系統(tǒng)會(huì)將形參的數(shù)組指針位置與實(shí)參的數(shù)組指針指向值相同的數(shù)組單元。
如果不做 $arr['var6'] = 6 這一步操作,6個(gè)變量($var1-$var6)都將有值,因?yàn)樵趀ach之后,數(shù)組指針已經(jīng)指向了數(shù)組的末尾,那么在調(diào)用函數(shù) func()時(shí),系統(tǒng)會(huì)重置 $arrtmp的數(shù)組指針,將其指向第一個(gè)元素。但是在進(jìn)行 $arr['var6'] = 6這步操作之后,一切就改變了,這一個(gè)操作讓$arr的數(shù)組指針由原來指向一個(gè)NULL變成了一個(gè)有效值(說明一下,賦值前后,數(shù)組指針指向的地址單元一 直是沒有變化的,只不過是賦值前,那個(gè)地址單元什么也沒有,而賦值之后變成了6)。這就使得$arr的數(shù)組指針指向了一個(gè)有效的單元,那么在調(diào)用函數(shù) func()時(shí),系統(tǒng)是不會(huì)重置$arrtmp的數(shù)組指針的,$arrtmp的數(shù)組指針將會(huì)跟$arr的數(shù)組指針一樣,指向他自己的最后一個(gè)單元。而 each函數(shù)又是從當(dāng)前數(shù)組指針的位置開始工作的。因此each函數(shù)操作的第一個(gè)結(jié)果的返回值就是數(shù)組$arrtmp的最后一個(gè)元素了,它將數(shù)組指針再向下移動(dòng)一位,while循環(huán)到此結(jié)束,因此$arrtmp['var1']-$arrtmp['var5']都沒有被遍歷到,最終導(dǎo)致$var1-$var6為NULL。
數(shù)組在賦值的過程中,賦值數(shù)組和被賦值數(shù)組各自數(shù)組指針的變化情況。 先給出一條結(jié)論,然后我們?cè)谟么a來證明這個(gè)結(jié)論吧。$arrtmp=$arr;在這個(gè)賦值表達(dá)式中我把$arr叫做賦值數(shù)組,把$arrtmp叫做被賦值數(shù)組。數(shù) 組在賦值時(shí),如果賦值數(shù)組的數(shù)組指針已經(jīng)指向了數(shù)組末尾,則賦值之后賦值數(shù)組的數(shù)組指針會(huì)被重置,指向數(shù)組第一個(gè)元素;如果在賦值時(shí),賦值數(shù)組的數(shù)組指針 沒有指向數(shù)組末尾,而是指向了任何一個(gè)有效的數(shù)組元素,那么在賦值之后賦值數(shù)組的數(shù)組指針是不會(huì)被重置的,而是保留其原來指向的元素。在賦值之后,被賦值 數(shù)組不僅有了賦值數(shù)組的值,而且賦值數(shù)組的數(shù)組指針指向了那個(gè)元素,被賦值的數(shù)組也會(huì)指向自己中值相同的那個(gè)元素。
demo1:
<?php $arr = array('var1'=>1,'var2'=>2,'var3'=>3,'var4'=>4,'var5'=>5); while( list($key,$value) = each($arr) ) { if($value == 4) break; } var_dump(current($arr)); $arr1 = $arr; var_dump(current($arr)); var_dump(current($arr1)); ?>
demo1 的執(zhí)行結(jié)果是:int(5) int(5) int(5) 。從這個(gè)結(jié)果可以看出,賦值前后$arr的數(shù)組指針位置沒有發(fā)生任何變化,$arr1不僅值跟$arr相同,而且數(shù)組指針?biāo)赶虻脑刂狄彩窍嗤摹,F(xiàn)在 用上述結(jié)論來解釋這個(gè)結(jié)果,在while循環(huán)中,有一個(gè)if判斷語句,目的是不讓$arr的數(shù)組指針指向數(shù)組末尾,而是保留在一個(gè)有效的位置。 在$value=4時(shí)會(huì)跳出循環(huán),而each這個(gè)函數(shù)會(huì)將數(shù)組指針向前移動(dòng)一位,這就導(dǎo)致了$arr的數(shù)組指針指向了第5個(gè)元素,所以在賦值之 前,current($arr)的結(jié)果是5,賦值之后,由于在賦值之前$arr的當(dāng)前指針并沒有指向末尾,因此在賦值之后不會(huì)將$arr的數(shù)組指針進(jìn)行重 置,而是保留了其原有的位置,因此在賦值之后使用current($arr)的結(jié)果仍然是5。賦值時(shí)$arr1不僅獲得了$arr的值,而且數(shù)組指針指向 的元素和$arr的相同,二者都是5。
<?php $arr = array('var1'=>1,'var2'=>2,'var3'=>3,'var4'=>4,'var5'=>5); while( list($key,$value) = each($arr) ) { //if($value == 4) break; } var_dump(current($arr)); $arr1 = $arr; var_dump(current($arr)); var_dump(current($arr1)); ?>
demo2中我們將 if($value == 4) break; 這一句注釋掉了,目的很簡(jiǎn)單,就是通過each將$arr的數(shù)組指針位置指向數(shù)組末尾。
demo2 的執(zhí)行結(jié)果:bool(false) int(1) bool(false) 。如果數(shù)組指針對(duì)應(yīng)的元素為0,"",或者不是一個(gè)有效的值時(shí),current函數(shù)會(huì)返回false,$arr的值中沒有為0或者""的情況,因此可以斷 定是因?yàn)閿?shù)組指針指向了一個(gè)無效的元素而導(dǎo)致current返回了一個(gè)false。換句話說就是可以確定在while循環(huán)完成之后,$arr的數(shù)組指針已 經(jīng)指向了數(shù)組的末尾。所以我們看到在賦值之前current($arr)的值是false,而賦值之后current($arr)的值變成了1,說明賦值 之后$arr的數(shù)組指針被重置了,指向了數(shù)組的第一個(gè)元素。current($arr1)的值為false,說明賦值之后$arr1讓然保留了賦值之 前$arr的數(shù)組指針指向的元素。
通過demo1和demo2就可以證明上述結(jié)論了。
因此為了在遍歷數(shù)組時(shí)不受數(shù)組指針的影響,最好在使用each()函數(shù)之前或者之后調(diào)用函數(shù)reset()將數(shù)組指針重置。這樣就可以避免上述問題的發(fā)生了。另外還有一個(gè)操作數(shù)組指針的函數(shù)prev(),它的作用是將數(shù)組指針當(dāng)前的位置后退一位,它也需要注意一點(diǎn),就是如果數(shù)組指針已經(jīng)指向數(shù)組末尾,那么使它就得不到想要的結(jié)果了。
順便說一下foreach這個(gè)函數(shù),使用foreach函數(shù)來遍歷數(shù)組時(shí),它會(huì)重置數(shù)組指針,將其指向數(shù)組的第一個(gè)元素。必須注意的是foreach操作的對(duì)象是對(duì)你要遍歷的數(shù)組的copy值,而不是遍歷數(shù)組本身。
- PHP中使用數(shù)組指針函數(shù)操作數(shù)組示例
- php數(shù)組函數(shù)序列之next() - 移動(dòng)數(shù)組內(nèi)部指針到下一個(gè)元素的位置,并返回該元素值
- php 數(shù)組的指針操作實(shí)現(xiàn)代碼
- php數(shù)組函數(shù)序列之each() - 獲取數(shù)組當(dāng)前內(nèi)部指針?biāo)赶蛟氐逆I名和鍵值,并將指針移到下一位
- php數(shù)組函數(shù)序列之prev() - 移動(dòng)數(shù)組內(nèi)部指針到上一個(gè)元素的位置,并返回該元素值
- php數(shù)組指針操作詳解
- php數(shù)組函數(shù)序列之end() - 移動(dòng)數(shù)組內(nèi)部指針到最后一個(gè)元素,并返回該元素的值
- php reset() 函數(shù)指針指向數(shù)組中的第一個(gè)元素并輸出實(shí)例代碼
- PHP數(shù)組遍歷知識(shí)匯總(包含遍歷方法、數(shù)組指針操作函數(shù)、數(shù)組遍歷測(cè)速)
- php數(shù)組指針函數(shù)功能及用法示例
相關(guān)文章
提高PHP性能的編碼技巧以及性能優(yōu)化詳細(xì)解析
include文件時(shí)盡量使用絕對(duì)路徑,因?yàn)樗苊饬薖HP去include_path里查找文件的速度,解析操作系統(tǒng)路徑所需的時(shí)間會(huì)更少2013-08-08php中instanceof 與 is_a()區(qū)別分析
總的來說php中instanceof 與 is_a()功能是一樣的,不同的是由于PHP的版本不同,部分PHP版本舍棄了is_a() 下面我們來具體分析下吧。2015-03-03php上傳后臺(tái)無法收到數(shù)據(jù)解決方法
在本篇文章里小編給大家整理的是關(guān)于php無法收到數(shù)據(jù)的相關(guān)知識(shí)點(diǎn)內(nèi)容,有需要的朋友們參考學(xué)習(xí)下。2019-10-10php中array_fill函數(shù)的實(shí)例用法
在本篇文章里小編給大家整理的是一篇關(guān)于php中array_fill函數(shù)的實(shí)例用法,有興趣的朋友們可以學(xué)習(xí)參考下。2021-03-03php下用GD生成生成縮略圖的兩個(gè)選擇和區(qū)別
php下用GD生成生成縮略圖的兩個(gè)選擇和區(qū)別...2007-04-04PHP大批量數(shù)據(jù)操作時(shí)臨時(shí)調(diào)整內(nèi)存與執(zhí)行時(shí)間的方法
PHP大批量數(shù)據(jù)操作時(shí)臨時(shí)調(diào)整內(nèi)存與執(zhí)行時(shí)間的方法 ,因?yàn)檫\(yùn)行的程序會(huì)很大很慢所以需要臨時(shí)設(shè)置下。不用修改php.ini參數(shù)了。2011-04-04使用XDebug調(diào)試及單元測(cè)試覆蓋率分析
那天校長(zhǎng)分析了關(guān)于數(shù)據(jù)庫(kù)的分析及優(yōu)化的一些方法,很好用,也體會(huì)性能作為應(yīng)用程序的重要指標(biāo),需要我們重視。2011-01-01淺談PHP的exec()函數(shù)無返回值排查方法(必看)
下面小編就為大家?guī)硪黄獪\談PHP的exec()函數(shù)無返回值排查方法(必看)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03