27

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

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

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

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

结果数组如下所示:

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

当我真正想要的是不要丢失关联数组的键时。有人告诉我,您可以按照我尝试的方式正确地将 array_merge 与关联数组一起使用,但是,我相信因为我的键是整数,所以它不会将数组视为真正的关联数组,并如上图所示压缩它们。

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

4

7 回答 7

56

文档

如果要将第二个数组中的数组元素附加到第一个数组,同时不覆盖第一个数组中的元素并且不重新索引,请使用 + 数组联合运算符

使用联合运算符时会保留第一个数组参数的键+,因此颠倒参数的顺序并使用联合运算符应该可以满足您的需要:

$products = $products + array(0 => "Select a product");
于 2011-03-08T14:22:53.300 回答
6

就是图个好玩儿

$newArray = array_combine(array_merge(array_keys($array1),
                                      array_keys($array2)
                                     ),
                          array_merge(array_values($array1),
                                      array_values($array2)
                                     )
                         );
于 2011-03-08T14:31:21.390 回答
4

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

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

或者您可以手动创建结果数组:

$newproducts = array (0 => "Select a product");
foreach ($products as $key => $value)
    $newproducts[$key] = $value;
于 2011-03-08T14:33:09.783 回答
2

您可以使用数组运算符+

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

它将进行联合,并且仅在键不重叠时才有效。

于 2011-03-08T14:27:22.697 回答
1

文档

带有数字键的输入数组中的值将使用从结果数组中的零开始的递增键重新编号。

于 2011-03-08T14:24:22.340 回答
0

你可以尝试类似的东西

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

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

于 2011-03-08T14:39:31.927 回答
0

你想看看array_replace功能。

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

$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"
}

但是,如果两个数组中都存在相同的键,它们会有所不同:+ 运算符不会覆盖值,array_replace 会。

于 2015-03-06T10:28:59.267 回答