PHP 移除陣列中的元素

 假設一個全數字的陣列 $arr=array(1,2,3,4,7,8,9,12,13,17,72);

我想要移除其中的 ‘7’ 這個元素,結果陣列要是 $arr=array(1,2,3,4,8,9,12,13,17,72);

有很多方法,以下是我想到的方法:

不好的方法:

1. 使用 array_slice— 找到 7 所在的索引,把7之前和之後切開成為二塊再 array_merge

$arr_head = array(1,2,3,4);

$arr_tail = array(8,9,12,13,17,72);

$res = array_merge( $arr_head, $arr_tail );

不好的原因:陣列操作慢且沒效率。

2. 使用implode後得到字串 $str ="1,2,3,4,7,8,9,12,13,17,72″ ,再使用字串的regex方法找出 7,用 preg_replace 去取代掉他。取代完之後再 explode 回去字串。

$pattern = ‘,?b7b,?’; // 7 的左右兩邊是 WORD Boundary

$res = explode(“,", preg_replace($pattern, “", $str));

不好的原因:正規表示式的取代慢且不容易撰寫,易出錯。

3. 非正規表達式的取代

$str = str_replace(“,7,", “," ,$str);

這樣會把在中間的 “,7, " 換成一個逗點 “," 但是7 如果在字串前後就會換不到,為了避免這種結果,我先把 $str 前後加上 ‘,’,再來取代

$str = ‘,’ . $str . ‘,’;

$str = str_replace(“,7,", “," ,$str); //

再把 $str 前後 ‘,’ 拿掉後 explode

$str = substr( $str, 1, -1);

$res =explode(“,", $str);

不好的原因:這已經是比較快速且有效率的寫法,因為 php 的 string 操作比 array 快約5~10倍,但是這樣的程式碼並不漂亮,我不喜歡,另外如果陣列中是字串且帶有 ‘,’ ,會產生錯誤的語意,當然可以用別的 spliter 來替代解決這個問題。

好的方法:

我自覺好的方法一定要具有兩個要素:

直覺易撰寫– 就算是過一陣子再來看程式碼,不用花太多大腦就知道為什麼這樣寫,此外,直覺的程式碼不易出錯。

快速有效率– 使用有效率的寫法比寫來簡潔但沒效率的方法更有意義,畢竟程式是拿來跑的,拿來欣賞不是重點。

所以以上雖能解決我的需求但我全沒採用,我又想了下面自覺很棒的寫法,使用迴圈,因為迴圈最有效率,而且操作最少。.

$n = sizeof($arr);

for( $ii=0; $ii <$n; $ii++){

// 數字這樣寫

if( $arr[$ii] == 7) unset($arr[$ii]);

// 字串這樣寫

if(! strcmp($arr[$ii], “比對的字串") ) unset($arr[$ii]);

}

retrun $arr;

用迴圈+unset ,不旦直覺而且簡單快速,如要寫得更簡潔,甚至可簡化為一行:

for( $ii=0; $ii < sizeof($arr); $ii++)if( $arr[$ii] == 7) unset($arr[$ii]);

retrun $arr;