210 votes

Comment insérer un élément dans un tableau à une position spécifique ?

Imaginons que nous ayons deux tableaux :

$array_1 = array(
  '0' => 'zero',
  '1' => 'one',
  '2' => 'two',
  '3' => 'three',
);

$array_2 = array(
  'zero'  => '0',
  'one'   => '1',
  'two'   => '2',
  'three' => '3',
);

Maintenant, je voudrais insérer array('sample_key' => 'sample_value') après le troisième élément de chaque tableau. Comment puis-je le faire ?

0 votes

238voto

Artefacto Points 50896

array_slice() peut être utilisé pour extraire des parties du tableau, et l'union opérateur de tableau ( + ) peut recombiner les parties.

$res = array_slice($array, 0, 3, true) +
    array("my_key" => "my_value") +
    array_slice($array, 3, count($array)-3, true);

Cet exemple :

$array = array(
  'zero'  => '0',
  'one'   => '1',
  'two'   => '2',
  'three' => '3',
);
$res = array_slice($array, 0, 3, true) +
    array("my_key" => "my_value") +
    array_slice($array, 3, count($array) - 1, true) ;
print_r($res);

donne :

Array
(
    \[zero\] => 0
    \[one\] => 1
    \[two\] => 2
    \[my\_key\] => my\_value
    \[three\] => 3
)

0 votes

C'est également un bon point, mais il devrait être placé dans une fonction séparée.

9 votes

Vous devriez utiliser array_splice() comme le suggère M42. Elle résout le problème en une seule ligne de code.

33 votes

+ ne doit pas être utilisé ! Utilisez array_merge à la place ! BEcause si les indices sont entiers (tableau normal, pas de hachage), +

118voto

M42 Points 31888

Pour votre premier tableau, utilisez array_splice() :

$array_1 = array(
  '0' => 'zero',
  '1' => 'one',
  '2' => 'two',
  '3' => 'three',
);

array_splice($array_1, 3, 0, 'more');
print_r($array_1);

sortie :

Array(
    [0] => zero
    [1] => one
    [2] => two
    [3] => more
    [4] => three
)

pour le second, il n'y a pas d'ordre, donc il suffit de faire :

$array_2['more'] = '2.5';
print_r($array_2);

Et triez les clés par ce que vous voulez.

35 votes

Le deuxième tableau a un ordre... Tous les tableaux en ont un, car ce sont aussi des listes doublement liées.

0 votes

@M42 Quand vous traversez une foreach boucle, le tableau a certainement un ordre. Cela peut être significatif ou non, en fonction de votre objectif final. (Je suis tombé sur ce fil de discussion parce que dans mon cas, l'ordre EST significatif). Il est très frustrant de constater qu'il n'existe pas d'option de type array_splice() pour les tableaux associatifs.

6 votes

-1, comme mentionné "il n'y a pas d'ordre" est faux. De plus, array_splice détruit l'association clé/valeur dans le premier exemple (mais peut-être que le PO l'a voulu ainsi).

21voto

clausvdb Points 226

Code :

function insertValueAtPosition($arr, $insertedArray, $position) {
    $i = 0;
    $new_array=[];
    foreach ($arr as $key => $value) {
        if ($i == $position) {
            foreach ($insertedArray as $ikey => $ivalue) {
                $new_array[$ikey] = $ivalue;
            }
        }
        $new_array[$key] = $value;
        $i++;
    }
    return $new_array;
}

exemple :

$array        = ["A"=8, "K"=>3];
$insert_array = ["D"= 9];

insertValueAtPosition($array, $insert_array, $position=2);
// result ====> ["A"=>8,  "D"=>9,  "K"=>3];

Ça n'a peut-être pas l'air parfait, mais ça marche.

13 votes

Vous essayez en fait de faire une épissure, ne réinventez pas la roue.

11 votes

Non, il ne réinvente pas la roue. array_splice() ne permet pas de mettre clé et valeur. Seule la valeur avec une position spécifique comme clé.

1 votes

Oui, mais comme remarqué auparavant, array_splice ne supporte pas les tableaux associatifs. Je serais plus qu'heureux de voir une approche plus élégante.

14voto

Joraid Points 901

Voici une fonction simple que vous pouvez utiliser. Il suffit de la brancher et de la jouer.

Il s'agit d'une insertion par index, et non par valeur.

vous pouvez choisir de passer le tableau, ou d'en utiliser un que vous avez déjà déclaré.

EDIT : Version abrégée :

   function insert($array, $index, $val)
   {
       $size = count($array); //because I am going to use this more than one time
       if (!is_int($index) || $index < 0 || $index > $size)
       {
           return -1;
       }
       else
       {
           $temp   = array_slice($array, 0, $index);
           $temp[] = $val;
           return array_merge($temp, array_slice($array, $index, $size));
       }
   }

  function insert($array, $index, $val) { //function decleration
    $temp = array(); // this temp array will hold the value 
    $size = count($array); //because I am going to use this more than one time
    // Validation -- validate if index value is proper (you can omit this part)       
        if (!is_int($index) || $index < 0 || $index > $size) {
            echo "Error: Wrong index at Insert. Index: " . $index . " Current Size: " . $size;
            echo "<br/>";
            return false;
        }    
    //here is the actual insertion code
    //slice part of the array from 0 to insertion index
    $temp = array_slice($array, 0, $index);//e.g index=5, then slice will result elements [0-4]
    //add the value at the end of the temp array// at the insertion index e.g 5
    array_push($temp, $val);
    //reconnect the remaining part of the array to the current temp
    $temp = array_merge($temp, array_slice($array, $index, $size)); 
    $array = $temp;//swap// no need for this if you pass the array cuz you can simply return $temp, but, if u r using a class array for example, this is useful. 

     return $array; // you can return $temp instead if you don't use class array
}

Maintenant vous pouvez tester le code en utilisant

//1
$result = insert(array(1,2,3,4,5),0, 0);
echo "<pre>";
echo "<br/>";
print_r($result);
echo "</pre>";
//2
$result = insert(array(1,2,3,4,5),2, "a");
echo "<pre>";
print_r($result);
echo "</pre>";
//3
$result = insert(array(1,2,3,4,5) ,4, "b");
echo "<pre>";
print_r($result);
echo "</pre>";
//4
$result = insert(array(1,2,3,4,5),5, 6);
echo "<pre>";
echo "<br/>";
print_r($result);
echo "</pre>";

Et le résultat est :

//1
Array
(
    [0] => 0
    [1] => 1
    [2] => 2
    [3] => 3
    [4] => 4
    [5] => 5
)
//2
Array
(
    [0] => 1
    [1] => 2
    [2] => a
    [3] => 3
    [4] => 4
    [5] => 5
)
//3
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => b
    [5] => 5
)

//4
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
)

12voto

foued611 Points 123
$list = array(
'Tunisia' => 'Tunis',
'Germany' => 'Berlin',
'Italy' => 'Rom',
'Egypt' => 'Cairo'
);
$afterIndex = 2;
$newVal= array('Palestine' => 'Jerusalem');

$newList = array_merge(array_slice($list,0,$afterIndex+1), $newVal,array_slice($list,$afterIndex+1));

0 votes

Juste une mention : au lieu de array_merge, on peut aussi utiliser + entre les tableaux de nos jours.

0 votes

@roelleor Mais faites attention : " Si les tableaux d'entrée ont les mêmes clés de type chaîne, alors la dernière valeur de cette clé écrasera la précédente. Si, toutefois, les tableaux contiennent des clés numériques, la valeur ultérieure n'écrasera pas la valeur originale, mais sera ajoutée." - matrice_fusion

0 votes

Merci ! C'est la seule réponse qui a fonctionné pour moi en considérant les tableaux associatifs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X