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.


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',
  ),
)

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)

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

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

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

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

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

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.


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


2

jika tidak yakin, maka JANGAN GUNAKAN INI :

$arr1 = $arr1 + $arr2;

ATAU

$arr1 += $arr2;

karena dengan + array asli akan ditimpa. ( lihat 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.


2

Anda bisa menggunakan ini

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

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.


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

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

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']);

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

2
mengapa tidak $src = array_merge($array_head, $ins, $array_tail);?
kereta sebelum kuda
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.