php array_merge关联数组

ste*_*yer 23 php associative-array array-merge

我试图将一个项目添加到关联数组的开头.我认为最好的方法是使用array_merge,但我有一些奇怪的后果.我从mysql数据库中获取了产品的id和名称,并将其作为关联数组返回,如此(不是实际数据返回,而是此问题的示例数据,表示数据的大致外观):

$products = array (1 => 'Product 1', 42 => 'Product 42', 100 => 'Product 100');
Run Code Online (Sandbox Code Playgroud)

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

$products = array_merge(array(0 => "Select a product" ), $products);
Run Code Online (Sandbox Code Playgroud)

结果数组如下所示:

array(
  0 => 'Select a product', 
  1 => 'Product 1', 
  2 => 'Product 42', 
  3 => 'Product 100' 
);
Run Code Online (Sandbox Code Playgroud)

当我真正想要的是不丢失关联数组的键.有人告诉我,你可以适当地在我尝试的方式使用array_merge与关联数组,但是,我相信,因为我的键是整数,它不是处理数组作为一个真正的关联数组,并如上图所示对其进行压缩.

问题是:为什么array_merge函数会更改项目的键?我可以阻止这样做吗?或者还有另一种方法可以让我完成我想要做的事情,在数组的开头添加新项目吗?

Mar*_*iot 50

来自文档:

如果要将第二个数组中的数组元素追加到第一个数组而不覆盖第一个数组中的元素而不重新编制索引,请使用+ array union运算符

使用+union运算符时,第一个数组参数的键被保留,因此反转参数的顺序并使用union运算符应该可以满足您的需要:

$products = $products + array(0 => "Select a product");
Run Code Online (Sandbox Code Playgroud)


Mar*_*ker 6

就是图个好玩儿

$newArray = array_combine(array_merge(array_keys($array1),
                                      array_keys($array2)
                                     ),
                          array_merge(array_values($array1),
                                      array_values($array2)
                                     )
                         );
Run Code Online (Sandbox Code Playgroud)