php array_merge关联数组

php array_merge associative arrays

我正在尝试将一个项目前置到关联数组的开头。我想最好的方法是使用数组合并,但是我有一些奇怪的结果。我从一个MySQL数据库中获取产品的ID和名称,并将其作为一个关联数组返回,如下所示(不是返回的实际数据,而是这个问题的示例数据,它表示数据大致的样子):

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

这将被发送到HTML助手以创建一个下拉列表,该下拉列表将键与值相关联,并且数组项的值将被设置为下拉选择控件中的文本。我需要第一个项目类似于"请选择",键为0,所以我这样做了:

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

结果数组如下所示:

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

我真正想要的是不要丢失关联数组的键。有人告诉我,你可以按照我尝试的方式正确地使用数组合并,但是,我相信,因为我的键是整数,它不会将数组视为真正的关联数组,并像上面所示压缩它们。

问题是:为什么数组合并函数会更改项的键?我能阻止它这样做吗?或者有没有其他方法来完成我正在尝试的工作,在数组的开头添加新项?


从文档中:

If you want to append array elements from the second array to the first array while not overwriting the elements from the first array and not re-indexing, use the + array union operator

使用+union运算符时,保留第一个数组参数中的键,因此颠倒参数的顺序并使用union运算符应执行所需操作:

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


只是为了好玩

1
2
3
4
5
6
7
$newArray = array_combine(array_merge(array_keys($array1),
                                      array_keys($array2)
                                     ),
                          array_merge(array_values($array1),
                                      array_values($array2)
                                     )
                         );


array_merge将重新计算数字索引。因为关联数组使用数字索引,所以它们将重新编号。您可以在索引前面插入一个非数字字符,如:

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

或者可以手动创建生成的数组:

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


您可以使用数组运算符:+

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

它将进行联合,并且仅在键不重叠时才起作用。


从文档中:

Values in the input array with numeric keys will be renumbered with incrementing keys
starting from zero in the result array.


你们想看看array_replace的功能。

在本例中,它们的功能相同:

1
2
3
4
5
6
7
8
9
10
11
12
13
$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"
}

但是,如果两个数组中都存在相同的键,则它们不同:+operator不会覆盖该值,array_replace会覆盖该值。


你可以试试

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

这应该将0放在数组的开头,但它还将按您可能不需要的数字顺序对其他产品进行排序。