溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

數(shù)組指針怎么在PHP項目中使用

發(fā)布時間:2020-12-19 14:56:25 來源:億速云 閱讀:153 作者:Leah 欄目:開發(fā)技術(shù)

數(shù)組指針怎么在PHP項目中使用?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

要使用數(shù)組中的元素,就需要數(shù)組的定位。定位的實現(xiàn)需要借助數(shù)組指針來完成。PHP中有很多函數(shù)可以移動數(shù)組指針。下面將給大家介紹幾個。

將指針移動到下一個數(shù)組位置next()

next()函數(shù)返回緊接著放在當前數(shù)組指針下一個位置的數(shù)組值。其形式如下:

mixed next(array array)

以下是一個例子:

$fruits = array("apple", "banana", "orange", "pear");

echo next($fruits);

echo next($fruits);

// banana

// orange

還可以將指針前移,也可以直接移動到數(shù)組的開始和結(jié)尾位置。

將指針移動到前一個數(shù)組位置prev()

prev()函數(shù)返回位于當前指針前一個位置的數(shù)組值,如果指針本來就位于數(shù)組的第一個位置,則返回false。其形式如下:

mixed prev(array array)

prev()的用法與next()相同,例子就省略了。

將指針移到第一個數(shù)組位置reset()

reset()函數(shù)用于將數(shù)組指針設置回數(shù)組的開始位置。其形式如下:

mixed reset(array array)

如果需要在腳本中多次查看或處理一個數(shù)組,就經(jīng)常使用這個函數(shù),另外這個函數(shù)還經(jīng)常在排序結(jié)束時使用。

將指針移動到最后一個數(shù)組位置end()

end()函數(shù)將指針移動到數(shù)組的最后一個位置,將返回最后一個元素。其形式如下:

mixed end(array array)

下面的例子展示了如果獲取第一個和最后一個數(shù)組值:

$fruits = array("apple", "banana", "orange", "pear");

echo current($fruits);

echo end($fruits);

// apple

// pear

對于數(shù)組作為參數(shù)在函數(shù)間傳遞時又存在這樣一個規(guī)律:我們知道,函數(shù)調(diào)用時,系統(tǒng)會將實參copy一份賦值給形參(引用調(diào)用除外),而對于數(shù)組,不僅僅 copy了實參的值,而且還copy了實參數(shù)組當前內(nèi)部指針的位置。如果實參內(nèi)部指針的位置指向了數(shù)組末尾,那么系統(tǒng)會將形參的內(nèi)部指針重置,指向形參數(shù) 組的第一個單元;如果實參內(nèi)部指針的位置不在數(shù)組末尾,即指向了有效的單元,那么系統(tǒng)會將形參的數(shù)組指針位置與實參的數(shù)組指針指向值相同的數(shù)組單元。

如果不做 $arr['var6'] = 6 這一步操作,6個變量($var1-$var6)都將有值,因為在each之后,數(shù)組指針已經(jīng)指向了數(shù)組的末尾,那么在調(diào)用函數(shù) func()時,系統(tǒng)會重置 $arrtmp的數(shù)組指針,將其指向第一個元素。但是在進行 $arr['var6'] = 6這步操作之后,一切就改變了,這一個操作讓$arr的數(shù)組指針由原來指向一個NULL變成了一個有效值(說明一下,賦值前后,數(shù)組指針指向的地址單元一 直是沒有變化的,只不過是賦值前,那個地址單元什么也沒有,而賦值之后變成了6)。這就使得$arr的數(shù)組指針指向了一個有效的單元,那么在調(diào)用函數(shù) func()時,系統(tǒng)是不會重置$arrtmp的數(shù)組指針的,$arrtmp的數(shù)組指針將會跟$arr的數(shù)組指針一樣,指向他自己的最后一個單元。而 each函數(shù)又是從當前數(shù)組指針的位置開始工作的。因此each函數(shù)操作的第一個結(jié)果的返回值就是數(shù)組$arrtmp的最后一個元素了,它將數(shù)組指針再向下移動一位,while循環(huán)到此結(jié)束,因此$arrtmp['var1']-$arrtmp['var5']都沒有被遍歷到,最終導致$var1-$var6為NULL。

數(shù)組在賦值的過程中,賦值數(shù)組和被賦值數(shù)組各自數(shù)組指針的變化情況。 先給出一條結(jié)論,然后我們在用代碼來證明這個結(jié)論吧。$arrtmp=$arr;在這個賦值表達式中我把$arr叫做賦值數(shù)組,把$arrtmp叫做被賦值數(shù)組。數(shù) 組在賦值時,如果賦值數(shù)組的數(shù)組指針已經(jīng)指向了數(shù)組末尾,則賦值之后賦值數(shù)組的數(shù)組指針會被重置,指向數(shù)組第一個元素;如果在賦值時,賦值數(shù)組的數(shù)組指針 沒有指向數(shù)組末尾,而是指向了任何一個有效的數(shù)組元素,那么在賦值之后賦值數(shù)組的數(shù)組指針是不會被重置的,而是保留其原來指向的元素。在賦值之后,被賦值 數(shù)組不僅有了賦值數(shù)組的值,而且賦值數(shù)組的數(shù)組指針指向了那個元素,被賦值的數(shù)組也會指向自己中值相同的那個元素。

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) 。從這個結(jié)果可以看出,賦值前后$arr的數(shù)組指針位置沒有發(fā)生任何變化,$arr1不僅值跟$arr相同,而且數(shù)組指針所指向的元素值也是相同的?,F(xiàn)在 用上述結(jié)論來解釋這個結(jié)果,在while循環(huán)中,有一個if判斷語句,目的是不讓$arr的數(shù)組指針指向數(shù)組末尾,而是保留在一個有效的位置。 在$value=4時會跳出循環(huán),而each這個函數(shù)會將數(shù)組指針向前移動一位,這就導致了$arr的數(shù)組指針指向了第5個元素,所以在賦值之 前,current($arr)的結(jié)果是5,賦值之后,由于在賦值之前$arr的當前指針并沒有指向末尾,因此在賦值之后不會將$arr的數(shù)組指針進行重 置,而是保留了其原有的位置,因此在賦值之后使用current($arr)的結(jié)果仍然是5。賦值時$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; 這一句注釋掉了,目的很簡單,就是通過each將$arr的數(shù)組指針位置指向數(shù)組末尾。

demo2 的執(zhí)行結(jié)果:bool(false) int(1) bool(false) 。如果數(shù)組指針對應的元素為0,"",或者不是一個有效的值時,current函數(shù)會返回false,$arr的值中沒有為0或者""的情況,因此可以斷 定是因為數(shù)組指針指向了一個無效的元素而導致current返回了一個false。換句話說就是可以確定在while循環(huán)完成之后,$arr的數(shù)組指針已 經(jīng)指向了數(shù)組的末尾。所以我們看到在賦值之前current($arr)的值是false,而賦值之后current($arr)的值變成了1,說明賦值 之后$arr的數(shù)組指針被重置了,指向了數(shù)組的第一個元素。current($arr1)的值為false,說明賦值之后$arr1讓然保留了賦值之 前$arr的數(shù)組指針指向的元素。

通過demo1和demo2就可以證明上述結(jié)論了。

因此為了在遍歷數(shù)組時不受數(shù)組指針的影響,最好在使用each()函數(shù)之前或者之后調(diào)用函數(shù)reset()將數(shù)組指針重置。這樣就可以避免上述問題的發(fā)生了。另外還有一個操作數(shù)組指針的函數(shù)prev(),它的作用是將數(shù)組指針當前的位置后退一位,它也需要注意一點,就是如果數(shù)組指針已經(jīng)指向數(shù)組末尾,那么使它就得不到想要的結(jié)果了。

順便說一下foreach這個函數(shù),使用foreach函數(shù)來遍歷數(shù)組時,它會重置數(shù)組指針,將其指向數(shù)組的第一個元素。必須注意的是foreach操作的對象是對你要遍歷的數(shù)組的copy值,而不是遍歷數(shù)組本身。

關(guān)于數(shù)組指針怎么在PHP項目中使用問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI