Vous pouvez trouver cela un peu plus intuitif. Il ne nécessite qu'un seul appel de fonction pour 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.
Il est étrange qu'une telle fonctionnalité de base soit en quelque sorte cachée, en ce sens que l'objectif principal de cette fonction, comme décrit dans la documentation, est quelque chose de différent (remplacer les éléments dans les tableaux). Oui, cela est indiqué dans la section des arguments, mais si vous analysez simplement les descriptions de fonction pour trouver ce qu'il faut utiliser pour insérer dans les tableaux, vous ne l'avez jamais trouvé.
Mahn
24
Je dis simplement que cela ne préservera pas les clés du $insertedtableau.
@JacerOmri c'est tout à fait raison, les deux déclarations sont valides. Vous pouvez transmettre une valeur de n'importe quel type, mais elle peut ne pas se comporter de la même manière pour un tableau, un objet ou null. Pour les scalaires, la conversion de type (array)$scalaréquivaut à array($scalar), mais pour un tableau, un objet ou null, elle sera ignorée (tableau), convertie en tableau (objet) ou devenant un tableau vide (null) - voir php.net / manual / fr /…
Lukas
2
@SunilPachlangia, adelval et autres: avec les tableaux multidimensionnels, vous devez envelopper le remplacement dans un tableau, c'est documenté. J'ai quand même apporté la note ici pour que les gens cessent de faire l'erreur.
Félix Gagnon-Grenier
47
Une fonction qui peut insérer à la fois des positions entières et des chaînes:
Le array_splice()perd les clés, alors array_merge()que non. Ainsi, les résultats de la première fonction peuvent être très surprenants ... Surtout parce que si vous avez deux éléments avec la même touche, seule la valeur de la dernière est conservée ...
Bien que plus rapide et probablement plus efficace en mémoire, cela ne convient vraiment que lorsqu'il n'est pas nécessaire de conserver les clés du tableau.
Si vous avez besoin de conserver les clés, ce qui suit serait plus approprié;
function insertBefore($input, $index, $newKey, $element){if(!array_key_exists($index, $input)){thrownewException("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)){thrownewException("Index not found");}
$tmpArray = array();foreach($input as $key => $value){
$tmpArray[$key]= $value;if($key === $index){
$tmpArray[$newKey]= $element;}}return $tmpArray;}
Cela fonctionne bien. Cependant, dans le deuxième exemple, dans votre fonction insertBefore(), vous devez retourner $tmpArrayau lieu de $input.
Christoph Fischer du
4
Basé sur @Halil une excellente réponse, voici une fonction simple pour insérer un nouvel élément après une clé spécifique, tout en préservant les clés entières:
Si vous souhaitez conserver les clés du tableau initial et également 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);}
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 une touche spécifique AVANT.
La solution de jay.lee est parfaite. Si vous souhaitez ajouter des éléments à un tableau multidimensionnel, ajoutez d'abord un tableau unidimensionnel, puis remplacez-le ensuite.
L'ajout d'un élément au même format à ce tableau ajoutera tous les nouveaux index de tableau en tant qu'éléments au lieu d'un seul é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.
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);}
Réponses:
Vous pouvez trouver cela un peu plus intuitif. Il ne nécessite qu'un seul appel de fonction pour
array_splice
:la source
$inserted
tableau.(array)$scalar
équivaut àarray($scalar)
, mais pour un tableau, un objet ou null, elle sera ignorée (tableau), convertie en tableau (objet) ou devenant un tableau vide (null) - voir php.net / manual / fr /…Une fonction qui peut insérer à la fois des positions entières et des chaînes:
Utilisation entière:
Utilisation des chaînes:
la source
array_splice()
perd les clés, alorsarray_merge()
que non. Ainsi, les résultats de la première fonction peuvent être très surprenants ... Surtout parce que si vous avez deux éléments avec la même touche, seule la valeur de la dernière est conservée ...la source
+
au lieu dearray_merge
peut conserver les clésDe cette façon, vous pouvez insérer des tableaux:
la source
Il n'y a pas de fonction PHP native (à ma connaissance) qui puisse faire exactement ce que vous avez demandé.
J'ai écrit 2 méthodes qui, selon moi, sont adaptées à l'objectif:
Bien que plus rapide et probablement plus efficace en mémoire, cela ne convient vraiment que lorsqu'il n'est pas nécessaire de conserver les clés du tableau.
Si vous avez besoin de conserver les clés, ce qui suit serait plus approprié;
la source
insertBefore()
, vous devez retourner$tmpArray
au lieu de$input
.Basé sur @Halil une excellente réponse, voici une fonction simple pour insérer un nouvel élément après une clé spécifique, tout en préservant les clés entières:
la source
Si vous souhaitez conserver les clés du tableau initial et également ajouter un tableau contenant des clés, utilisez la fonction ci-dessous:
Exemple d'appel:
la source
la source
C'est ce qui a fonctionné pour moi pour le tableau associatif:
La source de la fonction - cet article de blog . Il y a aussi une fonction pratique pour insérer une touche spécifique AVANT.
la source
C'est aussi une solution de travail:
les crédits vont à: http://binarykitten.com/php/52-php-insert-element-and-shift.html
la source
en cas de doute, alors NE PAS UTILISER CES :
OU
car avec + le tableau d'origine sera écrasé. ( voir source )
la source
La solution de jay.lee est parfaite. Si vous souhaitez ajouter des éléments à un tableau multidimensionnel, ajoutez d'abord un tableau unidimensionnel, puis remplacez-le ensuite.
L'ajout d'un élément au même format à ce tableau ajoutera tous les nouveaux index de tableau en tant qu'éléments au lieu d'un seul élément.
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.
la source
Vous pouvez utiliser ceci
la source
Normalement, avec des valeurs scalaires:
Pour insérer un seul élément de tableau dans votre tableau, n'oubliez pas d'envelopper le tableau dans un tableau (car c'était une valeur scalaire!):
sinon toutes les clés du tableau seront ajoutées pièce par pièce.
la source
Astuce pour ajouter un élément au début d'un tableau :
puis:
mais:
la source
array_unshift($a,'i am the new first element');
Essaye celui-là:
la source
Exemple d'appel:
la source
Pour insérer des éléments dans un tableau avec des clés de chaîne, vous pouvez faire quelque chose comme ceci:
la source
$src = array_merge($array_head, $ins, $array_tail);
?