進度條

【PHP】16. 陣列的新增與刪除

【PHP】16. 陣列的新增與刪除

作者: 進度條編輯群 更新日期:

此文章也有影片介紹,可以搭配影片一起學習!

01. 陣列的新增與刪除 (所屬課程)

02. 陣列的新增與刪除 (所屬課程)


以下正式開始文章


上一堂課我們學到了陣列的寫法、取值、還有與雜湊表(hash table)的關係,那其實陣列的內容是可以變更的,我們可以對陣列指定新增、刪除資料。

就想是真實的世界裡在網路商城的出貨單裡(陣列),買家會下單(新增)、取消訂單(刪除)、更改訂單(取代)、指定配送日期(指定新增位置)等,這些行為我們都可以用陣列的函數做到。

  

   

  

我們用上堂課所建立的陣列來試做看看:

 

 

array_push() :新增一個值到陣列的最後面

★PHP標準函數:array_push(陣列,新增的值1, 新增的值2…)

 

例如我們要新增「new」這個值在$array2的最後方,範例:

 

<?php

  $array2 = ["Progress", "Bar", "TW"];
  array_push($array2, "new");
  var_dump($array2);
  echo "<br/>";

?>   

 

輸出結果:

array(4) { [0]=> string(8) "Progress" [1]=> string(3) "Bar" [2]=> string(2) "TW" [3]=> string(3) "new" }    

「new」已經被新增至$array2的後方了!
 

 

 

array_pop ():刪除陣列的最後一個值

★PHP標準函數:array_pop(陣列)

 

如果我們想把剛剛新增的最後一個的值「new」刪除,我們可以直接用array_pop(陣列)這個函數。

範例:

<?php

  $array2 = ["Progress", "Bar", "TW"];
  array_push($array2, "new");
  array_pop($array2);
  var_dump($array2);
  echo "<br/>";
?>    

 

輸出結果:

array(3) { [0]=> string(8) "Progress" [1]=> string(3) "Bar" [2]=> string(2) "TW" }    

 

此時「new」又被刪除掉了!

 

 

 

但在真實情況我們要新增或刪除的值常常不是在最後一個,而是位於某一個位置,這時可以用下面的函數去達成。

 

unset ():指定刪除位置

★PHP標準函數:unset(陣列[key])

 

例如我想要刪除$array2 = ["Progress", "Bar", "TW"] 中"Bar"這個值,它的key是1,我們可以這樣寫:
 

<?php

$array2 = ["Progress","Bar","TW"];
unset($array2,[1]);
var_dump($array2);
echo "<br/>";

?>    

 

輸出結果:

array(2) { [0]=> string(8) "Progress" [2]=> string(2) "TW" }      

 

 

 

 

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"])

<?php

  $array2 = ["Progress", "Bar", "TW"];
  array_splice($array2,2,0, ["new"]);
  var_dump($array2);
  echo "<br/>";

?>    

 

輸出結果:

array(4) { [0]=> string(8) "Progress" [1]=> string(3) "Bar" [2]=> string(3) "new" [3]=> string(2) "TW" }    

 

 

 

〈刪除〉

如果今天有一個陣列是 $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)

 

<?php
 $array3 = ["1", "2", "3", "4", "5"];
 array_splice($array3,2,2);
 var_dump($array3);
 echo "<br/>";
?>    

 

輸出結果如下:

array(3) { [0]=> string(1) "1" [1]=> string(1) "2" [2]=> string(1) "5" }    

 

 

 

〈取代〉

如果今天有一個陣列是 $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"]);

 

<?php

 $array4 = ["1", "2", "3", "4", "5"];
 array_splice($array4,2,2,["8"]);
 var_dump($array4);
 echo "<br/>";

?>    

 

輸出結果如下:

array(4) { [0]=> string(1) "1" [1]=> string(1) "2" [2]=> string(1) "8" [3]=> string(1) "5" }    

 

 

 

json_encode ()與unset()同時使用的問題

json格式是當今被大量使用的一種數據交換格式,我們可以通過PHP json_encode ()函數將陣列包裝成json字串,範例:

 

  <?php

  $array2 = ["Progress", "Bar", "TW"];
  echo json_encode($array2);
  echo "<br/>";

  ?>    

 

輸出結果如下:

[“Progress”,”Bar”,”TW”]    

但是這也會遇到一個麻煩的點,我們前面有教如果要指定刪除位置的函數→unset(陣列[key])

 

例如我想要刪除$array2 = ["Progress","Bar","TW"] 中”Bar”這個值,它的key是1,我們使用unset($array2[1])再轉成json格式後:

<?php

 $array2 = ["Progress", "Bar", "TW"];
 unset($array2[1]);
 echo json_encode($array2);
 echo "<br/>";

?>    

 

輸出結果:

{"0"}:"Progress","2":"TW"}    

它多出了key值,這是為甚麼呢?

原因是因為unset()這個函數的作用是把裡面的值和key給拿掉,但它不會重新排序key值(0.1.2…),

 

 

而如果key值是正常排序0.1.2…的時候,json_encode 就可以正常轉換了。

 

<?php
  $array2 = ["Progress","Bar","TW"];
  echo json_encode($array2);
  echo "<br/>";
?>      

 

輸出結果如下:

["Progress", "Bar", "TW"]    

 

但是如果今天如果你的前台程式碼並沒有用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格式印出來的話,範例:

<?php
  $array2 = ["Progress", "Bar", "TW"];
  array_splice($array2, 1, 1);
  echo json_encode($array2);
  echo "<br/>";
  ?>    

 

輸出結果如下:

[“Progress”,””TW”]    

中間的”Bar”被正常刪除也有排序∽

但是如果unset()的值是從別的api傳回來的話,我們的程式不就沒辦法執行了嗎?

 

其實還有另一個函數array value()可以做重整排序的動作,它並不是直接去改變它,而是把順序重新排序,但寫法要照下面這樣:

$array2 = array_values($array2)

<?php
  $array2 = ["Progress","Bar","TW"];
  unset($array2[1]);
  $array2 = array_values($array2);
echo json_encode($array2);

echo "<br/>";
?>    

 

輸出結果如下:

[“Progress”,””TW”]    

這樣就沒有問題了。


另外array_values()的另一個功能是,即便array的key很奇怪,例如像下面這樣子,$array2 = [ 0=> "Progress", "k1" => "Bar", "v1" => "TW" ]

<?php
  $array2 = [ 0=> "Progress", "k1" => "Bar", "v1" => "TW" ];
  unset($array2[1]);
  $array2 = array_values($array2);
  echo json_encode($array2);
  echo "<br/>";
?>    

 

輸出結果如下:    

[“Progress”,””TW”]    

 

也就是說,無論這個key是甚麼,array_values()還是會全部都移除然後照著順序排。

雖然hash table在意義上其實是雜湊(沒有順序可言),但其實在PHP裡面看起來是有順序的,所以可以利用這種方式去做,也就是說它在意義上面並不是真的”雜湊表”。


這堂課需要多加練習,如果想要更加了解這些函數定義與範例的話,可以上PHP官網查詢,

http://php.net/manual/en/function.array-push.php

 

 

 

它會寫在這個函數可以使用在哪一個版本,也可以翻譯成簡體版,右上角的Search bar也可以搜尋其他函數。

 

 


最後,如果你喜歡我們的文章,別忘了到我們的FB粉絲團按讚喔!!

Small logo

進度條編輯群

進度條編輯團隊