Jawaban:
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.
$inserted
array.
(array)$scalar
setara 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 / ...
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',
),
)
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 ...
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);
}
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;
}
insertBefore()
, Anda harus kembali $tmpArray
bukan $input
.
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)
);
}
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);
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;
}
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.
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
jika tidak yakin, maka JANGAN GUNAKAN INI :
$arr1 = $arr1 + $arr2;
ATAU
$arr1 += $arr2;
karena dengan + array asli akan ditimpa. ( lihat sumber )
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.
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.
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
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;
}
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']);
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);
}
$src = array_merge($array_head, $ins, $array_tail);
?