web-dev-qa-db-fra.com

Insérer un nouvel élément dans un tableau à n’importe quelle position dans PHP

Comment puis-je insérer un nouvel élément dans un tableau à n’importe quelle position, par exemple au milieu d’un tableau?

410
kusanagi

Vous trouverez peut-être cela un peu plus intuitif. Il ne nécessite qu'un seul appel de fonction à 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

Si le remplacement n'est qu'un élément, il n'est pas nécessaire de placer un tableau () à moins que cet élément ne soit lui-même un tableau, un objet ou NULL. 

776
jay.lee

Une fonction qui peut insérer des entiers et des positions de chaîne:

/**
 * @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)
        );
    }
}

Utilisation entière:

$arr = ["one", "two", "three"];
array_insert(
    $arr,
    1,
    "one-half"
);
// ->
array (
  0 => 'one',
  1 => 'one-half',
  2 => 'two',
  3 => 'three',
)

Utilisation de la chaîne:

$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

Il n’existe pas de fonction native PHP (à ma connaissance) capable de faire exactement ce que vous avez demandé. 

J'ai écrit 2 méthodes qui, à mon avis, conviennent parfaitement:

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

Bien que plus rapide et probablement plus efficace en mémoire, cela ne convient vraiment que s'il n'est pas nécessaire de conserver les clés de la matrice.

Si vous devez conserver des clés, les éléments suivants seraient plus appropriés.

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

De cette façon, vous pouvez insérer des tableaux:

function array_insert(&$array, $value, $index)
{
    return $array = array_merge(array_splice($array, max(0, $index - 1)), array($value), $array);
}
4
Aleksandr Makov

Si vous souhaitez conserver les clés du tableau initial et ajouter un tableau contenant des clés, utilisez la fonction ci-dessous:

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);
}

Exemple d'appel:

$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

Basé sur la bonne réponse de @Halil, voici comment insérer un nouvel élément après une clé spécifique, .__, tout en préservant les clés entières:

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

La solution de jay.lee est parfaite. Si vous souhaitez ajouter un ou plusieurs éléments à un tableau multidimensionnel, commencez par ajouter un tableau à une dimension, puis remplacez-le par la suite.

$original = (
[0] => Array
    (
        [title] => Speed
        [width] => 14
    )

[1] => Array
    (
        [title] => Date
        [width] => 18
    )

[2] => Array
    (
        [title] => Pineapple
        [width] => 30
     )
)

L'ajout d'un élément dans le même format à ce tableau ajoutera tous les nouveaux index de tableau sous forme d'éléments plutôt que comme élément. 

$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

Remarque: L'ajout d'éléments directement à un tableau multidimensionnel avec array_splice ajoutera tous ses index en tant qu'éléments au lieu de cet élément uniquement.

1
Abdul Mannan

Vous pouvez utiliser ceci

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

C'est aussi une solution efficace:

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

les crédits vont à: http://binarykitten.com/php/52-php-insert-element-and-shift.html

1
Mike Doh

en cas de doute, alors NE PAS UTILISER CES:

$arr1 = $arr1 + $arr2;

OR

$arr1 += $arr2;

car avec + le tableau original sera écrasé. ( voir source )

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

Exemple d'appel:

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

C'est ce qui a fonctionné pour moi pour le tableau associatif:

/*
 * 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;
}

La source de la fonction - cet article de blog . Il y a aussi une fonction pratique pour insérer AVANT clé spécifique.

0
Oksana Romaniv

Normalement, avec des valeurs scalaires:

$elements = array('foo', ...);
array_splice($array, $position, $length, $elements);

Pour insérer un seul élément de tableau dans votre tableau, n'oubliez pas d'envelopper le tableau dans un tableau (comme s'il s'agissait d'une valeur scalaire!):

$element = array('key1'=>'value1');
$elements = array($element);
array_splice($array, $position, $length, $elements);

sinon, toutes les clés du tableau seront ajoutées pièce par pièce.

0
mark

Astuce pour ajouter un élément au début d'un tableau :

$a = array('first', 'second');
$a[-1] = 'i am the new first element';

puis:

foreach($a as $aelem)
    echo $a . ' ';
//returns first, second, i am...

mais:

for ($i = -1; $i < count($a)-1; $i++)
     echo $a . ' ';
//returns i am as 1st element
0
forsberg

Essaye celui-là:

$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