PHP7資料結構與演算法分析:第三章--不一樣的陣列

來,見證奇蹟發表於2018-02-06

enter image description here

第三章 不一樣的陣列

幾乎所有的語言都原生支援陣列,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陣列簡介及簡單應用

未完,待續。。。。。。

相關文章