web-dev-qa-db-fra.com

tableaux associatifs php array_merge

J'essaie d'ajouter un élément au début d'un tableau associatif. J'ai pensé que la meilleure façon de faire est d'utiliser array_merge, mais j'ai des conséquences étranges. J'obtiens l'ID et le nom des produits d'une base de données mysql, et il est renvoyé sous la forme d'un tableau associatif, comme ceci (pas les données qui reviennent, mais des exemples de données pour cette question qui représente approximativement les données):

$products = array (1 => 'Product 1', 42 => 'Product 42', 100 => 'Product 100');

ceci est envoyé à un assistant html pour créer un menu déroulant associant la clé à la valeur et la valeur de l'élément de tableau est définie comme texte dans le contrôle de sélection déroulant. J'ai besoin que le premier élément soit quelque chose comme "S'il vous plaît sélectionner" avec une clé de 0, alors j'ai fait ceci:

$products = array_merge(array(0 => "Select a product" ), $products);

Le tableau résultant ressemble à ceci:

array(
  0 => 'Select a product', 
  1 => 'Product 1', 
  2 => 'Product 42', 
  3 => 'Product 100' 
);

quand je voulais vraiment ne pas perdre les clés du tableau associatif. On m'a dit que vous pouvez utiliser correctement array_merge avec des tableaux associatifs de la manière que j'ai essayée. Cependant, je pense que mes clés sont ints qu'il ne traite pas le tableau comme un véritable tableau associatif et qu'il est compressé comme illustré ci-dessus. . 

La question qui se pose est la suivante: pourquoi la fonction array_merge modifie-t-elle les clés des éléments? puis-je l'empêcher de faire cela? OR y a-t-il un autre moyen pour moi d'accomplir ce que j'essaie de faire, d'ajouter le nouvel élément au début du tableau?

21
stephenbayer

De la docs :

Si vous souhaitez ajouter des éléments de tableau du deuxième tableau au premier tableau sans écraser les éléments du premier tableau ni la réindexation, utilisez l'opérateur d'union + array.

Les clés du premier argument de tableau sont conservées lors de l'utilisation de l'opérateur d'union +. Inverser l'ordre de vos arguments et utiliser l'union devraient donc répondre à vos besoins:

$products = $products + array(0 => "Select a product");
47
Mark Elliot

Juste pour le plaisir

$newArray = array_combine(array_merge(array_keys($array1),
                                      array_keys($array2)
                                     ),
                          array_merge(array_values($array1),
                                      array_values($array2)
                                     )
                         );
6
Mark Baker

array_merge recalculera les index numériques. Parce que votre tableau associatif utilise des index numériques, ils seront renumérotés. Vous pouvez soit insérer un charadter non numérique devant les index tels que:

$products = array ('_1' => 'Product 1', '_42' => 'Product 42', '_100' => 'Product 100');

Ou vous pouvez créer le tableau résultant manuellement:

$newproducts = array (0 => "Select a product");
foreach ($products as $key => $value)
    $newproducts[$key] = $value;
4
vbence

Vous pouvez utiliser opérateur de tableau : + 

$products = array(0 => "Select a product" ) + $products;

cela fera une union et ne fonctionnera que si les clés ne se chevauchent pas.

2
Bob Fanger

De la docs

Les valeurs dans le tableau d'entrée avec les touches numériques seront renumérotées avec les touches d'incrémentation À partir de zéro dans le tableau de résultats.

1
Daniel Dinu

Vous pouvez essayer quelque chose comme 

$products[0]='Select a Product'
ksort($products);

Cela devrait mettre le 0 au début du tableau, mais il va également trier les autres produits par ordre numérique, ce que vous ne voudrez peut-être pas.

0
Belinda

Vous voulez regarder array_replace function.

Dans cet exemple, ils ont la même fonction:

$products1 = array (1 => 'Product 1', 42 => 'Product 42', 100 => 'Product 100');
$products2 = array (0 => 'Select a product');

$result1 = array_replace($products1, $products2);
$result2 = $products1 + $products2;

Result for both result1 and result2: Keys are preserved:
array(4) {
  [1] => string(9) "Product 1"
  [42] => string(10) "Product 42"
  [100] => string(11) "Product 100"
  [0] => string(16) "Select a product"
}

Cependant, ils diffèrent si la même clé est présente dans les deux tableaux: l'opérateur + n'écrase pas la valeur, mais array_replace le fait.

0
davisca