Masukkan item baru dalam array pada posisi apa pun di PHP

Jawaban:

920

Anda mungkin menemukan ini sedikit lebih intuitif. Hanya membutuhkan satu panggilan fungsi untuk 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

Jika penggantian hanya satu elemen, tidak perlu menempatkan array () di sekitarnya, kecuali elemen itu sendiri array, objek atau NULL.

jay.lee
sumber
32
Sungguh aneh bahwa fungsi dasar semacam itu sebenarnya tersembunyi, karena tujuan utama fungsi ini seperti yang dijelaskan dalam dokumentasi adalah sesuatu yang berbeda (ganti barang dalam array). Ya, itu ditunjukkan di bagian argumen, tetapi jika Anda hanya memindai deskripsi fungsi untuk menemukan apa yang akan digunakan untuk memasukkan dalam array Anda tidak akan pernah menemukannya.
Mahn
24
Hanya mengatakan bahwa ini tidak akan menyimpan kunci dalam $inserted array.
mauris
6
Juga dalam manual PHP, contoh # 1: php.net/manual/en/function.array-splice.php
marcovtwout
3
@ JacerOmri itu sepenuhnya benar, kedua pernyataan tersebut valid. Anda bisa melewatkan nilai jenis apa pun, tetapi mungkin tidak berperilaku sama untuk array, objek, atau nol. Untuk skalar, tipe-casting (array)$scalarsetara dengan array($scalar), tetapi untuk array, objek, atau null, itu akan diabaikan (array), dikonversi ke array (objek), atau menjadi array kosong (nol) - lihat php.net / manual / en / ...
Lukas
2
@ SunilPachlangia, adelval, dan lainnya: dengan array multi-dimensi Anda perlu membungkus penggantian dalam sebuah array, itu didokumentasikan. Saya masih membawa catatan itu di sini sehingga orang-orang berhenti melakukan kesalahan.
Félix Gagnon-Grenier
47

Fungsi yang dapat disisipkan pada posisi integer dan string:

/**
 * @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)
        );
    }
}

Penggunaan bilangan bulat:

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

Penggunaan String:

$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',
  ),
)
Halil Özgür
sumber
2
The array_splice()kehilangan kunci, sedangkan array_merge()tidak. Jadi hasil dari fungsi pertama bisa sangat mengejutkan ... Terutama karena jika Anda memiliki dua elemen dengan kunci yang sama, hanya nilai yang terakhir disimpan ...
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)
Amber
sumber
11
Menggunakan +alih-alih array_mergedapat menyimpan kunci
mauris
1
Sekarang saya dapat menambahkan lebih banyak elemen sebelum INDEX
Abbas
5

Dengan cara ini Anda dapat memasukkan array:

function array_insert(&$array, $value, $index)
{
    return $array = array_merge(array_splice($array, max(0, $index - 1)), array($value), $array);
}
Aleksandr Makov
sumber
2
Fungsi itu tidak menyimpan urutan dalam array.
Daniel Petrovaliev
5

Tidak ada fungsi PHP asli (yang saya ketahui) yang dapat melakukan persis apa yang Anda minta.

Saya telah menulis 2 metode yang saya yakini cocok untuk tujuan:

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;
}

Meskipun lebih cepat dan mungkin lebih hemat memori, ini hanya benar-benar cocok jika tidak perlu mempertahankan kunci-kunci array.

Jika Anda perlu mempertahankan kunci, yang berikut ini akan lebih cocok;

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;
}
Bocah Yang Bernama Su
sumber
1
Ini berfungsi dengan baik. Namun, dalam contoh kedua, dalam fungsi Anda insertBefore(), Anda harus kembali $tmpArraybukan $input.
Christoph Fischer
4

Berdasarkan @Halil jawaban yang bagus, berikut adalah fungsi sederhana cara menyisipkan elemen baru setelah kunci tertentu, sambil mempertahankan kunci integer:

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)
    );
} 
d.raev
sumber
4

Jika Anda ingin menyimpan kunci array awal dan juga menambahkan array yang memiliki kunci, gunakan fungsi di bawah ini:

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);
}

Contoh panggilan:

$array = insertArrayAtPosition($array, array('key' => 'Value'), 3);
Mayra M
sumber
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;
}
henry wong
sumber
3

Inilah yang bekerja untuk saya untuk array asosiatif:

/*
 * 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;
}

Sumber fungsi - posting blog ini . Ada juga fungsi praktis untuk menyisipkan SEBELUM kunci khusus.

Oksana Romaniv
sumber
2

Ini juga solusi yang berfungsi:

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;
}

kredit masuk ke: http://binarykitten.com/php/52-php-insert-element-and-shift.html

Mike Doh
sumber
2

jika tidak yakin, maka JANGAN GUNAKAN INI :

$arr1 = $arr1 + $arr2;

ATAU

$arr1 += $arr2;

karena dengan + array asli akan ditimpa. ( lihat sumber )

T.Todua
sumber
2

Solusi oleh jay.lee sempurna. Jika Anda ingin menambahkan item ke array multidimensi, pertama tambahkan array dimensi tunggal dan kemudian ganti sesudahnya.

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

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

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

Menambahkan item dalam format yang sama ke array ini akan menambahkan semua indeks array baru sebagai item, bukan hanya item.

$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

Catatan: Menambahkan item secara langsung ke array multidimensi dengan array_splice akan menambahkan semua indeksnya sebagai item, bukan hanya item itu.

Abdul Mannan
sumber
2

Anda bisa menggunakan ini

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

Biasanya, dengan nilai skalar:

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

Untuk memasukkan elemen array tunggal ke dalam array Anda jangan lupa untuk membungkus array dalam array (karena itu adalah nilai skalar!):

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

jika tidak, semua kunci array akan ditambahkan sepotong demi sepotong.

menandai
sumber
1

Petunjuk untuk menambahkan elemen di awal array :

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

kemudian:

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

tapi:

for ($i = -1; $i < count($a)-1; $i++)
     echo $a . ' ';
//returns i am as 1st element
forsberg
sumber
13
Petunjuk untuk menambahkan elemen di awal:array_unshift($a,'i am the new first element');
1

Coba yang ini:

$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;
}
Maks
sumber
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;
}

Contoh panggilan:

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

Untuk memasukkan elemen ke dalam array dengan kunci string, Anda dapat melakukan sesuatu seperti ini:

/* 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); 
} 
Bryan Plasters
sumber
2
mengapa tidak $src = array_merge($array_head, $ins, $array_tail);?
kereta sebelum kuda