Antworten:
Möglicherweise finden Sie dies etwas intuitiver. Es ist nur ein Funktionsaufruf erforderlich, um 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
Wenn das Ersetzen nur ein Element ist, ist es nicht erforderlich, array () darum zu setzen, es sei denn, das Element ist ein Array selbst, ein Objekt oder NULL.
$inserted
Array erhalten bleiben .
(array)$scalar
entspricht array($scalar)
, aber für ein Array, ein Objekt oder null, so wird er ignoriert (Array), Konvertieren zu einem Array (Objekt), oder wird , ein leeres Feld (null) - siehe php.net / manual / de /…
Eine Funktion, die sowohl an Ganzzahl- als auch an Zeichenfolgenpositionen eingefügt werden kann:
/**
* @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)
);
}
}
Ganzzahlige Verwendung:
$arr = ["one", "two", "three"];
array_insert(
$arr,
1,
"one-half"
);
// ->
array (
0 => 'one',
1 => 'one-half',
2 => 'two',
3 => 'three',
)
String-Verwendung:
$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()
verliert die Schlüssel, array_merge()
der nicht. Die Ergebnisse der ersten Funktion können also sehr überraschend sein ... Vor allem, wenn Sie zwei Elemente mit demselben Schlüssel haben, wird nur der Wert des letzten beibehalten ...
Auf diese Weise können Sie Arrays einfügen:
function array_insert(&$array, $value, $index)
{
return $array = array_merge(array_splice($array, max(0, $index - 1)), array($value), $array);
}
Es gibt keine native PHP-Funktion (die mir bekannt ist), die genau das kann, was Sie angefordert haben.
Ich habe zwei Methoden geschrieben, die meiner Meinung nach zweckmäßig sind:
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;
}
Dies ist zwar schneller und wahrscheinlich speichereffizienter, aber nur dann wirklich geeignet, wenn die Schlüssel des Arrays nicht gewartet werden müssen.
Wenn Sie Schlüssel pflegen müssen, ist Folgendes besser geeignet.
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()
, sollten Sie zurückkommen $tmpArray
statt $input
.
Basierend auf der großartigen Antwort von @Halil finden Sie hier eine einfache Funktion zum Einfügen eines neuen Elements nach einem bestimmten Schlüssel unter Beibehaltung ganzzahliger Schlüssel:
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)
);
}
Wenn Sie die Schlüssel des ursprünglichen Arrays behalten und auch ein Array mit Schlüsseln hinzufügen möchten, verwenden Sie die folgende Funktion:
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);
}
Beispiel aufrufen:
$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;
}
Das hat bei mir für das assoziative Array funktioniert:
/*
* 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;
}
Die Funktionsquelle - dieser Blog-Beitrag . Es gibt auch eine praktische Funktion zum Einfügen VOR einer bestimmten Taste.
Dies ist auch eine funktionierende Lösung:
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;
}
Credits gehen an: http://binarykitten.com/php/52-php-insert-element-and-shift.html
Die Lösung von jay.lee ist perfekt. Wenn Sie einem mehrdimensionalen Array Elemente hinzufügen möchten, fügen Sie zuerst ein eindimensionales Array hinzu und ersetzen Sie es anschließend.
$original = (
[0] => Array
(
[title] => Speed
[width] => 14
)
[1] => Array
(
[title] => Date
[width] => 18
)
[2] => Array
(
[title] => Pineapple
[width] => 30
)
)
Durch Hinzufügen eines Elements im gleichen Format zu diesem Array werden alle neuen Array-Indizes als Elemente anstatt nur als Element hinzugefügt.
$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
Hinweis: Wenn Sie Elemente mit array_splice direkt zu einem mehrdimensionalen Array hinzufügen, werden alle Indizes als Elemente anstelle nur dieses Elements hinzugefügt .
Normalerweise mit skalaren Werten:
$elements = array('foo', ...);
array_splice($array, $position, $length, $elements);
Um ein einzelnes Array-Element in Ihr Array einzufügen, vergessen Sie nicht, das Array in ein Array zu verpacken (da es ein skalarer Wert war!):
$element = array('key1'=>'value1');
$elements = array($element);
array_splice($array, $position, $length, $elements);
Andernfalls werden alle Schlüssel des Arrays Stück für Stück hinzugefügt.
Hinweis zum Hinzufügen eines Elements am Anfang eines Arrays :
$a = array('first', 'second');
$a[-1] = 'i am the new first element';
dann:
foreach($a as $aelem)
echo $a . ' ';
//returns first, second, i am...
aber:
for ($i = -1; $i < count($a)-1; $i++)
echo $a . ' ';
//returns i am as 1st element
Wenn Sie sich nicht sicher sind, VERWENDEN SIE DIESE NICHT :
$arr1 = $arr1 + $arr2;
ODER
$arr1 += $arr2;
denn mit + wird das ursprüngliche Array überschrieben. ( siehe Quelle )
Probier diese:
$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;
}
Beispiel aufrufen:
$array = array_insert($array, 1, ['123', 'abc']);
Zum Einfügen von Elementen in ein Array mit Zeichenfolgenschlüsseln haben Sie folgende Möglichkeiten:
/* 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);
?