這篇文章主要介紹“如何使用PHP 數(shù)組遍歷/指針/函數(shù)”,在日常操作中,相信很多人在如何使用PHP 數(shù)組遍歷/指針/函數(shù)問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對(duì)大家解答”如何使用PHP 數(shù)組遍歷/指針/函數(shù)”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!
創(chuàng)新互聯(lián)建站專注于大城網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供大城營銷型網(wǎng)站建設(shè),大城網(wǎng)站制作、大城網(wǎng)頁設(shè)計(jì)、大城網(wǎng)站官網(wǎng)定制、成都小程序開發(fā)服務(wù),打造大城網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供大城網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。數(shù)據(jù)由元素組成,元素由鍵和值組成
關(guān)聯(lián)數(shù)組
關(guān)聯(lián)數(shù)組,元素的下標(biāo)與元素的值存在邏輯上的關(guān)系,稱之為關(guān)聯(lián)數(shù)組。指的是,鍵和值之間存在管理。
$a1 = array('name' => '李尋歡', 'age' => 34);
索引數(shù)組
索引數(shù)組,元素的值和下標(biāo)不存在邏輯關(guān)系,而下標(biāo)只表示值索引位置。
$a1 = array('李尋歡',34);
所要的完成遍歷數(shù)組,需要依次得到每個(gè)元素的信息(鍵的信息和值的信息).核心在于數(shù)組的元素指針上
數(shù)組的元素指針
每一個(gè)數(shù)組內(nèi)的,都有一個(gè)內(nèi)部的指向某個(gè)元素的指針。
默認(rèn)情況下,這個(gè)指針指向數(shù)組的第一個(gè)元素.
每個(gè)數(shù)組只有一個(gè)指針,同時(shí)時(shí)刻,只能指向一個(gè)元素,因此指針的位置,可以是任意一個(gè)已存在的元素。同時(shí)指針可能指向數(shù)組的外部(數(shù)組的末端[最后一個(gè)的外邊]),就是非法位置.
數(shù)組遍歷就是
獲得指針指向的元素的信息,移動(dòng)指針,配合循環(huán)結(jié)構(gòu)就可以完成。
php提供
得到指針?biāo)赶虻脑氐男畔?/p>
可以移動(dòng)指針
current(); 得到當(dāng)前指針指向元素的值
key(); 得到當(dāng)前指向元素的鍵
next(); 可以移動(dòng)數(shù)組的指針
prev(); 向上移動(dòng)一個(gè)元素.
reset(); 重置指針(移動(dòng)到第一個(gè)元素)
end(); 移動(dòng)到最右一個(gè)元素
數(shù)組末端,最右一個(gè)元素往右,非法的范圍
next(), 和prev(); 可以將數(shù)組指針移動(dòng)到非法位置上.
//$students 是數(shù)組 end($students); next($students); var_dump(current($students)); //false; reset($students); prev($students); var_dump(current($students)); //false;
如果已經(jīng)移動(dòng)到非法位置,不可相對(duì)移動(dòng)來挽回,此時(shí),需要強(qiáng)制移動(dòng)到某個(gè)位置, reset() , 和 end()
//$students 是數(shù)組 end($students); next($students); prev($students); var_dump(current($students)); //false; reset($students); prev($students); next($students); var_dump(current($students)); //false;
foreach(); 結(jié)構(gòu)
專門用于數(shù)組遍歷的一個(gè)結(jié)構(gòu),也是一個(gè)循環(huán)結(jié)構(gòu)
foreach ( $arr as $key => $val ) { //循環(huán)體 }
如果元素的鍵,沒有意義的話,可以使用 省略鍵的信息
foreach ( $arr as $val ) {}
注意:
foreach會(huì)移動(dòng)數(shù)組指針,并且,在foreach遍歷完畢后,指針處于非法位置(數(shù)組末端)
foreach在遍歷一個(gè)數(shù)組元素時(shí),會(huì)初始化元素指針,因此指針?biāo)赶虻奈恢茫粫?huì)影響到foreach的遍歷
foreach在遍歷時(shí),原數(shù)組的拷貝,而不是直接在原數(shù)組進(jìn)行遍歷,如果在遍歷過程中,對(duì)遍歷的數(shù)組進(jìn)行修改,是不會(huì)影響到遍歷的結(jié)果
foreach所使用的保存元素值的變量,對(duì)其操作,不會(huì)對(duì)原數(shù)組產(chǎn)生影響
對(duì)值的操作,同時(shí)支持引用傳遞:可以改變?cè)瓟?shù)組的值。
只需要在變量前增加&符號(hào) 即可。
foreach流程圖
foreach也是循環(huán)結(jié)構(gòu), 受break和continue的控制。
遍歷每一個(gè)
可以獲得當(dāng)前的元素信息。(鍵和值),同時(shí)向下移動(dòng)指針
獲得元素信息,返回的是, 關(guān)聯(lián)和索引數(shù)組
其中:
關(guān)聯(lián)數(shù)組部分。
key => 當(dāng)前元素的鍵 value => 元素的值
索引數(shù)組部分
0 => 元素的下標(biāo) 1 => 元素的值 $arr = array(10, 12, 200); $arr2 = array( 'name' => 'zf', 'age' => 20 ); var_dump(each($arr)); var_dump(each($arr2));
只遍歷第一項(xiàng)
由于each既可以獲取元素信息,又可以移動(dòng)指針,因此非常適合完成除foreach外的手動(dòng)的數(shù)組的遍歷.
each如果指針非法,each返回false。 判斷each的返回值
// 先eaech,將each的結(jié)果賦給$element // 判斷$element 是否成立(自動(dòng)轉(zhuǎn)成布爾類型) while($element = each($sutdents)) { echo 'Key:', $element[0]; echo '$nbsp;'; echo 'Value:', $element[1]; echo '<br/>'; }
list()
可以使在遍歷的循環(huán)體內(nèi)直接使用保存元素下標(biāo)的變量.直接使用保存元素下標(biāo)的變量和保存元素值的變量.
一個(gè)函數(shù),可以通過一個(gè)數(shù)組,針對(duì)多個(gè)變量同時(shí)初始化
$student = array('李尋歡', '天機(jī)老人', '阿飛'); list($a, $b, $c) = $student; // 將數(shù)組內(nèi)的元素, 以此賦值給list結(jié)構(gòu)中的變量 // 類似 es6 中的解構(gòu)賦值 var_dump($a, $b, $c);
list 針對(duì)索引數(shù)組生效
$student = array('李尋歡', '天機(jī)老人', '阿飛'); while (list($k, $v) = each($student)) { echo 'Key:', $k; echo ' '; echo 'Value:', $v; echo '<br/>'; };
如果原數(shù)組指針合法:
數(shù)組在復(fù)制時(shí),指針位置也會(huì)隨之復(fù)制到目標(biāo)數(shù)組內(nèi).
$a1 = array('a', 'b', 'c'); $a2 = $a1; var_dump(current($a2)); // a echo '<hr/>'; $a1 = array('a', 'b', 'c'); next($a1); $a2 = $a1; var_dump(current($a2)); // b
如果原數(shù)組指針非法:
將重置新數(shù)組的指針; 重置為默認(rèn)指針.
$a1 = array('a', 'b', 'c'); end($a1); next($a1); $a2 = $a1; var_dump(current($a2)); // a
foreach對(duì)指針的影響有不確定性,因此不要依賴foreach遍歷后的指針位置,如果需要操作,需要先重置(reset();).
數(shù)組遍歷的是,原數(shù)組的拷貝,而不是直接在數(shù)組上進(jìn)行操作.
php內(nèi)部優(yōu)化,寫時(shí)復(fù)制(COW--copy on write) .如果不對(duì)原數(shù)組執(zhí)行寫操作. 是不會(huì)發(fā)生復(fù)制的過程. 在對(duì)原數(shù)組進(jìn)行寫操作時(shí),這個(gè)復(fù)制的過程才會(huì)發(fā)生.
數(shù)組復(fù)制時(shí)的指針問題
foreach遍歷的時(shí)候,是拷貝,但是發(fā)生在對(duì)原數(shù)組進(jìn)行操作之后.意味著,在寫操作之前,遍歷操作的就直接是原數(shù)組. 一旦發(fā)生了寫操作,則會(huì)形成一個(gè)真實(shí)的拷貝,foreach去遍歷的數(shù)組就與原數(shù)組不是同一個(gè). 因此原數(shù)組指針就不會(huì)繼續(xù)發(fā)生變化. 的例外在最后一次循環(huán)體內(nèi)對(duì)數(shù)組進(jìn)行寫操作,此時(shí)在復(fù)制前指針已經(jīng)非法,則結(jié)果會(huì)被重置.
在實(shí)際操作中,建議處理完畢后,可以立即reset();
上面的問題,只適用于$value ,保存元素值的變量是值傳遞的情況,如果是引用傳遞的話.直接操作原數(shù)組!
$key不能引用傳遞.
array_fill(起始位置,長度,內(nèi)容); //使用固定值填充某些數(shù)量的元素.
count(); //統(tǒng)計(jì)數(shù)組元素個(gè)數(shù). 支持遞歸統(tǒng)計(jì).
range(起始范圍,結(jié)束范圍); //按照范圍創(chuàng)建數(shù)組元素.
array_merge(); //合并多個(gè)數(shù)組.
// 注意一個(gè)下標(biāo)沖突的情況,如果索引下標(biāo)沖突,順序增加. // 關(guān)聯(lián)數(shù)組沖突. 后合并的要覆蓋前面的. array_merge(range('a','z'),range('A','Z'));
array_rand(數(shù)組,選擇的數(shù)量[默認(rèn)一個(gè)]); //隨機(jī)從數(shù)組中取得某些元素. 得到的是隨機(jī)的下標(biāo),而不是元素值. 并且,如果是多個(gè)元素,會(huì)按照下標(biāo)的大小進(jìn)行排序.
shuffe(); //打亂元素順序,參數(shù)是引用傳遞.
// 驗(yàn)證碼中的 4位 隨機(jī)數(shù) // 創(chuàng)建一個(gè)大小混合的數(shù)組 $chars = array_merge(range('a','z'),range('A','Z')); // 取得4個(gè)元素下標(biāo) $rand_keys = array_rand($chars, 4); // 打亂 shuffle($rand_keys); // 利用下標(biāo)獲取元素值 foreach ($rand_keys as $v) { echo $chars[$v]; }
array_value(); //取得所有元素的所有值.
array_key(); //取得所有元素的所有鍵.array_combine(); // 利用兩個(gè)數(shù)組,其中一個(gè)為 鍵 ,另一個(gè)為值得到一個(gè)新數(shù)組.
in_array(); //判斷數(shù)組中是否有某個(gè)值
array_key_exists(); //是否有某個(gè)元素.array_search(); // 在數(shù)組內(nèi)查找某個(gè)元素值,找到返回 下標(biāo). 找不到返回false.
array_filp(); // 交換元素的鍵和值.
'+'號(hào)
$a1 = array(1, 2, 3, 4); $a2 = array(6, 7, 8); var_dump($a1+$a2); // 如果出現(xiàn)下標(biāo)沖突,則忽略后邊的元素
array_merge($arr1, $arr2); // 合并多個(gè)數(shù)組.
array_chunk($arr, len); //按照子數(shù)組的長度,進(jìn)行對(duì)原數(shù)組拆分.
explode(); //將一個(gè)字符串,按照某個(gè)字符,分割成多個(gè)部分.
implode(); //可以將數(shù)組元素的值, 利用某個(gè)字符,連接
$arr = array('aa', 'bb'); echo $arr = implode('-', $arr); // aa-bb print_r(explode('-', $arr));
compact(); 合并, 利用多個(gè)變量,合并成一個(gè)數(shù)組. 其中變量的名字作為數(shù)組的下標(biāo). 變量的值,作為值. 注意參數(shù)是變量名
$width = 2; $height = 10; $arr = compact('width', 'height');
extact(); 拆分,將一個(gè)變量,拆分成一個(gè)變量。每一個(gè)元素為一個(gè)變量。 下標(biāo)為變量名,值為變量值. 字符串的下標(biāo).
注意,如果當(dāng)前已經(jīng)存在變量名,則會(huì)發(fā)生將已有變量值替換的操作.這個(gè)是默認(rèn)行為.可以修改,通過extact(),第二個(gè)參數(shù). 默認(rèn)為EXTR_OVERWRITE表示重寫 //EXTR_SKIP 表示略過.
array_diff(數(shù)組1,數(shù)組2); // 得到數(shù)組1中與數(shù)組2中不相同的元素. -- 差集 值判斷.
array_intersect(數(shù)組1,數(shù)組2);// 得到數(shù)組1中與數(shù)組2中相同的元素. --交集.
array_map($callback, $arr1); // 對(duì)數(shù)組內(nèi)的每個(gè)元素,進(jìn)行一次操作.分別調(diào)用某個(gè)函數(shù)進(jìn)行一次調(diào)用.
如果函數(shù)是自定義的.
注意,應(yīng)該有參數(shù)接收元素值,同時(shí)應(yīng)該有返回值
$a1 = array(10, 20, 3); function x2 ( $item ) { return $item * 3; } $arr = array_map('x2', $a1); var_dump($arr);
只負(fù)責(zé)定義,不負(fù)責(zé)調(diào)用. array_map(); 函數(shù)內(nèi)部負(fù)責(zé)調(diào)用.
可以同時(shí)接收或處理.是統(tǒng)一操作,一次將所有數(shù)組相同位置都操作一遍,而不是逐一操作. 因此該函數(shù)所接受的參數(shù)個(gè)數(shù),與所傳遞的數(shù)組的數(shù)量應(yīng)該一致.
有一個(gè)默認(rèn)操作,非常常用,利用多個(gè)數(shù)組,組合成一個(gè)新數(shù)組。要求,函數(shù)位置傳遞一個(gè)null.
$names = array('z1', 'z2', 'z3'); $maths = array(50, 40, 60); $score = array_map(null, $names, $maths); var_dump($score);
回調(diào)函數(shù)的使用-模擬數(shù)據(jù)結(jié)構(gòu)函數(shù)-排序函數(shù)
array_walk($funcname);
針對(duì)一個(gè)數(shù)組的每個(gè)元素進(jìn)行操作,與array_map的不同點(diǎn).
array_map() 可以操作多個(gè)數(shù)組,而array_walk(); 只可以操作一個(gè)數(shù)組.
array_map(); 只可以得到元素值,而array_walk(); 即可以得到元素值,還可以得到元素的鍵.
可以對(duì)函數(shù)的第一個(gè)參數(shù)進(jìn)行引用傳遞,達(dá)到修改的原有數(shù)組的目的.
$names = array('aa', 'bb', 'cc'); function fn1 ( &$val,$key ) { var_dump($val,$key); } array_walk($names, 'fn1');
入棧 array_push();
出棧 array_pop();
// 每次操作后,索引都會(huì)重新索引.
頂端出: array_shift();
頂端入: array_unshift();
soft(); 按照值升序
rsoft() 按照值降序
ksoft()按照鍵升序
krsoft(); 按照鍵降序
// 值排序,不會(huì)保留鍵值關(guān)系,而鍵排序會(huì)保留鍵值關(guān)系.
// 按照值排序,同時(shí)保留鍵值關(guān)系.
asort(); 按照值,升序,保留鍵值關(guān)聯(lián).
arsort(); 按照值,降序,保留鍵值關(guān)聯(lián).
key,鍵
reverse(): 反序,默認(rèn)是升序.
association: 關(guān)聯(lián)
到此,關(guān)于“如何使用PHP 數(shù)組遍歷/指針/函數(shù)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
本文題目:如何使用PHP數(shù)組遍歷/指針/函數(shù)-創(chuàng)新互聯(lián)
URL鏈接:http://vcdvsql.cn/article24/dsdpce.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、網(wǎng)站收錄、用戶體驗(yàn)、電子商務(wù)、網(wǎng)站維護(hù)、網(wǎng)站營銷
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容