PHP數組任意位置插入任意元素?
引言
本文我們聊一聊 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 :_)
我是 @程序員小助手 ,持續分享編程知識,歡迎關注。