【PHP】16. 陣列的新增與刪除
【PHP】16. 陣列的新增與刪除
此文章也有影片介紹,可以搭配影片一起學習!
01. 陣列的新增與刪除 (所屬課程)
上一堂課我們學到了陣列的寫法、取值、還有與雜湊表(hash table)的關係,那其實陣列的內容是可以變更的,我們可以對陣列指定新增、刪除資料。
就想是真實的世界裡在網路商城的出貨單裡(陣列),買家會下單(新增)、取消訂單(刪除)、更改訂單(取代)、指定配送日期(指定新增位置)等,這些行為我們都可以用陣列的函數做到。
我們用上堂課所建立的陣列來試做看看:
array_push() :新增一個值到陣列的最後面
★PHP標準函數:array_push(陣列,新增的值1, 新增的值2…)
例如我們要新增「new」這個值在$array2的最後方,範例:
$array2 = ["Progress", "Bar", "TW"];
array_push($array2, "new");
var_dump($array2);
echo "<br/>";
?>
輸出結果:
「new」已經被新增至$array2的後方了!
array_pop ():刪除陣列的最後一個值
★PHP標準函數:array_pop(陣列)
如果我們想把剛剛新增的最後一個的值「new」刪除,我們可以直接用array_pop(陣列)這個函數。
範例:
$array2 = ["Progress", "Bar", "TW"];
array_push($array2, "new");
array_pop($array2);
var_dump($array2);
echo "<br/>";
?>
輸出結果:
此時「new」又被刪除掉了!
但在真實情況我們要新增或刪除的值常常不是在最後一個,而是位於某一個位置,這時可以用下面的函數去達成。
unset ():指定刪除位置
★PHP標準函數:unset(陣列[key])
例如我想要刪除$array2 = ["Progress", "Bar", "TW"] 中"Bar"這個值,它的key是1,我們可以這樣寫:
$array2 = ["Progress","Bar","TW"];
unset($array2,[1]);
var_dump($array2);
echo "<br/>";
?>
輸出結果:
array_splice():指定新增/刪除/取代位置
這個函數可以進行更靈活的新增、刪除、取代,並且可以指定位置與範圍。
★PHP標準函數:array_splice(陣列,開始的key位置, 移除原本陣列的值的個數,欲新增的陣列)
〈新增〉
範例:
例如我要在$array2 = ["Progress", "Bar", "TW"]這個陣列中Bar和TW中插入new這個字,變成$array2 = ["Progress", "Bar", "new", "TW"]
陣列(必須)→ $array2
開始的key位置(必須) → 代表從第幾個key開始,目前這個範例的key是2
移除原本陣列的值的個數(可選) → 目前我們只希望加入新的值,並沒有要移除原本的值,所以是0
欲新增的陣列(可選) → 有點像把兩個陣列合併再一起的感覺,目前要新增的陣練裡只有一個值,可寫成["new"]
因此,我們的PHP語法可以寫成array_splice($array2, 2, 0, ["new"])
$array2 = ["Progress", "Bar", "TW"];
array_splice($array2,2,0, ["new"]);
var_dump($array2);
echo "<br/>";
?>
輸出結果:
〈刪除〉
如果今天有一個陣列是 $array3 = ["1","2","3”,”4”,”5”],我想把陣列變成["1","2",”5”](刪除”3”,”4”),
陣列(必須)→ $array3
開始的key位置(必須) → 代表從第幾個key開始,目前這個範例的key是2
移除原本陣列的值的個數(可選) → 我們要刪除”3”,”4”這兩個值,所以是2
欲新增的陣列(可選) → 並沒有要新增,所以可以不用寫
因此,我們的PHP語法可以寫成array_splice($array3,2,2)
$array3 = ["1", "2", "3", "4", "5"];
array_splice($array3,2,2);
var_dump($array3);
echo "<br/>";
?>
輸出結果如下:
〈取代〉
如果今天有一個陣列是 $array4 = ["1","2","3”,”4”,”5”],我想把陣列變成["1","2",”8”,”5”](用”8”取代”3”,”4”),
陣列(必須)→ $array4
開始的key位置(必須) → 代表從第幾個key開始,目前這個範例的key是2
移除原本陣列的值的個數(可選) → 我們要刪除”3”,”4”這兩個值,所以是2
欲新增的陣列(可選) → ["8"]
因此,我們的PHP語法可以寫成array_splice($array4,2,2,["8"]);
$array4 = ["1", "2", "3", "4", "5"];
array_splice($array4,2,2,["8"]);
var_dump($array4);
echo "<br/>";
?>
輸出結果如下:
json_encode ()與unset()同時使用的問題
json格式是當今被大量使用的一種數據交換格式,我們可以通過PHP json_encode ()函數將陣列包裝成json字串,範例:
$array2 = ["Progress", "Bar", "TW"];
echo json_encode($array2);
echo "<br/>";
?>
輸出結果如下:
但是這也會遇到一個麻煩的點,我們前面有教如果要指定刪除位置的函數→unset(陣列[key])
例如我想要刪除$array2 = ["Progress","Bar","TW"] 中”Bar”這個值,它的key是1,我們使用unset($array2[1])再轉成json格式後:
$array2 = ["Progress", "Bar", "TW"];
unset($array2[1]);
echo json_encode($array2);
echo "<br/>";
?>
輸出結果:
它多出了key值,這是為甚麼呢?
原因是因為unset()這個函數的作用是把裡面的值和key給拿掉,但它不會重新排序key值(0.1.2…),
而如果key值是正常排序0.1.2…的時候,json_encode 就可以正常轉換了。
$array2 = ["Progress","Bar","TW"];
echo json_encode($array2);
echo "<br/>";
?>
輸出結果如下:
但是如果今天如果你的前台程式碼並沒有用If else判斷這個放進json_encode()函數裡的是hash table 還是array,遇到這種情況的時候,很有可能程式會掛掉。
因為如果遇到中間有值被拿掉的時候,程式碼就不能執行或這是後面的行為都是錯誤的。
而這件事又導致於說,如果今天使用其他人的library(函式庫)像是其他的套件有時候它會對於null做一些處理,它認為null就是沒有,因此拿掉了中間的值,如果用到unset()這個函數,array就被轉成hash table,會造成很接下來的程式無法執行下去。
但並不是說因為這個原因PHP就不能做手機後台,還是有解決方法的,如果要避免這件事情,最簡單的方式就是利用我們前面所介紹的array_splice()。
解決方法→轉換成json格式時,使用array_splice()取代unset()
如果要用array_splice()把"Bar刪除,再用json格式印出來的話,範例:
$array2 = ["Progress", "Bar", "TW"];
array_splice($array2, 1, 1);
echo json_encode($array2);
echo "<br/>";
?>
輸出結果如下:
中間的”Bar”被正常刪除也有排序∽
但是如果unset()的值是從別的api傳回來的話,我們的程式不就沒辦法執行了嗎?
其實還有另一個函數array value()可以做重整排序的動作,它並不是直接去改變它,而是把順序重新排序,但寫法要照下面這樣:
$array2 = array_values($array2)
$array2 = ["Progress","Bar","TW"];
unset($array2[1]);
$array2 = array_values($array2);
echo json_encode($array2);
echo "<br/>";
?>
輸出結果如下:
這樣就沒有問題了。
另外array_values()的另一個功能是,即便array的key很奇怪,例如像下面這樣子,$array2 = [ 0=> "Progress", "k1" => "Bar", "v1" => "TW" ]
$array2 = [ 0=> "Progress", "k1" => "Bar", "v1" => "TW" ];
unset($array2[1]);
$array2 = array_values($array2);
echo json_encode($array2);
echo "<br/>";
?>
輸出結果如下:
也就是說,無論這個key是甚麼,array_values()還是會全部都移除然後照著順序排。
雖然hash table在意義上其實是雜湊(沒有順序可言),但其實在PHP裡面看起來是有順序的,所以可以利用這種方式去做,也就是說它在意義上面並不是真的”雜湊表”。
這堂課需要多加練習,如果想要更加了解這些函數定義與範例的話,可以上PHP官網查詢,
http://php.net/manual/en/function.array-push.php
它會寫在這個函數可以使用在哪一個版本,也可以翻譯成簡體版,右上角的Search bar也可以搜尋其他函數。
最後,如果你喜歡我們的文章,別忘了到我們的FB粉絲團按讚喔!!