Fügen Sie ein neues Element in das Array an einer beliebigen Position in PHP ein

Antworten:

919

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.

jay.lee
quelle
32
Es ist seltsam, dass eine solche grundlegende Funktionalität tatsächlich irgendwie verborgen ist, da der Hauptzweck dieser Funktion, wie in der Dokumentation beschrieben, etwas anderes ist (Ersetzen von Dingen in Arrays). Ja, es wird im Abschnitt Argumente darauf hingewiesen, aber wenn Sie nur Funktionsbeschreibungen scannen, um herauszufinden, was zum Einfügen in Arrays verwendet werden soll, hätten Sie es nie gefunden.
Mahn
23
Nur zu sagen, dass dadurch keine Schlüssel im $insertedArray erhalten bleiben .
Mauris
6
Ebenfalls im PHP-Handbuch, Beispiel 1: php.net/manual/en/function.array-splice.php
marcovtwout
3
@JacerOmri es ist völlig richtig, beide Aussagen sind gültig. Sie können einen Wert eines beliebigen Typs übergeben, der sich jedoch für ein Array, ein Objekt oder null möglicherweise nicht gleich verhält. Für Skalare, Typ-casting (array)$scalarentspricht 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 /…
Lukas
2
@SunilPachlangia, adelval und andere: Bei mehrdimensionalen Arrays müssen Sie den Ersatz in ein Array einbinden, es ist dokumentiert. Ich habe die Notiz immer noch hierher gebracht, damit die Leute aufhören, den Fehler zu machen.
Félix Gagnon-Grenier
47

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',
  ),
)
Halil Özgür
quelle
1
Der 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 ...
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)
Bernstein
quelle
10
Verwenden +anstelle von array_mergekann Schlüssel bewahren
Mauris
1
Jetzt kann ich weitere Elemente vor einem INDEX hinzufügen
Abbas
5

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);
}
Aleksandr Makov
quelle
2
Diese Funktion speichert die Reihenfolge nicht im Array.
Daniel Petrovaliev
5

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;
}
Ein Junge namens Su
quelle
1
Das funktioniert gut. Doch im zweiten Beispiel, in Ihrer Funktion insertBefore(), sollten Sie zurückkommen $tmpArraystatt $input.
Christoph Fischer
4

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)
    );
} 
d.raev
quelle
4

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);
Mayra M.
quelle
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;
}
Henry Wong
quelle
3

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.

Oksana Romaniv
quelle
2

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

Mike Doh
quelle
2

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 .

Abdul Mannan
quelle
2

Sie können dies verwenden

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

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.

Kennzeichen
quelle
1

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
Forsberg
quelle
13
Hinweis zum Hinzufügen eines Elements am Anfang:array_unshift($a,'i am the new first element');
1

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 )

T.Todua
quelle
1

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

Beispiel aufrufen:

$array = array_insert($array, 1, ['123', 'abc']);
xayer
quelle
0

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); 
} 
Bryan Plasters
quelle
2
warum nicht $src = array_merge($array_head, $ins, $array_tail);?
Cartbeforehorse