PHP tableau fusionner les tableaux associatifs

j'essaie de préparer un élément au début d'un tableau associatif. J'ai pensé que la meilleure façon de le faire est d'utiliser array_merge, mais j'ai des conséquences étranges. Je reçois l'id et le Nom des produits à partir d'une base de données mysql, et il revient comme un tableau associatif, comme cela (pas les données réelles de revenir, mais les données de l'échantillon pour cette question qui représente ce que l'apparence des données environ):

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

c'est envoyés à un helper html pour créer un dropdown qui associe la clé à la valeur, et la valeur de l'élément du tableau est définie comme le texte dans le menu déroulant Sélectionner le contrôle. J'ai besoin de le premier élément à être quelque chose comme "s'il vous Plaît Sélectionnez" avec une clé de 0, j'ai donc 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 Ce que je voulais, c'était de 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é, cependant, je crois parce que mes clés sont ints qu'il ne traite pas le tableau comme un vrai tableau associatif, et qu'il ne les comprime pas comme illustré ci-dessus.

La question est: Pourquoi la fonction array_merge changer les clés des articles? puis-je l'empêcher de faire cela? Ou y a-t-il une autre façon pour moi d'accomplir ce que j'essaie de faire, d'ajouter le nouvel élément au début du tableau?

20
demandé sur dreftymac 2011-03-08 17:21:12

7 réponses

docs:

si vous voulez ajouter des éléments de tableau du deuxième tableau au premier tableau sans écraser les éléments du premier tableau et ne pas réindexer, utilisez l'opérateur + array union

les clés du premier argument array sont préservées en utilisant le + opérateur union, donc Inverser l'ordre de vos arguments et utiliser l'opérateur union devrait faire ce dont vous avez besoin:

$products = $products + array(0 => "Select a product");
44
répondu Mark Elliot 2011-03-08 14:22:53

Juste pour le plaisir

$newArray = array_combine(array_merge(array_keys($array1),
                                      array_keys($array2)
                                     ),
                          array_merge(array_values($array1),
                                      array_values($array2)
                                     )
                         );
6
répondu Mark Baker 2011-03-08 14:31:21

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

$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
répondu vbence 2011-03-08 14:33:09

Vous pouvez utiliser opérateur de tableau:+

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

il va faire un syndicat et ne fonctionne que lorsque les clés ne se chevauchent pas.

2
répondu Bob Fanger 2011-03-08 14:27:22

docs:

les valeurs dans le tableau d'entrée avec des clés numériques seront renumérotées avec des clés incrémentantes à partir de zéro dans le tableau résultat.

1
répondu Daniel Dinu 2011-03-08 14:24:22

Vous pouvez essayer quelque chose comme

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

Qui devrait mettre le 0 au début du tableau, mais il sera également trier les autres produits dans l'ordre numérique dont vous ne voulez pas.

0
répondu Belinda 2011-03-08 14:39:31

vous voulez regarder la fonction array_replace.

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, array_replace le fait.

0
répondu davisca 2015-03-06 10:34:51