Chèn mục mới vào mảng trên bất kỳ vị trí nào trong PHP


Câu trả lời:


920

Bạn có thể thấy điều này trực quan hơn một chút. Nó chỉ yêu cầu một chức năng gọi đến array_splice:

$original = array( 'a', 'b', 'c', 'd', 'e' );
$inserted = array( 'x' ); // not necessarily an array, see manual quote

array_splice( $original, 3, 0, $inserted ); // splice in at position 3
// $original is now a b c x d e

Nếu sự thay thế chỉ là một phần tử thì không cần thiết phải đặt mảng () xung quanh nó, trừ khi phần tử đó là một mảng, một đối tượng hoặc NULL.


32
Thật kỳ lạ khi một chức năng cơ bản như vậy thực sự bị ẩn đi, trong đó mục đích chính của chức năng này như được mô tả trong tài liệu là một cái gì đó khác biệt (thay thế công cụ trong mảng). Vâng, nó được chỉ ra trong phần đối số, nhưng nếu bạn chỉ quét các mô tả chức năng để tìm những gì cần sử dụng để chèn vào mảng thì bạn sẽ không bao giờ tìm thấy nó.
Mahn

23
Chỉ cần nói rằng điều này sẽ không bảo tồn các khóa trong $insertedmảng.
mauris

6
Cũng trong PHP sử dụng, ví dụ # 1: php.net/manual/en/function.array-splice.php
marcovtwout

3
@JacerOmri hoàn toàn đúng, cả hai câu đều hợp lệ. Bạn có thể truyền một giá trị của bất kỳ loại nào, nhưng nó có thể không hoạt động giống nhau cho một mảng, một đối tượng hoặc null. Đối với vô hướng, kiểu truyền (array)$scalartương đương với array($scalar), nhưng đối với một mảng, một đối tượng hoặc null, nó sẽ bị bỏ qua (mảng), chuyển đổi thành một mảng (đối tượng) hoặc trở thành một mảng trống (null) - xem php.net / hướng dẫn sử dụng / en /
Bắn

2
@SunilPachlangia, adelval và những người khác: với các mảng đa chiều, bạn cần bọc thay thế trong một mảng, nó được ghi lại. Tôi vẫn mang ghi chú ở đây để mọi người ngừng làm sai.
Félix Gagnon-Grenier

47

Một hàm có thể chèn tại cả hai vị trí số nguyên và chuỗi:

/**
 * @param array      $array
 * @param int|string $position
 * @param mixed      $insert
 */
function array_insert(&$array, $position, $insert)
{
    if (is_int($position)) {
        array_splice($array, $position, 0, $insert);
    } else {
        $pos   = array_search($position, array_keys($array));
        $array = array_merge(
            array_slice($array, 0, $pos),
            $insert,
            array_slice($array, $pos)
        );
    }
}

Sử dụng số nguyên:

$arr = ["one", "two", "three"];
array_insert(
    $arr,
    1,
    "one-half"
);
// ->
array (
  0 => 'one',
  1 => 'one-half',
  2 => 'two',
  3 => 'three',
)

Sử dụng chuỗi:

$arr = [
    "name"  => [
        "type"      => "string",
        "maxlength" => "30",
    ],
    "email" => [
        "type"      => "email",
        "maxlength" => "150",
    ],
];

array_insert(
    $arr,
    "email",
    [
        "phone" => [
            "type"   => "string",
            "format" => "phone",
        ],
    ]
);
// ->
array (
  'name' =>
  array (
    'type' => 'string',
    'maxlength' => '30',
  ),
  'phone' =>
  array (
    'type' => 'string',
    'format' => 'phone',
  ),
  'email' =>
  array (
    'type' => 'email',
    'maxlength' => '150',
  ),
)

1
Các array_splice()đánh mất chìa khóa, trong khi đó array_merge()thì không. Vì vậy, kết quả của chức năng đầu tiên có thể rất đáng ngạc nhiên ... Đặc biệt bởi vì nếu bạn có hai yếu tố có cùng khóa, chỉ có giá trị của chức năng cuối cùng được giữ ...
Alexis Wilke

33
$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)

10
Sử dụng +thay vì array_mergecó thể bảo quản chìa khóa
mauris

1
Bây giờ tôi có thể thêm nhiều yếu tố trước INDEX
Abbas

5

Bằng cách này bạn có thể chèn mảng:

function array_insert(&$array, $value, $index)
{
    return $array = array_merge(array_splice($array, max(0, $index - 1)), array($value), $array);
}

2
Hàm đó không lưu thứ tự trong mảng.
Daniel Petrovaliev

5

Không có chức năng PHP gốc (mà tôi biết) có thể làm chính xác những gì bạn yêu cầu.

Tôi đã viết 2 phương pháp mà tôi tin là phù hợp với mục đích:

function insertBefore($input, $index, $element) {
    if (!array_key_exists($index, $input)) {
        throw new Exception("Index not found");
    }
    $tmpArray = array();
    $originalIndex = 0;
    foreach ($input as $key => $value) {
        if ($key === $index) {
            $tmpArray[] = $element;
            break;
        }
        $tmpArray[$key] = $value;
        $originalIndex++;
    }
    array_splice($input, 0, $originalIndex, $tmpArray);
    return $input;
}

function insertAfter($input, $index, $element) {
    if (!array_key_exists($index, $input)) {
        throw new Exception("Index not found");
    }
    $tmpArray = array();
    $originalIndex = 0;
    foreach ($input as $key => $value) {
        $tmpArray[$key] = $value;
        $originalIndex++;
        if ($key === $index) {
            $tmpArray[] = $element;
            break;
        }
    }
    array_splice($input, 0, $originalIndex, $tmpArray);
    return $input;
}

Mặc dù nhanh hơn và có thể hiệu quả hơn về bộ nhớ, nhưng điều này chỉ thực sự phù hợp khi không cần thiết phải duy trì các phím của mảng.

Nếu bạn cần duy trì các phím, điều sau đây sẽ phù hợp hơn;

function insertBefore($input, $index, $newKey, $element) {
    if (!array_key_exists($index, $input)) {
        throw new Exception("Index not found");
    }
    $tmpArray = array();
    foreach ($input as $key => $value) {
        if ($key === $index) {
            $tmpArray[$newKey] = $element;
        }
        $tmpArray[$key] = $value;
    }
    return $input;
}

function insertAfter($input, $index, $newKey, $element) {
    if (!array_key_exists($index, $input)) {
        throw new Exception("Index not found");
    }
    $tmpArray = array();
    foreach ($input as $key => $value) {
        $tmpArray[$key] = $value;
        if ($key === $index) {
            $tmpArray[$newKey] = $element;
        }
    }
    return $tmpArray;
}

1
Điều này hoạt động tốt. Tuy nhiên, trong ví dụ thứ hai, trong chức năng của bạn insertBefore(), bạn nên quay lại $tmpArraythay vì $input.
Christoph Fischer

4

Dựa trên câu trả lời tuyệt vời của @Halil, đây là chức năng đơn giản để chèn phần tử mới sau một khóa cụ thể, trong khi vẫn bảo tồn các khóa nguyên:

private function arrayInsertAfterKey($array, $afterKey, $key, $value){
    $pos   = array_search($afterKey, array_keys($array));

    return array_merge(
        array_slice($array, 0, $pos, $preserve_keys = true),
        array($key=>$value),
        array_slice($array, $pos, $preserve_keys = true)
    );
} 

4

Nếu bạn muốn giữ các khóa của mảng ban đầu và cũng thêm một mảng có các khóa, thì hãy sử dụng chức năng dưới đây:

function insertArrayAtPosition( $array, $insert, $position ) {
    /*
    $array : The initial array i want to modify
    $insert : the new array i want to add, eg array('key' => 'value') or array('value')
    $position : the position where the new array will be inserted into. Please mind that arrays start at 0
    */
    return array_slice($array, 0, $position, TRUE) + $insert + array_slice($array, $position, NULL, TRUE);
}

Ví dụ gọi:

$array = insertArrayAtPosition($array, array('key' => 'Value'), 3);

3
function insert(&$arr, $value, $index){       
    $lengh = count($arr);
    if($index<0||$index>$lengh)
        return;

    for($i=$lengh; $i>$index; $i--){
        $arr[$i] = $arr[$i-1];
    }

    $arr[$index] = $value;
}

3

Đây là những gì làm việc cho tôi cho mảng kết hợp:

/*
 * Inserts a new key/value after the key in the array.
 *
 * @param $key
 *   The key to insert after.
 * @param $array
 *   An array to insert in to.
 * @param $new_key
 *   The key to insert.
 * @param $new_value
 *   An value to insert.
 *
 * @return
 *   The new array if the key exists, FALSE otherwise.
 *
 * @see array_insert_before()
 */
function array_insert_after($key, array &$array, $new_key, $new_value) {
  if (array_key_exists($key, $array)) {
    $new = array();
    foreach ($array as $k => $value) {
      $new[$k] = $value;
      if ($k === $key) {
        $new[$new_key] = $new_value;
      }
    }
    return $new;
  }
  return FALSE;
}

Nguồn chức năng - bài blog này . Ngoài ra còn có chức năng tiện dụng để chèn TRƯỚC phím cụ thể.


2

Đây cũng là một giải pháp làm việc:

function array_insert(&$array,$element,$position=null) {
  if (count($array) == 0) {
    $array[] = $element;
  }
  elseif (is_numeric($position) && $position < 0) {
    if((count($array)+position) < 0) {
      $array = array_insert($array,$element,0);
    }
    else {
      $array[count($array)+$position] = $element;
    }
  }
  elseif (is_numeric($position) && isset($array[$position])) {
    $part1 = array_slice($array,0,$position,true);
    $part2 = array_slice($array,$position,null,true);
    $array = array_merge($part1,array($position=>$element),$part2);
    foreach($array as $key=>$item) {
      if (is_null($item)) {
        unset($array[$key]);
      }
    }
  }
  elseif (is_null($position)) {
    $array[] = $element;
  }  
  elseif (!isset($array[$position])) {
    $array[$position] = $element;
  }
  $array = array_merge($array);
  return $array;
}

tín dụng truy cập: http://binarykitten.com/php/52-php-insert-element-and-shift.html


2

Giải pháp của jay.lee là hoàn hảo. Trong trường hợp bạn muốn thêm (các) mục vào một mảng nhiều chiều, trước tiên hãy thêm một mảng một chiều và sau đó thay thế nó sau đó.

$original = (
[0] => Array
    (
        [title] => Speed
        [width] => 14
    )

[1] => Array
    (
        [title] => Date
        [width] => 18
    )

[2] => Array
    (
        [title] => Pineapple
        [width] => 30
     )
)

Thêm một mục có cùng định dạng vào mảng này sẽ thêm tất cả các chỉ mục mảng mới dưới dạng các mục thay vì chỉ mục.

$new = array(
    'title' => 'Time',
    'width' => 10
);
array_splice($original,1,0,array('random_string')); // can be more items
$original[1] = $new;  // replaced with actual item

Lưu ý: Thêm các mục trực tiếp vào một mảng nhiều chiều với mảng_splice sẽ thêm tất cả các chỉ mục của nó dưới dạng các mục thay vì chỉ mục đó.


2

Bạn có thể sử dụng cái này

foreach ($array as $key => $value) 
{
    if($key==1)
    {
        $new_array[]=$other_array;
    }   
    $new_array[]=$value;    
}

1

Thông thường, với các giá trị vô hướng:

$elements = array('foo', ...);
array_splice($array, $position, $length, $elements);

Để chèn một phần tử mảng duy nhất vào mảng của bạn, đừng quên bọc mảng trong một mảng (vì đó là giá trị vô hướng!):

$element = array('key1'=>'value1');
$elements = array($element);
array_splice($array, $position, $length, $elements);

nếu không, tất cả các khóa của mảng sẽ được thêm từng mảnh.


1

Gợi ý để thêm một phần tử ở đầu một mảng :

$a = array('first', 'second');
$a[-1] = 'i am the new first element';

sau đó:

foreach($a as $aelem)
    echo $a . ' ';
//returns first, second, i am...

nhưng:

for ($i = -1; $i < count($a)-1; $i++)
     echo $a . ' ';
//returns i am as 1st element

13
Gợi ý để thêm một yếu tố vào đầu:array_unshift($a,'i am the new first element');

1

nếu không chắc chắn, thì KHÔNG SỬ DỤNG NÀY :

$arr1 = $arr1 + $arr2;

HOẶC LÀ

$arr1 += $arr2;

bởi vì với + mảng gốc sẽ bị ghi đè. ( xem nguồn )


1

Hãy thử cái này:

$colors = array('red', 'blue', 'yellow');

$colors = insertElementToArray($colors, 'green', 2);


function insertElementToArray($arr = array(), $element = null, $index = 0)
{
    if ($element == null) {
        return $arr;
    }

    $arrLength = count($arr);
    $j = $arrLength - 1;

    while ($j >= $index) {
        $arr[$j+1] = $arr[$j];
        $j--;
    }

    $arr[$index] = $element;

    return $arr;
}

1
function array_insert($array, $position, $insert) {
    if ($position > 0) {
        if ($position == 1) {
            array_unshift($array, array());
        } else {
            $position = $position - 1;
            array_splice($array, $position, 0, array(
                ''
            ));
        }
        $array[$position] = $insert;
    }

    return $array;
}

Ví dụ gọi:

$array = array_insert($array, 1, ['123', 'abc']);

0

Để chèn các phần tử vào một mảng bằng các khóa chuỗi, bạn có thể làm một cái gì đó như thế này:

/* insert an element after given array key
 * $src = array()  array to work with
 * $ins = array() to insert in key=>array format
 * $pos = key that $ins will be inserted after
 */ 
function array_insert_string_keys($src,$ins,$pos) {

    $counter=1;
    foreach($src as $key=>$s){
        if($key==$pos){
            break;
        }
        $counter++;
    } 

    $array_head = array_slice($src,0,$counter);
    $array_tail = array_slice($src,$counter);

    $src = array_merge($array_head, $ins);
    $src = array_merge($src, $array_tail);

    return($src); 
} 

2
tại sao không $src = array_merge($array_head, $ins, $array_tail);?
cartb Beforehorse
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.