Insérer un nouvel élément dans le tableau sur n'importe quelle position en PHP

Comment puis-je insérer un nouvel élément dans un tableau sur n'importe quelle position, par exemple au milieu du tableau?

389
demandé sur MC Emperor 2010-09-26 13:39:22

17 réponses

Vous pouvez trouver cela un peu plus intuitif. Il ne nécessite qu'un 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 mettre array() autour de lui, sauf si l'élément est un tableau lui-même, un objet ou NULL.

740
répondu jay.lee 2018-07-17 16:07:01

Une fonction qui peut insérer à la fois des positions entières et des chaînes:

/**
 * @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',
  ),
)
38
répondu Halil Özgür 2015-10-20 17:40:05
$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)
24
répondu Amber 2015-12-25 16:11:35

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
répondu Aleksandr Makov 2012-10-05 08:31:09

Il N'y a pas de fonction PHP native (dont je suis conscient) qui puisse faire exactement ce que vous avez demandé.

J'ai écrit 2 méthodes que je crois adaptées à mon but:

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 lorsqu'il n'est pas nécessaire de maintenir les clés du tableau.

Si vous avez besoin de maintenir des clés, ce qui suit serait plus approprié;

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
répondu A Boy Named Su 2013-08-12 12:16:13
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
répondu henry wong 2013-03-06 09:47:57

C'est aussi une solution de travail:

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

Crédits aller à: http://binarykitten.com/php/52-php-insert-element-and-shift.html

1
répondu Mike Doh 2014-01-09 17:25:40

Basé sur @Halil grande réponse, Voici une fonction simple 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
répondu d.raev 2014-10-23 04:46:36

Vous pouvez utiliser ceci

foreach ($array as $key => $value) 
{
    if($key==1)
    {
        $new_array[]=$other_array;
    }   
    $new_array[]=$value;    
}
1
répondu Parkhya developer 2017-02-25 09:24:36

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);
1
répondu Mayra M 2018-04-27 10:05:23

Normalement, avec des valeurs scalaires:

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

Pour insérer un élément de tableau unique dans votre tableau n'oubliez pas d'envelopper le tableau dans un tableau (comme c'était 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
répondu mark 2012-11-25 21:18:43

Astuce pour l'ajout d'un élément de , 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
répondu forsberg 2013-03-06 16:22:22

Si vous n'êtes pas sûr, alors N'utilisez pas ces :

$arr1 = $arr1 + $arr2;

Ou

$arr1 += $arr2;

Parce qu'avec + le tableau d'origine sera écrasé. ( Voir source)

0
répondu T.Todua 2017-05-23 12:03:08

Essayez celui-ci:

$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
répondu Max 2016-03-24 22:03:01

Solution par jay.lee est parfait. Si vous souhaitez ajouter des éléments à un tableau multidimensionnel, ajoutez d'abord un tableau unidimensionnel, 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 en tant qu'éléments au lieu de simplement item.

$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: Ajouter des éléments directement à un tableau multidimensionnel avec array_splice ajoutera tous ses index en tant qu'éléments au lieu de cet élément.

0
répondu Abdul Mannan 2016-10-20 10:56:22

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 - ce blog . Il y a aussi une fonction pratique à insérer avant une clé spécifique.

0
répondu Oksana Romaniv 2018-08-16 09:34:07

Pour insérer des éléments dans un tableau avec des clés de chaîne, vous pouvez faire quelque chose comme ceci:

/* 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); 
} 
-1
répondu Bryan Plasters 2012-05-08 16:16:59