Bagaimana cara memasukkan elemen ke dalam array pada posisi tertentu?

190

Bayangkan kita memiliki dua array:

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

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

Sekarang, saya ingin memasukkan array('sample_key' => 'sample_value')setelah elemen ketiga dari setiap array. Bagaimana saya bisa melakukannya?

Kirzilla
sumber

Jawaban:

208

array_slice()dapat digunakan untuk mengekstrak bagian-bagian array, dan operator array+ serikat pekerja ( ) dapat menggabungkan kembali bagian-bagian tersebut.

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

Contoh ini:

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

memberi:

Himpunan
(
    [nol] => 0
    [satu] => 1
    [dua] => 2
    [my_key] => my_value
    [tiga] => 3
)
Artefacto
sumber
8
Anda harus menggunakan array_splice () seperti yang disarankan M42. Ini memecahkan masalah hanya dalam satu baris kode.
Nickh
27
+tidak boleh digunakan! Gunakan array_mergesebagai gantinya! Karena jika indeks bilangan bulat (array normal, bukan hash), +tidak akan berfungsi seperti yang diharapkan !!!
TMS
4
@ Thomas Apakah itu berfungsi seperti yang diharapkan atau tidak tergantung pada harapan Anda. array_mergePerilaku sehubungan dengan kunci numerik tidak sesuai untuk pertanyaan ini.
Artefacto
10
Alih-alih menggunakan count($array)-3Anda hanya dapat menetapkan null untuk efek yang sama. Juga, menggunakan array_mergeseperti yang disarankan TMS tidak akan mengharuskan Anda untuk menggunakan indeks yang unik. CONTOH: Tambahkan "nilai baru" ke array yang ada:$b = array_merge( array_slice( $a, 0, 1, true ), array( 'new-value' ), array_slice( $a, 1, null, true ) );
Radley Sustaire
1
Tampaknya ada beberapa kebingungan tentang +vs array_merge. Jika Anda ingin memasukkan sesuatu ke dalam array numerik, Anda tidak boleh menggunakannya +karena itu mungkin tidak sesuai dengan harapan Anda. Tetapi Anda juga tidak boleh menggunakan array_merge; untuk array numerik, seluruh masalah ini diselesaikan dengan array_splicefungsi. Untuk array asosiatif atau campuran, Anda mungkin tidak ingin kunci numerik diindeks ulang sehingga menggunakan +sepenuhnya tepat.
meustrus
104

Untuk larik pertama Anda, gunakan array_splice():

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

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

keluaran:

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

untuk yang kedua tidak ada pesanan sehingga Anda hanya perlu melakukan:

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

Dan urutkan kunci dengan apa pun yang Anda inginkan.

Toto
sumber
33
Array kedua memang memiliki pesanan ... Semua array memiliki, karena mereka juga daftar ditautkan ganda.
Artefacto
5
-1, sebagaimana disebutkan "tidak ada urutan" salah. Juga, array_splice menghancurkan asosiasi kunci / nilai pada contoh pertama (tapi mungkin OP bermaksud demikian).
Brad Koch
2
@Artefacto "Array" dalam PHP sebenarnya adalah tabel hash yang diurutkan . Array PHP bertindak seperti array, tetapi mereka tidak pernah benar-benar array; mereka juga tidak terkait daftar, atau daftar susunan.
Frederik Krautwald
1
5 jam kemudian akhirnya saya membaca jawaban yang saya mengerti, terima kasih! Satu hal tambahan yang perlu dicatat bahwa jika seseorang mendorong array asosiatif mereka juga dapat menentukan "array" sebagai argumen ke-4 di array_splice..seperti itu: array_splice ($ array_1, 3, 0, ARRAY ($ array_name_to_insert));
Robert Sinclair
1
@FrederikKrautwald Sejak PHP 7, pernyataan itu tidak benar. PHP 7 menggunakan dua array untuk mengimplementasikan tabel hash + daftar yang dipesan. Berikut ini adalah artikel dari salah satu pengembang PHP inti (Nikic): nikic.github.io/2014/12/22/…
CubicleSoft
19

kode:

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

contoh:

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

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

Mungkin tidak benar-benar terlihat sempurna, tetapi berhasil.

clausvdb
sumber
11
Anda pada dasarnya mencoba melakukan splicing, jangan menemukan kembali kemudi.
Paul Dragoonis
11
Tidak, dia tidak menemukan kembali kemudi. array_splice () tidak memungkinkan untuk memasukkan kunci dan nilai. Hanya nilai dengan posisi spesifik sebagai kunci.
Kirzilla
ya, tetapi seperti yang dikatakan sebelumnya, array_splice tidak mendukung array asosiatif. Saya akan sangat senang melihat pendekatan yang lebih elegan.
clausvdb
Fungsi Anda benar-benar bagus, tetapi tidak berfungsi dengan benar dengan posisi lebih besar dari panjang array (coba jalankan array_insert ini ($ array_2, array ("wow" => "wow"), 4)). Tapi itu bisa dengan mudah diperbaiki. Jawaban Anda bagus dan Anda sudah menjawab pertanyaan saya!
Kirzilla
13

Inilah fungsi sederhana yang bisa Anda gunakan. Cukup pasang dan mainkan.

Ini adalah Insert By Index, Not By Value.

Anda dapat memilih untuk melewati array, atau menggunakan array yang sudah Anda nyatakan.

EDIT: Versi Lebih Pendek:

   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
}

Sekarang Anda dapat menguji kodenya menggunakan

//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>";

Dan hasilnya adalah:

//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
)
Mohammed Joraid
sumber
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));
foued611
sumber
Hanya menyebutkan: alih-alih array_merge, orang juga dapat menggunakan + antara array saat ini
roelleor
@roelleor Tapi hati-hati: "Jika array input memiliki kunci string yang sama, maka nilai nanti untuk kunci itu akan menimpa yang sebelumnya. Jika, bagaimanapun, array berisi kunci numerik, nilai kemudian tidak akan menimpa nilai asli, tetapi akan ditambahkan. " - array_merge
panjang
5

Fungsi ini mendukung:

  • baik tombol numerik dan assoc
  • masukkan sebelum atau sesudah kunci yang ditemukan
  • tambahkan ke akhir array jika kunci tidak ditemukan

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;

    }

PEMAKAIAN:

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

HASIL:

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
)
Déján Kőŕdić
sumber
4

Saya baru-baru menulis fungsi untuk melakukan sesuatu yang mirip dengan apa yang Anda coba, itu pendekatan yang mirip dengan jawaban 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;
}

Pada dasarnya ia memasukkan pada titik tertentu, tetapi menghindari menimpa dengan menggeser semua item ke bawah.

Peter O'Callaghan
sumber
Coba ini magic_insert (3, array ("wow" => "wow"), $ array_2); Ambil $ array_2 dari teks pertanyaan.
Kirzilla
Saya tidak berharap itu berfungsi karena $ array_2 asosiatif dan konsep posisi umumnya tidak relevan dalam situasi seperti itu.
Peter O'Callaghan
4

Jika Anda tidak tahu bahwa Anda ingin memasukkannya di posisi # 3, tetapi Anda tahu kunci yang ingin Anda masukkan setelahnya, saya memasak fungsi kecil ini setelah melihat pertanyaan ini.

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

Berikut biola codepad untuk melihatnya beraksi: http://codepad.org/5WlKFKfz

Catatan: array_splice () akan jauh lebih efisien daripada array_merge (array_slice ()) tetapi kemudian kunci array yang Anda masukkan akan hilang. Mendesah.

Tom Auger
sumber
3

Pendekatan yang lebih bersih (berdasarkan fluiditas penggunaan dan lebih sedikit kode).

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

Pemakaian:

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

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

die(var_dump($colors));
Luka
sumber
2

Solusi paling sederhana, jika Anda ingin menyisipkan (elemen atau array) setelah kunci tertentu:

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

Jadi, jika Anda memiliki:

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

Dan jalankan:

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

Kamu akan memiliki:

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

Menggunakan array_splice bukan array_slice memberikan satu panggilan fungsi kurang.

$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);
Florent
sumber
2

Saya melakukan itu sebagai


    $slightly_damaged = array_merge(
        array_slice($slightly_damaged, 0, 4, true) + ["4" => "0.0"], 
        array_slice($slightly_damaged, 4, count($slightly_damaged) - 4, true)
    );
HacheCuatro
sumber
Memformat kode, gunakan panduan format yang disediakan dalam menu edit <3
RaisingAgent
1

Saya baru saja membuat kelas ArrayHelper yang akan membuat ini sangat mudah untuk indeks numerik.

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

    }
}

Contoh:

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

Awal $ array:

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

Hasil:

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

Ini adalah metode yang lebih baik bagaimana memasukkan item ke array pada beberapa posisi.

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;
}
Lukáš Kříž
sumber
1

Saya perlu sesuatu yang bisa melakukan penyisipan sebelum, ganti, setelah kunci; dan tambahkan di awal atau akhir array jika kunci target tidak ditemukan. Default adalah memasukkan setelah kunci.

Fungsi Baru

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

Masukkan kode

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

Keluaran

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
)
mikeytown2
sumber
1

Jawaban 2 string yang sangat sederhana untuk pertanyaan Anda:

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

Pada awalnya Anda memasukkan apa pun ke elemen ketiga Anda dengan array_splice dan kemudian menetapkan nilai ke elemen ini:

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

Ini adalah pertanyaan lama, tetapi saya mengirim komentar pada tahun 2014 dan sering kembali ke sini. Saya pikir saya akan meninggalkan jawaban penuh. Ini bukan solusi terpendek tetapi cukup mudah dimengerti.

Masukkan nilai baru ke dalam array asosiatif, pada posisi bernomor, menjaga kunci, dan menjaga pesanan.

$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 
)
*/
Radley Sustaire
sumber
0

Tidak konkret jawaban Artefacto, tetapi berdasarkan sarannya menggunakan array_slice (), saya menulis fungsi selanjutnya:

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

Fitur:

  • Memasukkan satu atau beberapa nilai
  • Memasukkan pasangan nilai kunci
  • Memasukkan sebelum / sesudah tombol, atau dengan offset

Contoh penggunaan:

$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)); 
mikl
sumber
0

Jika Anda hanya ingin memasukkan item ke dalam array pada posisi tertentu (berdasarkan jawaban @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;
}
Samuel Delesque
sumber
0

Ini versi saya:

/**
 * 
 * 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;
}
beta-pengembang
sumber
0

cara mudah .. menggunakan 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);

Hasil..

Array
(
    [0] => zero
    [1] => one
    [2] => two
    [3] => sample_value
    [4] => three
)
Omair
sumber
2
Ini tidak menambahkan apa pun ke semua komentar dan jawaban lainnya
j08691
0

Ini adalah solusi lain di 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)
        );
    }
sergeliatko
sumber
-1

Anda dapat menyisipkan elemen selama loop foreach , karena loop ini bekerja pada salinan array asli, tetapi Anda harus melacak jumlah baris yang dimasukkan (saya menyebutnya "mengasapi" dalam kode ini):

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

Jelas, Anda dapat menggeneralisasi ide "mengasapi" ini untuk menangani penyisipan dan penghapusan sewenang-wenang selama loop foreach.

David Spector
sumber