回覆列表
  • 1 # 程式設計師小助手

    引言

    本文我們聊一聊 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 :_)

  • 中秋節和大豐收的關聯?
  • 那些30歲還沒結婚的女孩兒,是怎樣生活的?