Làm thế nào để chèn phần tử vào mảng tại vị trí cụ thể?


188

Hãy tưởng tượng rằng chúng ta có hai mảng:

$array_1 = array(
  '0' => 'zero',
  '1' => 'one',
  '2' => 'two',
  '3' => 'three',
);

$array_2 = array(
  'zero'  => '0',
  'one'   => '1',
  'two'   => '2',
  'three' => '3',
);

Bây giờ, tôi muốn chèn array('sample_key' => 'sample_value')sau phần tử thứ ba của mỗi mảng. Tôi làm nó như thế nào?


Câu trả lời:


206

array_slice()có thể được sử dụng để trích xuất các phần của mảng và toán tử mảng+ union ( ) có thể kết hợp lại các phần.

$res = array_slice($array, 0, 3, true) +
    array("my_key" => "my_value") +
    array_slice($array, 3, count($array)-3, true);

Ví dụ này:

$array = array(
  'zero'  => '0',
  'one'   => '1',
  'two'   => '2',
  'three' => '3',
);
$res = array_slice($array, 0, 3, true) +
    array("my_key" => "my_value") +
    array_slice($array, 3, count($array) - 1, true) ;
print_r($res);

cho:

Mảng
(
    [không] => 0
    [một] => 1
    [hai] => 2
    [my_key] => my_value
    [ba] => 3
)

8
Bạn nên sử dụng mảng_splice () như M42 đề xuất. Nó giải quyết vấn đề chỉ trong một dòng mã.
nickh

27
+không nên sử dụng! Sử dụng array_mergethay thế! Vì nếu các chỉ số là số nguyên (mảng bình thường, không phải hàm băm), +sẽ không hoạt động như mong đợi !!!
TMS

4
@Tomas Việc nó có hoạt động như mong đợi hay không phụ thuộc vào mong đợi của bạn. array_mergeHành vi của các phím số không phù hợp với câu hỏi này.
Artefacto

10
Thay vì sử dụng, count($array)-3bạn có thể chỉ cần xác định null cho cùng một hiệu ứng. Ngoài ra, sử dụng array_mergenhư TMS được đề xuất sẽ không yêu cầu bạn sử dụng một chỉ mục duy nhất. VÍ DỤ: Thêm "giá trị mới" vào một mảng hiện có:$b = array_merge( array_slice( $a, 0, 1, true ), array( 'new-value' ), array_slice( $a, 1, null, true ) );
Radley Sustaire

1
Dường như có một số nhầm lẫn về +vs array_merge. Nếu bạn muốn chèn mọi thứ vào một mảng số, bạn không nên sử dụng +vì có thể nó sẽ không phù hợp với bạn mong đợi. Nhưng bạn không nên sử dụng array_mergemột trong hai; đối với mảng số, toàn bộ vấn đề này được giải quyết với array_splicehàm. Đối với mảng kết hợp hoặc hỗn hợp, có lẽ bạn không muốn các khóa số được lập chỉ mục lại nên việc sử dụng +là hoàn toàn phù hợp.
meustrus

103

Đối với mảng đầu tiên của bạn, sử dụng array_splice():

$array_1 = array(
  '0' => 'zero',
  '1' => 'one',
  '2' => 'two',
  '3' => 'three',
);

array_splice($array_1, 3, 0, 'more');
print_r($array_1);

đầu ra:

Array(
    [0] => zero
    [1] => one
    [2] => two
    [3] => more
    [4] => three
)

Đối với cái thứ hai không có thứ tự nên bạn chỉ cần làm:

$array_2['more'] = '2.5';
print_r($array_2);

Và sắp xếp các phím theo bất cứ điều gì bạn muốn.


33
Mảng thứ hai có một thứ tự ... Tất cả các mảng đều có, vì chúng cũng có hai danh sách được liên kết.
Artefacto

5
-1, như đã đề cập "không có thứ tự" là sai. Ngoài ra, mảng_splice phá hủy liên kết khóa / giá trị trong ví dụ đầu tiên (nhưng có lẽ OP dự định điều đó).
Brad Koch

2
@Artefacto "Mảng" trong PHP, trên thực tế, được sắp xếp các bảng băm . Các mảng PHP hoạt động như các mảng, nhưng chúng không bao giờ thực sự là các mảng; Chúng cũng không phải là danh sách liên kết, hoặc danh sách mảng.
Frederik Krautwald

1
5 giờ sau tôi cuối cùng cũng đọc được câu trả lời tôi hiểu, cảm ơn bạn! Một điều nữa cần lưu ý rằng nếu ai đó đẩy một mảng kết hợp, họ cũng có thể chỉ định "mảng" là đối số thứ 4 trong mảng_splice..like so: Array_splice ($ Array_1, 3, 0, ARRAY ($ Array_name_to_insert));
Robert Sinclair

1
@FrederikKrautwald Kể từ PHP 7, tuyên bố đó không đúng. PHP 7 sử dụng hai mảng để thực hiện bảng băm + danh sách theo thứ tự. Đây là một bài viết từ một trong những nhà phát triển PHP cốt lõi (Nikic): nikic.github.io/2014/12/22/ mẹo
CubicleSoft 18/10/19

19

mã:

function insertValueAtPosition($arr, $insertedArray, $position) {
    $i = 0;
    $new_array=[];
    foreach ($arr as $key => $value) {
        if ($i == $position) {
            foreach ($insertedArray as $ikey => $ivalue) {
                $new_array[$ikey] = $ivalue;
            }
        }
        $new_array[$key] = $value;
        $i++;
    }
    return $new_array;
}

thí dụ:

$array        = ["A"=8, "K"=>3];
$insert_array = ["D"= 9];

insertValueAtPosition($array, $insert_array, $position=2);
// result ====> ["A"=>8,  "D"=>9,  "K"=>3];

Có thể không thực sự trông hoàn hảo, nhưng nó hoạt động.


11
về cơ bản bạn đang cố gắng thực hiện nối, không phát minh lại bánh xe.
Paul Dragoonis

11
Không, anh ta không phát minh lại bánh xe. mảng_splice () không cho phép đặt khóa và giá trị. Chỉ có giá trị với vị trí cụ thể là chính.
Kirzilla

vâng, nhưng như đã nhận xét trước đó, mảng_splice không hỗ trợ các mảng kết hợp. Tôi rất vui khi thấy một cách tiếp cận thanh lịch hơn.
clausvdb

Chức năng của bạn thực sự tốt, nhưng nó không hoạt động chính xác với vị trí lớn hơn chiều dài mảng (hãy thử thực hiện mảng_insert này ($ mảng_2, mảng ("wow" => "wow"), 4)). Nhưng nó có thể dễ dàng sửa chữa. Câu trả lời của bạn rất hay và bạn đã trả lời câu hỏi của tôi!
Kirzilla

13

Đây là một chức năng đơn giản mà bạn có thể sử dụng. Chỉ cần cắm n chơi.

Đây là Chèn theo chỉ mục, không phải theo giá trị.

bạn có thể chọn truyền mảng hoặc sử dụng một mảng mà bạn đã khai báo.

EDIT: Phiên bản ngắn hơn:

   function insert($array, $index, $val)
   {
       $size = count($array); //because I am going to use this more than one time
       if (!is_int($index) || $index < 0 || $index > $size)
       {
           return -1;
       }
       else
       {
           $temp   = array_slice($array, 0, $index);
           $temp[] = $val;
           return array_merge($temp, array_slice($array, $index, $size));
       }
   }

  function insert($array, $index, $val) { //function decleration
    $temp = array(); // this temp array will hold the value 
    $size = count($array); //because I am going to use this more than one time
    // Validation -- validate if index value is proper (you can omit this part)       
        if (!is_int($index) || $index < 0 || $index > $size) {
            echo "Error: Wrong index at Insert. Index: " . $index . " Current Size: " . $size;
            echo "<br/>";
            return false;
        }    
    //here is the actual insertion code
    //slice part of the array from 0 to insertion index
    $temp = array_slice($array, 0, $index);//e.g index=5, then slice will result elements [0-4]
    //add the value at the end of the temp array// at the insertion index e.g 5
    array_push($temp, $val);
    //reconnect the remaining part of the array to the current temp
    $temp = array_merge($temp, array_slice($array, $index, $size)); 
    $array = $temp;//swap// no need for this if you pass the array cuz you can simply return $temp, but, if u r using a class array for example, this is useful. 

     return $array; // you can return $temp instead if you don't use class array
}

Bây giờ bạn có thể kiểm tra mã bằng cách sử dụng

//1
$result = insert(array(1,2,3,4,5),0, 0);
echo "<pre>";
echo "<br/>";
print_r($result);
echo "</pre>";
//2
$result = insert(array(1,2,3,4,5),2, "a");
echo "<pre>";
print_r($result);
echo "</pre>";
//3
$result = insert(array(1,2,3,4,5) ,4, "b");
echo "<pre>";
print_r($result);
echo "</pre>";
//4
$result = insert(array(1,2,3,4,5),5, 6);
echo "<pre>";
echo "<br/>";
print_r($result);
echo "</pre>";

Và kết quả là:

//1
Array
(
    [0] => 0
    [1] => 1
    [2] => 2
    [3] => 3
    [4] => 4
    [5] => 5
)
//2
Array
(
    [0] => 1
    [1] => 2
    [2] => a
    [3] => 3
    [4] => 4
    [5] => 5
)
//3
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => b
    [5] => 5
)

//4
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
)

12
$list = array(
'Tunisia' => 'Tunis',
'Germany' => 'Berlin',
'Italy' => 'Rom',
'Egypt' => 'Cairo'
);
$afterIndex = 2;
$newVal= array('Palestine' => 'Jerusalem');

$newList = array_merge(array_slice($list,0,$afterIndex+1), $newVal,array_slice($list,$afterIndex+1));

Chỉ cần một đề cập: thay vì mảng_merge, ngày nay người ta cũng có thể sử dụng + giữa các mảng
roelleor

@roelleor Nhưng hãy cẩn thận: "Nếu các mảng đầu vào có cùng các khóa chuỗi, thì giá trị sau cho khóa đó sẽ ghi đè lên trước đó. Tuy nhiên, nếu các mảng chứa các khóa số, giá trị sau sẽ không ghi đè giá trị ban đầu, nhưng sẽ được nối thêm. " - mảng_merge
dài

5

Chức năng này hỗ trợ:

  • cả hai phím số và PGS
  • chèn trước hoặc sau khóa thành lập
  • nối vào cuối mảng nếu khóa không được thành lập

function insert_into_array( $array, $search_key, $insert_key, $insert_value, $insert_after_founded_key = true, $append_if_not_found = false ) {

        $new_array = array();

        foreach( $array as $key => $value ){

            // INSERT BEFORE THE CURRENT KEY? 
            // ONLY IF CURRENT KEY IS THE KEY WE ARE SEARCHING FOR, AND WE WANT TO INSERT BEFORE THAT FOUNDED KEY
            if( $key === $search_key && ! $insert_after_founded_key )
                $new_array[ $insert_key ] = $insert_value;

            // COPY THE CURRENT KEY/VALUE FROM OLD ARRAY TO A NEW ARRAY
            $new_array[ $key ] = $value;

            // INSERT AFTER THE CURRENT KEY? 
            // ONLY IF CURRENT KEY IS THE KEY WE ARE SEARCHING FOR, AND WE WANT TO INSERT AFTER THAT FOUNDED KEY
            if( $key === $search_key && $insert_after_founded_key )
                $new_array[ $insert_key ] = $insert_value;

        }

        // APPEND IF KEY ISNT FOUNDED
        if( $append_if_not_found && count( $array ) == count( $new_array ) )
            $new_array[ $insert_key ] = $insert_value;

        return $new_array;

    }

SỬ DỤNG:

    $array1 = array(
        0 => 'zero',
        1 => 'one',
        2 => 'two',
        3 => 'three',
        4 => 'four'
    );

    $array2 = array(
        'zero'  => '# 0',
        'one'   => '# 1',
        'two'   => '# 2',
        'three' => '# 3',
        'four'  => '# 4'
    );

    $array3 = array(
        0 => 'zero',
        1 => 'one',
       64 => '64',
        3 => 'three',
        4 => 'four'
    );


    // INSERT AFTER WITH NUMERIC KEYS
    print_r( insert_into_array( $array1, 3, 'three+', 'three+ value') );

    // INSERT AFTER WITH ASSOC KEYS
    print_r( insert_into_array( $array2, 'three', 'three+', 'three+ value') );

    // INSERT BEFORE
    print_r( insert_into_array( $array3, 64, 'before-64', 'before-64 value', false) );

    // APPEND IF SEARCH KEY ISNT FOUNDED
    print_r( insert_into_array( $array3, 'undefined assoc key', 'new key', 'new value', true, true) );

CÁC KẾT QUẢ:

Array
(
    [0] => zero
    [1] => one
    [2] => two
    [3] => three
    [three+] => three+ value
    [4] => four
)
Array
(
    [zero] => # 0
    [one] => # 1
    [two] => # 2
    [three] => # 3
    [three+] => three+ value
    [four] => # 4
)
Array
(
    [0] => zero
    [1] => one
    [before-64] => before-64 value
    [64] => 64
    [3] => three
    [4] => four
)
Array
(
    [0] => zero
    [1] => one
    [64] => 64
    [3] => three
    [4] => four
    [new key] => new value
)

4

Gần đây tôi đã viết một chức năng để làm một cái gì đó tương tự như những gì nó nghe giống như bạn đang cố gắng, đó là một cách tiếp cận tương tự với câu trả lời của clasvdb.

function magic_insert($index,$value,$input_array ) {
  if (isset($input_array[$index])) {
    $output_array = array($index=>$value);
    foreach($input_array as $k=>$v) {
      if ($k<$index) {
        $output_array[$k] = $v;
      } else {
        if (isset($output_array[$k]) ) {
          $output_array[$k+1] = $v;
        } else {
          $output_array[$k] = $v;
        }
      } 
    }

  } else {
    $output_array = $input_array;
    $output_array[$index] = $value;
  }
  ksort($output_array);
  return $output_array;
}

Về cơ bản, nó chèn vào một điểm cụ thể, nhưng tránh ghi đè bằng cách chuyển tất cả các mục xuống.


Hãy dùng thử Magic_insert này (3, mảng ("wow" => "wow"), $ mảng_2); Lấy $ Array_2 từ văn bản câu hỏi.
Kirzilla

Tôi không mong đợi rằng nó sẽ hoạt động vì $ Array_2 có liên quan và khái niệm vị trí thường không liên quan trong tình huống như vậy.
Peter O'Callaghan

4

Nếu bạn không biết rằng bạn muốn chèn nó ở vị trí số 3, nhưng bạn biết khóa mà bạn muốn chèn nó sau đó, tôi đã thực hiện chức năng nhỏ này sau khi thấy câu hỏi này.

/**
     * Inserts any number of scalars or arrays at the point
     * in the haystack immediately after the search key ($needle) was found,
     * or at the end if the needle is not found or not supplied.
     * Modifies $haystack in place.
     * @param array &$haystack the associative array to search. This will be modified by the function
     * @param string $needle the key to search for
     * @param mixed $stuff one or more arrays or scalars to be inserted into $haystack
     * @return int the index at which $needle was found
     */                         
    function array_insert_after(&$haystack, $needle = '', $stuff){
        if (! is_array($haystack) ) return $haystack;

        $new_array = array();
        for ($i = 2; $i < func_num_args(); ++$i){
            $arg = func_get_arg($i);
            if (is_array($arg)) $new_array = array_merge($new_array, $arg);
            else $new_array[] = $arg;
        }

        $i = 0;
        foreach($haystack as $key => $value){
            ++$i;
            if ($key == $needle) break;
        }

        $haystack = array_merge(array_slice($haystack, 0, $i, true), $new_array, array_slice($haystack, $i, null, true));

        return $i;
    }

Đây là một câu đố về codepad để thấy nó hoạt động: http://codepad.org/5WlKFKfz

Lưu ý: Array_splice () sẽ hiệu quả hơn nhiều so với Array_merge (Array_slice ()) nhưng sau đó các khóa của mảng được chèn của bạn sẽ bị mất. Thở dài.


3

Cách tiếp cận sạch hơn (dựa trên tính trôi chảy của việc sử dụng và ít mã hơn).

/**
 * Insert data at position given the target key.
 *
 * @param array $array
 * @param mixed $target_key
 * @param mixed $insert_key
 * @param mixed $insert_val
 * @param bool $insert_after
 * @param bool $append_on_fail
 * @param array $out
 * @return array
 */
function array_insert(
    array $array, 
    $target_key, 
    $insert_key, 
    $insert_val = null,
    $insert_after = true,
    $append_on_fail = false,
    $out = [])
{
    foreach ($array as $key => $value) {
        if ($insert_after) $out[$key] = $value;
        if ($key == $target_key) $out[$insert_key] = $insert_val;
        if (!$insert_after) $out[$key] = $value;
    }

    if (!isset($array[$target_key]) && $append_on_fail) {
        $out[$insert_key] = $insert_val;
    }

    return $out;
}

Sử dụng:

$colors = [
    'blue' => 'Blue',
    'green' => 'Green',
    'orange' => 'Orange',
];

$colors = array_insert($colors, 'blue', 'pink', 'Pink');

die(var_dump($colors));

2

Giải pháp đơn giản nhất, nếu bạn muốn chèn (một phần tử hoặc mảng) sau một khóa nhất định:

function array_splice_after_key($array, $key, $array_to_insert)
{
    $key_pos = array_search($key, array_keys($array));
    if($key_pos !== false){
        $key_pos++;
        $second_array = array_splice($array, $key_pos);
        $array = array_merge($array, $array_to_insert, $second_array);
    }
    return $array;
}

Vì vậy, nếu bạn có:

$array = [
    'one' => 1,
    'three' => 3
];
$array_to_insert = ['two' => 2];

Và thực hiện:

$result_array = array_splice_after_key($array, 'one', $array_to_insert);

Bạn sẽ có:

Array ( 
    ['one'] => 1 
    ['two'] => 2 
    ['three'] => 3 
)

2

Sử dụng Array_splice thay vì Array_slice sẽ cung cấp một lệnh gọi hàm ít hơn.

$toto =  array(
  'zero'  => '0',
  'one'   => '1',
  'two'   => '2',
  'three' => '3'
);
$ret = array_splice($toto, 3 );
$toto = $toto +  array("my_key" => "my_value") + $ret;
print_r($toto);

2

Tôi làm điều đó như


    $slightly_damaged = array_merge(
        array_slice($slightly_damaged, 0, 4, true) + ["4" => "0.0"], 
        array_slice($slightly_damaged, 4, count($slightly_damaged) - 4, true)
    );


1

Tôi vừa tạo một lớp ArrayHelper sẽ làm điều này rất dễ dàng cho các chỉ mục số.

class ArrayHelper
{
    /*
        Inserts a value at the given position or throws an exception if
        the position is out of range.
        This function will push the current values up in index. ex. if 
        you insert at index 1 then the previous value at index 1 will 
        be pushed to index 2 and so on.
        $pos: The position where the inserted value should be placed. 
        Starts at 0.
    */
    public static function insertValueAtPos(array &$array, $pos, $value) {
        $maxIndex = count($array)-1;

        if ($pos === 0) {
            array_unshift($array, $value);
        } elseif (($pos > 0) && ($pos <= $maxIndex)) {
            $firstHalf = array_slice($array, 0, $pos);
            $secondHalf = array_slice($array, $pos);
            $array = array_merge($firstHalf, array($value), $secondHalf);
        } else {
            throw new IndexOutOfBoundsException();
        }

    }
}

Thí dụ:

$array = array('a', 'b', 'c', 'd', 'e');
$insertValue = 'insert';
\ArrayHelper::insertValueAtPos($array, 3, $insertValue);

Bắt đầu mảng $:

Array ( 
    [0] => a 
    [1] => b 
    [2] => c 
    [3] => d 
    [4] => e 
)

Kết quả:

Array ( 
    [0] => a 
    [1] => b 
    [2] => c 
    [3] => insert 
    [4] => d 
    [5] => e 
)

1

Đây là phương pháp tốt hơn làm thế nào để chèn mục vào mảng trên một số vị trí.

function arrayInsert($array, $item, $position)
{
    $begin = array_slice($array, 0, $position);
    array_push($begin, $item);
    $end = array_slice($array, $position);
    $resultArray = array_merge($begin, $end);
    return $resultArray;
}

1

Tôi cần một cái gì đó có thể chèn trước, thay thế, sau khóa; và thêm vào lúc bắt đầu hoặc kết thúc mảng nếu không tìm thấy khóa đích. Mặc định là chèn sau khóa.

Chức năng mới

/**
 * Insert element into an array at a specific key.
 *
 * @param array $input_array
 *   The original array.
 * @param array $insert
 *   The element that is getting inserted; array(key => value).
 * @param string $target_key
 *   The key name.
 * @param int $location
 *   1 is after, 0 is replace, -1 is before.
 *
 * @return array
 *   The new array with the element merged in.
 */
function insert_into_array_at_key(array $input_array, array $insert, $target_key, $location = 1) {
  $output = array();
  $new_value = reset($insert);
  $new_key = key($insert);
  foreach ($input_array as $key => $value) {
    if ($key === $target_key) {
      // Insert before.
      if ($location == -1) {
        $output[$new_key] = $new_value;
        $output[$key] = $value;
      }
      // Replace.
      if ($location == 0) {
        $output[$new_key] = $new_value;
      }
      // After.
      if ($location == 1) {
        $output[$key] = $value;
        $output[$new_key] = $new_value;
      }
    }
    else {
      // Pick next key if there is an number collision.
      if (is_numeric($key)) {
        while (isset($output[$key])) {
          $key++;
        }
      }
      $output[$key] = $value;
    }
  }
  // Add to array if not found.
  if (!isset($output[$new_key])) {
    // Before everything.
    if ($location == -1) {
      $output = $insert + $output;
    }
    // After everything.
    if ($location == 1) {
      $output[$new_key] = $new_value;
    }

  }
  return $output;
}

Mã đầu vào

$array_1 = array(
  '0' => 'zero',
  '1' => 'one',
  '2' => 'two',
  '3' => 'three',
);
$array_2 = array(
  'zero'  => '0',
  'one'   => '1',
  'two'   => '2',
  'three' => '3',
);

$array_1 = insert_into_array_at_key($array_1, array('sample_key' => 'sample_value'), 2, 1);
print_r($array_1);
$array_2 = insert_into_array_at_key($array_2, array('sample_key' => 'sample_value'), 'two', 1);
print_r($array_2);

Đầu ra

Array
(
    [0] => zero
    [1] => one
    [2] => two
    [sample_key] => sample_value
    [3] => three
)
Array
(
    [zero] => 0
    [one] => 1
    [two] => 2
    [sample_key] => sample_value
    [three] => 3
)

1

Câu trả lời 2 chuỗi rất đơn giản cho câu hỏi của bạn:

$array_1 = array(
  '0' => 'zero',
  '1' => 'one',
  '2' => 'two',
  '3' => 'three',
);

Đầu tiên, bạn chèn bất cứ thứ gì vào phần tử thứ ba của bạn bằng mảng_splice và sau đó gán giá trị cho phần tử này:

array_splice($array_1, 3, 0 , true);
$array_1[3] = array('sample_key' => 'sample_value');

1

Đây là một câu hỏi cũ, nhưng tôi đã đăng một bình luận vào năm 2014 và thường xuyên quay lại vấn đề này. Tôi nghĩ rằng tôi sẽ để lại một câu trả lời đầy đủ. Đây không phải là giải pháp ngắn nhất nhưng nó khá dễ hiểu.

Chèn một giá trị mới vào một mảng kết hợp, tại một vị trí được đánh số, giữ các khóa và giữ trật tự.

$columns = array(
    'id' => 'ID',
    'name' => 'Name',
    'email' => 'Email',
    'count' => 'Number of posts'
);

$columns = array_merge(
    array_slice( $columns, 0, 3, true ),     // The first 3 items from the old array
    array( 'subscribed' => 'Subscribed' ),   // New value to add after the 3rd item
    array_slice( $columns, 3, null, true )   // Other items after the 3rd
);

print_r( $columns );

/*
Array ( 
    [id] => ID 
    [name] => Name 
    [email] => Email 
    [subscribed] => Subscribed 
    [count] => Number of posts 
)
*/

0

Không cụ thể như câu trả lời của Artefacto, nhưng dựa trên đề xuất của ông về việc sử dụng Array_slice (), tôi đã viết hàm tiếp theo:

function arrayInsert($target, $byKey, $byOffset, $valuesToInsert, $afterKey) {
    if (isset($byKey)) {
        if (is_numeric($byKey)) $byKey = (int)floor($byKey);
        $offset = 0;

        foreach ($target as $key => $value) {
            if ($key === $byKey) break;
            $offset++;
        }

        if ($afterKey) $offset++;
    } else {
        $offset = $byOffset;
    }

    $targetLength = count($target);
    $targetA = array_slice($target, 0, $offset, true);
    $targetB = array_slice($target, $offset, $targetLength, true);
    return array_merge($targetA, $valuesToInsert, $targetB);
}

Đặc trưng:

  • Chèn một hoặc nhiều giá trị
  • Chèn cặp giá trị khóa
  • Chèn trước / sau khóa hoặc bù

Ví dụ sử dụng:

$target = [
    'banana' => 12,
    'potatoe' => 6,
    'watermelon' => 8,
    'apple' => 7,
    2 => 21,
    'pear' => 6
];

// Values must be nested in an array
$insertValues = [
    'orange' => 0,
    'lemon' => 3,
    3
];

// By key
// Third parameter is not applicable
//     Insert after 2 (before 'pear')
var_dump(arrayInsert($target, 2, null, $valuesToInsert, true));
//     Insert before 'watermelon'
var_dump(arrayInsert($target, 'watermelon', null, $valuesToInsert, false)); 

// By offset
// Second and last parameter are not applicable
//     Insert in position 2 (zero based i.e. before 'watermelon')
var_dump(arrayInsert($target, null, 2, $valuesToInsert, null)); 

0

Trong trường hợp bạn chỉ muốn chèn một mục vào một mảng tại một vị trí nhất định (dựa trên câu trả lời @clausvdb):

function array_insert($arr, $insert, $position) {
    $i = 0;
    $ret = array();
    foreach ($arr as $key => $value) {
            if ($i == $position) {
                $ret[] = $insert;
            }
            $ret[] = $value;
            $i++;
    }
    return $ret;
}

0

Đây là phiên bản của tôi:

/**
 * 
 * Insert an element after an index in an array
 * @param array $array  
 * @param string|int $key 
 * @param mixed $value
 * @param string|int $offset
 * @return mixed
 */
function array_splice_associative($array, $key, $value, $offset) {
    if (!is_array($array)) {
        return $array;
    }
    if (array_key_exists($key, $array)) {
        unset($array[$key]);
    }
    $return = array();
    $inserted = false;
    foreach ($array as $k => $v) {
        $return[$k] = $v;
        if ($k == $offset && !$inserted) {
            $return[$key] = $value;
            $inserted = true;
        }
    }
    if (!$inserted) {
        $return[$key] = $value;
    }


    return $return;
}

0

cách dễ dàng .. sử dụng array_splice()

$array_1 = array(
  '0' => 'zero',
  '1' => 'one',
  '2' => 'two',
  '3' => 'three',
);

$addArray = array('sample_key' => 'sample_value');

array_splice($rs, 3, 0, $addArray);

Kết quả..

Array
(
    [0] => zero
    [1] => one
    [2] => two
    [3] => sample_value
    [4] => three
)

2
Điều này không thêm bất cứ điều gì vào tất cả các ý kiến ​​và câu trả lời khác
j08691

0

Đây là một giải pháp khác trong PHP 7.1


     /**
     * @param array $input    Input array to add items to
     * @param array $items    Items to insert (as an array)
     * @param int   $position Position to inject items from (starts from 0)
     *
     * @return array
     */
    function arrayInject( array $input, array $items, int $position ): array 
    {
        if (0 >= $position) {
            return array_merge($items, $input);
        }
        if ($position >= count($input)) {
            return array_merge($input, $items);
        }

        return array_merge(
            array_slice($input, 0, $position, true),
            $items,
            array_slice($input, $position, null, true)
        );
    }

-1

Bạn có thể chèn các phần tử trong vòng lặp foreach , vì vòng lặp này hoạt động trên một bản sao của mảng ban đầu, nhưng bạn phải theo dõi số lượng dòng được chèn (tôi gọi đây là "bloat" trong mã này):

$bloat=0;
foreach ($Lines as $n=>$Line)
    {
    if (MustInsertLineHere($Line))
        {
        array_splice($Lines,$n+$bloat,0,"string to insert");
        ++$bloat;
        }
    }

Rõ ràng, bạn có thể khái quát hóa ý tưởng "phình to" này để xử lý các thao tác chèn và xóa tùy ý trong vòng lặp foreach.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.