引言
接着我們這個系列的文章說。本文我們聊一聊 PHP 數組,如何在任意位置插入新元素。因為內置函數並沒有提供類似 array_insert(&$array, $pos, $items) 的函數,所以我們試着動手解決。

學習時間
標準的實現方法,是要用 array_splice,該函數的用法:
array array_splice( array &$input, int $offset[, int $length = 0[, mixed $replacement]] )把 input 數組中由 offset 和 length 指定的單元去掉,如果提供了 replacement 參數,則用其中的單元取代。
下面是舉例說明:
$original = array( 'a', 'b', 'c', 'd', 'e' );
$inserted = array( 'x' ); // $inserted 並不必須是數組
array_splice( $original, 3, 0, $inserted ); // 在索引 3 位置插入
// $original 內容為 a b c x d e有幾個關鍵點大家需要注意,靈活運用 $offset, $length, $replacement 三個參數,可以組裝成強大的功能。
對於偏移位置 $offset:
- 如果 offset 為正,則從 input 數組中該值指定的偏移量開始移除。
- 如果 offset 為負,則從 input 末尾倒數該值指定的偏移量開始移除。
對於替換的長度 $length:
- 如果省略 length,則移除數組中從 offset 到結尾的所有部分。
- 如果指定了 length 並且為正值,則移除這麼多單元。
- 如果指定了 length並且為負值,則移除從 offset 到數組末尾倒數length 為止中間所有的單元。
在編程中,當給出了replacement 時要移除從 offset 到數組末尾所有單元時,用 count($input) 作為 length。比如像下面這個示例:
$input = array("red", "green", "blue", "yellow");
array_splice($input, 1, count($input), "orange");
// $input = array("red", "orange")特別需要注意的是 $replacement 參數:
- 如果給出了 replacement 數組,則被移除的單元被此數組中的單元替代。
- 如果 offset 和 length 的組合結果是不會移除任何值,則 replacement 數組中的單元將被插入到 offset 指定的位置。 注意替換數組中的鍵名不保留。
- 如果用來替換 replacement 只有一個單元,那麼不需要給它加上array(),除非該單元本身就是一個數組、一個對象或者 NULL。
親手造輪子
上一節的解決方案堪稱標準。有些同學還是要忍不住造輪子。“條條大道通羅馬”,肯定有不止一種方式實現需求。下面是另外一種方式:
$a = array(1, 2, 3, 4);
$b = array_merge(array_slice($a, 0, 2), array(5), array_slice($a, 2));
// $b = array(1, 2, 5, 3, 4)使用 array_slice 函數對原數組切片,一分為二,然後使用 array_merge 拼接3個部分。完美!
上面的代碼,在使用 array_merge 後悔丟失原數組的索引關係。如果要保留,使用 + 連接:
$b = array_slice($a, 0, 2) + array(5) + array_slice($a, 2);這樣就可以了。
換湯不換藥,如果給類添加一個方法,或者添加一個助手函數,自然是極好的。下面是封裝函數。
function array_insert(&$array, $value, $index)
{
return $array = array_merge(array_splice($array, max(0, $index - 1)), array($value), $array);
}寫在最後
本文介紹了一個功能豐富的 array_splice 函數,讓大家領略了參數的靈活運用所帶來的便捷。如果你經常需要這樣的操作,麻溜地寫到全局助手函數里吧。
Happy coding :_)
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/274180.html
微信掃一掃
支付寶掃一掃