[英]php array_merge associative arrays
我试图将一个项目添加到关联数组的开头。 我认为最好的方法是使用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函数会更改项目的键? 我可以阻止这样做吗? 或者还有另一种方法可以让我完成我想要做的事情,在数组的开头添加新项目吗?
来自文档 :
如果要将第二个数组中的数组元素追加到第一个数组而不覆盖第一个数组中的元素而不重新编制索引,请使用+ array union运算符
使用+
union运算符时,将保留第一个数组参数中的键,因此反转参数的顺序并使用union运算符应该可以满足您的需要:
$products = $products + array(0 => "Select a product");
就是图个好玩儿
$newArray = array_combine(array_merge(array_keys($array1),
array_keys($array2)
),
array_merge(array_values($array1),
array_values($array2)
)
);
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;
来自文档 :
带有数字键的输入数组中的值将使用从结果数组中的零开始的递增键重新编号。
你想看看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"
}
但是,如果两个数组中都存在相同的键,则它们会有所不同:+ operator不会覆盖该值,array_replace会这样做。
你可以试试像
$products[0]='Select a Product'
ksort($products);
这应该将0放在数组的开头,但它也会按照您可能不需要的数字顺序对其他产品进行排序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.