Câu trả lời:
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.
$inserted
mảng.
(array)$scalar
tươ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 /
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',
),
)
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ữ ...
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);
}
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;
}
insertBefore()
, bạn nên quay lại $tmpArray
thay vì $input
.
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)
);
}
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);
Đâ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ể.
Đâ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
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 đó.
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.
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
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;
}
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']);
Để 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);
}
$src = array_merge($array_head, $ins, $array_tail);
?