PHP7資料結構與演算法分析:第三章--不一樣的陣列
第三章 不一樣的陣列
幾乎所有的語言都原生支援陣列,PHP也不例外!在本章中我們首先要對陣列的一些基礎知識進行回顧和熟悉,然後把PHP中有關陣列的常用操作整理和歸納以便後面章節中學習使用。與基礎學習不同的是我們將引入 SplFixedArray 的相關內容並對比普通陣列學習這部分的內容。最後實現我們第一個資料結構--連續的線性表!當然還會附加一個PHP陣列常用函式的總結說明。
讓我們先對本章內容做一個概覽。
本章內容如下:
- 陣列的定義
- 陣列的分類
- 陣列的常用操作
- 陣列的遍歷
- SplFixedArray陣列
- 線性表的實現
- 陣列函式
3.1 PHP陣列定義
我們直接拿官方手冊上的定義放在這裡
PHP 中的陣列實際上是一個有序對映。對映是一種把 values 關聯到 keys 的型別。此型別在很多方面做了優化,因此可以把它當成真正的陣列,或列表(向量),雜湊表(是對映的一種實現),字典,集合,棧,佇列以及更多可能性。由於陣列元素的值也可以是另一個陣列,樹形結構和多維陣列也是允許的。
上面是官方手冊對PHP中陣列的定義說明。不過我相信大家對於PHP陣列有更加深刻的認知,特別是在使用層面上講,這裡我就簡單的列出幾條供大家參考,更多的內容能夠大家可以結合實際應用經驗自己補充。
- PHP陣列使用前不用預定義長度。
- PHP陣列的長度會隨著資料增刪動態改變長度!
- PHP陣列是弱型別的,同一個陣列可以儲存不同型別的值。
- PHP陣列的下標可以是整型也可以是字串。
- php陣列按照插入順序儲存元素。
- PHP陣列普通刪除元素(unset)後不會重新建立索引。
- PHP內建函式的增刪操作會得到重新索引後的陣列。
由於存在以上這些特徵使得PHP的陣列使用非常靈活,甚至有些“獨樹一幟”。
3.2 PHP陣列分類
PHP中陣列實際上可按照不同的標準來分類。
3.2.1 按照陣列下標型別來分
- 索引陣列 : 又稱為整型陣列,陣列的下標索引是整數型別,預設從0開始;
- 關聯陣列 : 類似字典結構,陣列的下標是字串型別的。
3.2.2 按照陣列的維度來分
- 一維陣列 : 陣列每個元素都是非陣列型別的值。
- 二維陣列 : 陣列中至少有一個元素的型別是一維陣列,並且每一個元素若是陣列型別其維度不超過一維。
- 多維陣列 : 陣列中至少有一個元素值是二維或者更多維度的陣列型別。
3.2.3 按照實現方式不同來分
- PHP內建陣列型別。
- SplFixedArray陣列型別。
3.3 PHP內建陣列的常用操作
3.3.1 初始化
所謂的初始化就是在使用之前要先宣告變數的型別及初始狀態的值。PHP內建陣列型別在使用之前是不要求一定要初始化的,我們可以在需要的時候直接使用。
定義一個陣列變數$arr, 並將值[1,2,3,4,5]賦予該變數
$arr = [1,2,3,4,5];
實際上上面程式碼的使用過程已經包含了初始化的過程。我們也可以把初始化過程給拿出來:
$arr;
$arr = [1,2,3,4,5];
當然了,我們有很多情況是需要初始化,例如我們要使陣列函式對一個變數進行處理,但是賦值操作有可能沒有正常完成,這樣就必須初始化了!而且物件導向程式設計中,有很多成員屬性也需要初始化,陣列初始化成空陣列就可以了,如下:
$arr = [];
Tips 初始化的兩個作用: 1, 指定該變數的型別,尤其是需要使用內建函式處理變數前,一定要初始化! 2, 指定變數的預設值。
3.3.2 增加元素
我們這裡就以一維陣列為例來進行說明,首先還是讓我們來初始化一個陣列,這樣下面就能使用了!
$arr = [];
在陣列的尾部進行新增
方式一: 直接對 $arr[] 賦值, 原因是PHP陣列的下標會自動增長:
$arr[] = 1;
方式二: 使用PHP內建函式array_push();
返回值:新增元素後陣列的長度
語法:array_push(陣列變數, 值)
栗子:
array_push($arr, 1);
Tips 推薦使用第一種方式,因為第二種方法畢竟是呼叫了一個函式,會造成額外的負擔。
在陣列的頭部進行新增
方式一: 使用PHP內建函式array_unshift();
返回值:新增元素後陣列的長度
語法:array_unshift(陣列變數, 值)
栗子:
array_unshift($arr, 1);
在陣列的任意位置進行新增
方式一: 使用PHP內建函式array_splice();
返回值:新增元素後陣列的長度
語法:array_splice(陣列變數, 位置, 0, 值)
栗子:
array_splice($arr, 1, 0, 1);
3.3.3 刪除元素
刪除頭部元素
方式一: 使用PHP內建函式array_shift();
返回值:被刪除的第一個元素
語法:array_shift(陣列變數)
栗子:
array_splice($arr);
方式二: 使用PHP內建函式array_splice();
返回值:被刪除的第一個元素
語法:array_shift(陣列變數, 0, 1)
栗子:
array_splice($arr, 0, 1);
刪除尾部元素
方式一: 使用PHP內建函式array_pop();
返回值:被刪除的元素
語法:array_pop(陣列變數)
栗子:
array_pop($arr);
方式二: 使用PHP內建函式array_splice();
返回值:被刪除的元素
語法:array_shift(陣列變數, -1)
栗子:
array_splice($arr, -1);
刪除任意位置元素
方式一: 使用PHP內建函式array_splice();
返回值:被刪除的元素
語法:array_shift(陣列變數, 要刪除的位置, 要刪除的個數)
栗子:
從第一個元素開始,刪除5個連續的元素
array_splice($arr, 0, 5);
刪除從倒數第5個開始連續的3個元素
array_splice($arr, -5, 3);
3.4 PHP陣列的遍歷
所謂“遍歷”是指對指定範圍內的陣列元素按照某種條件依次進行查詢的操作!我們這裡,是對整個陣列的所有元素從頭至尾進行查詢並輸出的過程!
陣列的遍歷是非常常用的也非常實用的一種操作,無論是在實際專案還是在學習過程中,我們都應該熟練的掌握各類陣列的各種遍歷方案。這裡提到了“各種遍歷方案”,確實要實現陣列的遍歷,方法還是多種多樣的,每種方法都有自己的適用場景以及優缺點。我們這裡不是研究PHP的基本語法,更多具體的操作可以參考其他書籍或者資料進行學習!我們這裡就幾種常用的方案進行說明和對比!
3.4.1 使用 for + count 實現
基本思路是使用count方法獲取陣列的長度,然後在不越界的情況下使用for迴圈陣列的索引位置來遍歷陣列元素。由於該方法是利用的陣列數字索引來關聯陣列元素,所以這種方案僅能支援具有連續索引的索引陣列!並且如果某個元素被unset掉,也會引起遍歷的失敗【Notice: Undefined offset:未找到指定的索引】,這是由於PHP陣列並不會自動重新索引下標!
程式碼示例
$arr = [1, 2, 3, 4, 5];
$arrLength = count($arr);
for ($i = 0; $i < $arrLength; $i++) {
echo $arr[$i];
}
3.4.2 使用 foreach 實現
使用foreach不僅可以遍歷陣列,還可以遍歷物件。使用foreach方法遍歷是最常用的方案。並且使用foreach遍歷,既可以是關聯陣列也可以是索引陣列!也不用再考慮陣列的下標是否連續,是否有元素被unset掉等操作!
程式碼示例
$arr = [1, 2, 3, 4, 5];
foreach ($arr as $key => $value) {
echo $key, " : ", $value;
}
3.4.3 使用 while + list + each 實現
這個是利用了PHP的內部指標來輔助實現的!基本的思路是首先復位陣列的指標,然後每執行一次each,陣列內部的指標就會自動向下一個元素移動一步!這樣使用迴圈直到陣列的末尾!
程式碼示例
$arr = [1, 2, 3, 4, 5];
reset($arr);
while (list($key, $value) => each($arr)) {
echo $key, " : ", $value;
}
當然出去這些遍歷方法,還有很多其它的方法,大家可以好好找到相關資料,繼續研究! 下面我們們來一起了解一下PHP的SPL庫中提供的一種效率更高的陣列--SplFixedArray!
3.5 SplFixedArray陣列簡介及簡單應用
未完,待續。。。。。。
相關文章
- PHP7資料結構與演算法分析:前言PHP資料結構演算法
- 資料結構與演算法——陣列資料結構演算法陣列
- 【資料結構與演算法】——稀疏陣列資料結構演算法陣列
- 資料結構與演算法 | 陣列(Array)資料結構演算法陣列
- 資料結構與演算法學習-陣列資料結構演算法陣列
- TypeScript演算法與資料結構-陣列篇TypeScript演算法資料結構陣列
- 資料結構與演算法:稀疏陣列(一)資料結構演算法陣列
- 資料結構與演算法之稀疏陣列資料結構演算法陣列
- 資料結構與演算法—稀疏陣列和佇列資料結構演算法陣列佇列
- 資料結構與演算法分析——佇列資料結構演算法佇列
- js資料結構與演算法 陣列、棧部分JS資料結構演算法陣列
- 資料結構與演算法整理總結---陣列,連結串列資料結構演算法陣列
- PHP7資料結構與演算法分析:第一章--資料結構和演算法簡介PHP資料結構演算法
- 【資料結構與演算法】字串匹配(字尾陣列)資料結構演算法字串匹配陣列
- 資料結構與演算法分析 (優先佇列)資料結構演算法佇列
- 資料結構 - 陣列資料結構陣列
- 資料結構-陣列資料結構陣列
- 資料結構與演算法系列(一)陣列實現資料結構演算法陣列
- JavaScript 的資料結構和演算法 - 陣列篇JavaScript資料結構演算法陣列
- 資料結構與演算法知識點總結(1)陣列與連結串列資料結構演算法陣列
- PHP7資料結構與演算法分析:第二章--演算法天平:複雜度分析PHP資料結構演算法複雜度
- 資料結構與演算法分析(c 語言描述)基數排序 陣列實現資料結構演算法排序陣列
- 資料結構與演算法基礎之指標和陣列資料結構演算法指標陣列
- 《JavaScript資料結構與演算法》筆記——第2章 陣列JavaScript資料結構演算法筆記陣列
- 資料結構與演算法-佇列資料結構演算法佇列
- 資料結構之「陣列」資料結構陣列
- 資料結構之陣列資料結構陣列
- 資料結構2——陣列資料結構陣列
- Java資料結構-陣列Java資料結構陣列
- 資料結構:初識(資料結構、演算法與演算法分析)資料結構演算法
- 資料結構之連結串列與陣列(1):陣列和連結串列的簡介資料結構陣列
- 資料結構與演算法-棧與佇列資料結構演算法佇列
- JavaScript資料結構和演算法簡述——陣列JavaScript資料結構演算法陣列
- 陣列(Array)- 極客時間(資料結構與演算法之美)陣列資料結構演算法
- 前端學習 資料結構與演算法 快速入門 系列 —— 陣列前端資料結構演算法陣列
- 看圖輕鬆理解資料結構與演算法系列(陣列)資料結構演算法陣列
- C#資料結構與演算法3-C# 串和陣列C#資料結構演算法陣列
- PHP7資料結構與演算法分析:序言--寫一本“素”味兒書PHP資料結構演算法