php array 关联数组,php 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'

);

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

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

数组合并()也有同样的问题。我不确定这是一个bug,还是我们试图以一种意想不到的方式使用它。解决方案,只需运行一个快速foreach循环并重建数组。从$myarray=array开始(0=>'选择产品');

从文档中:

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运算符应执行所需操作:

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

但这不会将"选择产品"附加到数组的末尾吗?

@鲍勃:这是一个合并,不是附加;无论哪种方式,联合运算符都保留键,只要$products中没有键0,那么联合之后就有了。

我正在尝试$products=array(0=>"选择产品")+$products;测试…它起作用了,谢谢。有很多不同的方法和方法来操纵光线,这会让人困惑。

只是为了好玩

太棒了!:)

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;

我明白了很多,我尝试的其中一个方法是将键转换为字符串,所以我使用"1"而不是"1",但它仍然将其视为一个数字int,PHP类型的弱点是我需要从C背景中适应的,它的类型更为强大。

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

$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的功能。

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

$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放在数组的开头,但它还将按您可能不需要的数字顺序对其他产品进行排序。

是的,客户希望它以某种混乱的任意顺序出现,而在原始应用程序中,选项是硬编码的,所以当他们添加新产品时,以前的开发人员必须将它们添加到中,我绝对拒绝这样做,所以我只是在产品编辑屏幕上添加了一个排序顺序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值