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;