wake-up-neo.com

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

Wie kann ich ein neues Element an einer beliebigen Position in ein Array einfügen, beispielsweise in der Mitte des Arrays?

410
kusanagi

Sie finden das vielleicht etwas intuitiver. Es erfordert nur einen Funktionsaufruf nach 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 Ersetzung nur ein Element ist, ist es nicht erforderlich, array () um dieses Element herum zu setzen, es sei denn, das Element ist ein Array selbst, ein Objekt oder NULL. 

776
jay.lee

Eine Funktion, die sowohl an Integer- als auch an String-Positionen 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',
  ),
)
42
Halil Özgür
$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)
26
Amber

Es gibt keine native PHP - Funktion (die mir bekannt ist), die genau das tut, was Sie angefordert haben. 

Ich habe 2 Methoden geschrieben, von denen ich glaube, dass sie für den Zweck geeignet 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 geeignet, wenn die Schlüssel des Arrays nicht verwaltet werden müssen.

Wenn Sie die Schlüssel pflegen müssen, ist das Folgende sinnvoller.

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;
}
4
A Boy Named Su

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);
}
4
Aleksandr Makov

Wenn Sie die Schlüssel des ursprünglichen Arrays beibehalten 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);
}

Aufrufbeispiel:

$array = insertArrayAtPosition($array, array('key' => 'Value'), 3);
2
Mayra M
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;
}
1
henry wong

Basierend auf der großartigen Antwort von @Halil, gibt es hier eine einfache Funktion, um ein neues Element hinter einem bestimmten Schlüssel einzufügen.

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

Lösung von jay.lee ist perfekt. Wenn Sie einem mehrdimensionalen Array Elemente hinzufügen möchten, fügen Sie zunächst 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 Arrayindizes als Elemente anstelle von nur Elementen 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

Note: Durch das Hinzufügen von Elementen zu einem mehrdimensionalen Array mit array_splice werden alle Indizes als Elemente anstelle dieses Elements hinzugefügt.

1
Abdul Mannan

Sie können dies verwenden

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

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

1
Mike Doh

wenn Sie sich nicht sicher sind, dann DONT USE THESE:

$arr1 = $arr1 + $arr2;

OR

$arr1 += $arr2;

denn mit + wird das ursprüngliche Array überschrieben. ( siehe Quelle )

0
T.Todua
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;
}

Aufrufbeispiel:

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

Dies 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 Blogbeitrag . Es gibt auch eine praktische Funktion, um VOR einer bestimmten Taste einzufügen.

0
Oksana Romaniv

Normalerweise bei 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 packen (da dies ein Skalarwert 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.

0
mark

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
0
forsberg

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