摘要:李尋歡索引數(shù)組索引數(shù)組,元素的值和下標不存在邏輯關(guān)系,而下標只表示值索引位置。鍵和值,同時向下移動指針獲得元素信息,返回的是,關(guān)聯(lián)和索引數(shù)組其中關(guān)聯(lián)數(shù)組部分。
數(shù)組
數(shù)據(jù)由元素組成,元素由鍵和值組成
數(shù)組分類關(guān)聯(lián)數(shù)組
關(guān)聯(lián)數(shù)組,元素的下標與元素的值存在邏輯上的關(guān)系,稱之為關(guān)聯(lián)數(shù)組。指的是,鍵和值之間存在管理。
$a1 = array("name" => "李尋歡", "age" => 34);
索引數(shù)組
索引數(shù)組,元素的值和下標不存在邏輯關(guān)系,而下標只表示值索引位置。
$a1 = array("李尋歡",34);數(shù)組遍歷
所要的完成遍歷數(shù)組,需要依次得到每個元素的信息(鍵的信息和值的信息).核心在于數(shù)組的元素指針上
數(shù)組的元素指針
每一個數(shù)組內(nèi)的,都有一個內(nèi)部的指向某個元素的指針。
默認情況下,這個指針指向數(shù)組的第一個元素.
每個數(shù)組只有一個指針,同時時刻,只能指向一個元素,因此指針的位置,可以是任意一個已存在的元素。同時指針可能指向數(shù)組的外部(數(shù)組的末端[最后一個的外邊]),就是非法位置.
數(shù)組遍歷就是
獲得指針指向的元素的信息,移動指針,配合循環(huán)結(jié)構(gòu)就可以完成。
php提供
得到指針所指向的元素的信息
可以移動指針
current(); 得到當前指針指向元素的值
key(); 得到當前指向元素的鍵
next(); 可以移動數(shù)組的指針
prev(); 向上移動一個元素.
reset(); 重置指針(移動到第一個元素)
end(); 移動到最右一個元素
數(shù)組末端,最右一個元素往右,非法的范圍
next(), 和prev(); 可以將數(shù)組指針移動到非法位置上.
//$students 是數(shù)組 end($students); next($students); var_dump(current($students)); //false; reset($students); prev($students); var_dump(current($students)); //false;
如果已經(jīng)移動到非法位置,不可相對移動來挽回,此時,需要強制移動到某個位置, 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()
foreach(); 結(jié)構(gòu)
專門用于數(shù)組遍歷的一個結(jié)構(gòu),也是一個循環(huán)結(jié)構(gòu)
foreach ( $arr as $key => $val ) { //循環(huán)體 }
如果元素的鍵,沒有意義的話,可以使用 省略鍵的信息
foreach ( $arr as $val ) {}
注意:
foreach會移動數(shù)組指針,并且,在foreach遍歷完畢后,指針處于非法位置(數(shù)組末端)
foreach在遍歷一個數(shù)組元素時,會初始化元素指針,因此指針所指向的位置,不會影響到foreach的遍歷
foreach在遍歷時,原數(shù)組的拷貝,而不是直接在原數(shù)組進行遍歷,如果在遍歷過程中,對遍歷的數(shù)組進行修改,是不會影響到遍歷的結(jié)果
foreach所使用的保存元素值的變量,對其操作,不會對原數(shù)組產(chǎn)生影響
對值的操作,同時支持引用傳遞:可以改變原數(shù)組的值。
只需要在變量前增加&符號 即可。
foreach流程圖
each()foreach也是循環(huán)結(jié)構(gòu), 受break和continue的控制。
遍歷每一個
可以獲得當前的元素信息。(鍵和值),同時向下移動指針
獲得元素信息,返回的是, 關(guān)聯(lián)和索引數(shù)組
其中:
關(guān)聯(lián)數(shù)組部分。
key => 當前元素的鍵 value => 元素的值
索引數(shù)組部分
0 => 元素的下標 1 => 元素的值 $arr = array(10, 12, 200); $arr2 = array( "name" => "zf", "age" => 20 ); var_dump(each($arr)); var_dump(each($arr2));
只遍歷第一項
由于each既可以獲取元素信息,又可以移動指針,因此非常適合完成除foreach外的手動的數(shù)組的遍歷.
each如果指針非法,each返回false。 判斷each的返回值
// 先eaech,將each的結(jié)果賦給$element // 判斷$element 是否成立(自動轉(zhuǎn)成布爾類型) while($element = each($sutdents)) { echo "Key:", $element[0]; echo "$nbsp;"; echo "Value:", $element[1]; echo "
"; }
list()
可以使在遍歷的循環(huán)體內(nèi)直接使用保存元素下標的變量.直接使用保存元素下標的變量和保存元素值的變量.
一個函數(shù),可以通過一個數(shù)組,針對多個變量同時初始化
$student = array("李尋歡", "天機老人", "阿飛"); list($a, $b, $c) = $student; // 將數(shù)組內(nèi)的元素, 以此賦值給list結(jié)構(gòu)中的變量 // 類似 es6 中的解構(gòu)賦值 var_dump($a, $b, $c);
list 針對索引數(shù)組生效
$student = array("李尋歡", "天機老人", "阿飛"); while (list($k, $v) = each($student)) { echo "Key:", $k; echo " "; echo "Value:", $v; echo "數(shù)組復制元素指針
"; };
如果原數(shù)組指針合法:
數(shù)組在復制時,指針位置也會隨之復制到目標數(shù)組內(nèi).
$a1 = array("a", "b", "c"); $a2 = $a1; var_dump(current($a2)); // a echo "
"; $a1 = array("a", "b", "c"); next($a1); $a2 = $a1; var_dump(current($a2)); // b
如果原數(shù)組指針非法:
將重置新數(shù)組的指針; 重置為默認指針.
$a1 = array("a", "b", "c"); end($a1); next($a1); $a2 = $a1; var_dump(current($a2)); // aforeach與數(shù)組指針關(guān)系
foreach對指針的影響有不確定性,因此不要依賴foreach遍歷后的指針位置,如果需要操作,需要先重置(reset();).
數(shù)組遍歷的是,原數(shù)組的拷貝,而不是直接在數(shù)組上進行操作.
php內(nèi)部優(yōu)化,寫時復制(COW--copy on write) .如果不對原數(shù)組執(zhí)行寫操作. 是不會發(fā)生復制的過程. 在對原數(shù)組進行寫操作時,這個復制的過程才會發(fā)生.
數(shù)組復制時的指針問題
foreach遍歷的時候,是拷貝,但是發(fā)生在對原數(shù)組進行操作之后.意味著,在寫操作之前,遍歷操作的就直接是原數(shù)組. 一旦發(fā)生了寫操作,則會形成一個真實的拷貝,foreach去遍歷的數(shù)組就與原數(shù)組不是同一個. 因此原數(shù)組指針就不會繼續(xù)發(fā)生變化. 唯一的例外在最后一次循環(huán)體內(nèi)對數(shù)組進行寫操作,此時在復制前指針已經(jīng)非法,則結(jié)果會被重置.
在實際操作中,建議處理完畢后,可以立即reset();
上面的問題,只適用于$value ,保存元素值的變量是值傳遞的情況,如果是引用傳遞的話.直接操作原數(shù)組!
$key不能引用傳遞.
array_fill(起始位置,長度,內(nèi)容); //使用固定值填充某些數(shù)量的元素.
count(); //統(tǒng)計數(shù)組元素個數(shù). 支持遞歸統(tǒng)計.
range(起始范圍,結(jié)束范圍); //按照范圍創(chuàng)建數(shù)組元素.
array_merge(); //合并多個數(shù)組.
// 注意一個下標沖突的情況,如果索引下標沖突,順序增加. // 關(guān)聯(lián)數(shù)組沖突. 后合并的要覆蓋前面的. array_merge(range("a","z"),range("A","Z"));
array_rand(數(shù)組,選擇的數(shù)量[默認一個]); //隨機從數(shù)組中取得某些元素. 得到的是隨機的下標,而不是元素值. 并且,如果是多個元素,會按照下標的大小進行排序.
shuffe(); //打亂元素順序,參數(shù)是引用傳遞.
// 驗證碼中的 4位 隨機數(shù) // 創(chuàng)建一個大小混合的數(shù)組 $chars = array_merge(range("a","z"),range("A","Z")); // 取得4個元素下標 $rand_keys = array_rand($chars, 4); // 打亂 shuffle($rand_keys); // 利用下標獲取元素值 foreach ($rand_keys as $v) { echo $chars[$v]; }鍵值操作
array_value(); //取得所有元素的所有值.
array_key(); //取得所有元素的所有鍵.
array_combine(); // 利用兩個數(shù)組,其中一個為 鍵 ,另一個為值得到一個新數(shù)組.
in_array(); //判斷數(shù)組中是否有某個值
array_key_exists(); //是否有某個元素.
array_search(); // 在數(shù)組內(nèi)查找某個元素值,找到返回 下標. 找不到返回false.
array_filp(); // 交換元素的鍵和值.
"+"號
$a1 = array(1, 2, 3, 4); $a2 = array(6, 7, 8); var_dump($a1+$a2); // 如果出現(xiàn)下標沖突,則忽略后邊的元素
array_merge($arr1, $arr2); // 合并多個數(shù)組.
array_chunk($arr, len); //按照子數(shù)組的長度,進行對原數(shù)組拆分.
explode(); //將一個字符串,按照某個字符,分割成多個部分.
implode(); //可以將數(shù)組元素的值, 利用某個字符,連接
$arr = array("aa", "bb"); echo $arr = implode("-", $arr); // aa-bb print_r(explode("-", $arr));
compact(); 合并, 利用多個變量,合并成一個數(shù)組. 其中變量的名字作為數(shù)組的下標. 變量的值,作為值. 注意參數(shù)是變量名
$width = 2; $height = 10; $arr = compact("width", "height");
extact(); 拆分,將一個變量,拆分成一個變量。每一個元素為一個變量。 下標為變量名,值為變量值. 字符串的下標.
注意,如果當前已經(jīng)存在變量名,則會發(fā)生將已有變量值替換的操作.這個是默認行為.可以修改,通過extact(),第二個參數(shù). 默認為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); // 對數(shù)組內(nèi)的每個元素,進行一次操作.分別調(diào)用某個函數(shù)進行一次調(diào)用.
如果函數(shù)是自定義的.
注意,應該有參數(shù)接收元素值,同時應該有返回值
$a1 = array(10, 20, 3); function x2 ( $item ) { return $item * 3; } $arr = array_map("x2", $a1); var_dump($arr);
只負責定義,不負責調(diào)用. array_map(); 函數(shù)內(nèi)部負責調(diào)用.
可以同時接收或處理.是統(tǒng)一操作,一次將所有數(shù)組相同位置都操作一遍,而不是逐一操作. 因此該函數(shù)所接受的參數(shù)個數(shù),與所傳遞的數(shù)組的數(shù)量應該一致.
有一個默認操作,非常常用,利用多個數(shù)組,組合成一個新數(shù)組。要求,函數(shù)位置傳遞一個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);
針對一個數(shù)組的每個元素進行操作,與array_map的不同點.
array_map() 可以操作多個數(shù)組,而array_walk(); 只可以操作一個數(shù)組.
array_map(); 只可以得到元素值,而array_walk(); 即可以得到元素值,還可以得到元素的鍵.
可以對函數(shù)的第一個參數(shù)進行引用傳遞,達到修改的原有數(shù)組的目的.
$names = array("aa", "bb", "cc"); function fn1 ( &$val,$key ) { var_dump($val,$key); } array_walk($names, "fn1");模擬數(shù)據(jù)結(jié)構(gòu)
入棧 array_push();
出棧 array_pop();
// 每次操作后,索引都會重新索引.
頂端出: array_shift();
頂端入: array_unshift();
soft(); 按照值升序
rsoft() 按照值降序
ksoft()按照鍵升序
krsoft(); 按照鍵降序
// 值排序,不會保留鍵值關(guān)系,而鍵排序會保留鍵值關(guān)系.
// 按照值排序,同時保留鍵值關(guān)系.
asort(); 按照值,升序,保留鍵值關(guān)聯(lián).
arsort(); 按照值,降序,保留鍵值關(guān)聯(lián).
key,鍵
reverse(): 反序,默認是升序.
association: 關(guān)聯(lián)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/21727.html
摘要:學習至今一年有余,筆記積累挺多的,也挺雜的,寫篇文章整理一下吧?;A(chǔ)部分輸出文本的基礎(chǔ)指令和。函數(shù)內(nèi)部聲明的變量擁有作用域,只能在函數(shù)內(nèi)部進行訪問。布爾型要指定一個布爾值,使用關(guān)鍵字或。 php學習至今一年有余,筆記積累挺多的,也挺雜的,寫篇文章整理一下吧。 php基礎(chǔ)部分 showImg(http://segmentfault.com/img/bVcWhR); PHP 輸出文本...
摘要:中基礎(chǔ)中的三大坑,遍歷,引用機制,數(shù)組。今天我們在講講中的一些奇怪現(xiàn)象。本文適合有一定基礎(chǔ)的。運行流程共用一個結(jié)構(gòu)體開始遍歷數(shù)組,進行判斷,拷貝數(shù)組是一個新的結(jié)構(gòu)體,操作的是新的結(jié)構(gòu)體。那么遍歷數(shù)組時,全程與原數(shù)組無關(guān)。 PHP中基礎(chǔ)中的三大坑,foreach遍歷,引用機制&,數(shù)組。 今天我們在講講foreach中的一些奇怪現(xiàn)象。 在講解之前,可以先看看我其他相關(guān)的文章,屬于同一個大的...
摘要:這種行為比最初出現(xiàn)的問題更為棘手,同時也是一種常見的錯誤源。這意味著這個數(shù)組的一份拷貝將會被返回,因此被調(diào)函數(shù)與調(diào)用者所訪問的數(shù)組并不是同樣的數(shù)組實例。 showImg(https://segmentfault.com/img/bV7reP?w=620&h=620); PHP 語言讓 WEB 端程序設計變得簡單,這也是它能流行起來的原因。但也是因為它的簡單,PHP 也慢慢發(fā)展成一個相對...
摘要:注意和是不同的變量,處理它們的方式不同變量說明默認情況下包含了,和的數(shù)組。包含相同的信息,但它不是一個超全局變量。這些特殊的常量不區(qū)分大小寫,如下幾個的魔術(shù)常量名稱說明文件中的當前行號。 整理了下關(guān)于php的基礎(chǔ)知識,參考了些資料,如下: 超全局變量 超全局變量 — 超全局變量是在全部作用域中始終可用的內(nèi)置變量: $GLOBALS $GLOBALS — 引用全局作用域中可用的全部變量 ...
摘要:代碼的編譯的解析過程任務就是將代碼轉(zhuǎn)化為數(shù)組,代碼里的所有信息都保存在數(shù)組中,然后將數(shù)組交給引擎執(zhí)行,就是內(nèi)核具體執(zhí)行的命令,比如賦值加減操作函數(shù)調(diào)用等,每一條都對應一個處理,這些是提前定義好的函數(shù)。 1.PHP代碼的編譯 PHP的解析過程任務就是將PHP代碼轉(zhuǎn)化為opcode數(shù)組,代碼里的所有信息都保存在opcode數(shù)組中,然后將opcode數(shù)組交給zend引擎執(zhí)行,opcode就是...
摘要:本文將會介紹自起,直至中增加的新特征。棄用的功能以下幾個功能被棄用,若在配置文件中啟用,則會在運行時發(fā)出警告。該類的完整限定名是其中第一個反斜杠表示全局命名空間。目的在于模仿的不對,目的是為了讓發(fā)布應用程序更加方便。 截至目前(2014.2), PHP 的最新穩(wěn)定版本是 PHP5.5, 但有差不多一半的用戶仍在使用已經(jīng)不在維護 [注] 的 PHP5.2, 其余的一半用戶在使用 PHP5...
閱讀 3441·2021-11-15 11:39
閱讀 1599·2021-09-22 10:02
閱讀 1333·2021-08-27 16:24
閱讀 3620·2019-08-30 15:52
閱讀 3452·2019-08-29 16:20
閱讀 850·2019-08-28 18:12
閱讀 580·2019-08-26 18:27
閱讀 745·2019-08-26 13:32