【问题标题】:php array_merge associative arraysphp array_merge 关联数组
【发布时间】:2011-07-11 03:53:05
【问题描述】:

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

$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 与关联数组一起使用,但是,我相信因为我的键是 ints 它不会将数组视为真正的关联数组并压缩它们如上图所示。

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

【问题讨论】:

  • 我遇到了与 array_merge() 完全相同的问题。我不确定这是否是一个错误,或者我们正试图以一种无意的方式使用它。解决方案,只需运行一个快速的 foreach 循环并重建您的数组。以 $myarray = array(0 => 'Select a product'); 开头

标签: php associative-array array-merge


【解决方案1】:

来自docs

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

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

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

【讨论】:

  • 但这不会将“选择产品”附加到数组的末尾吗?
  • @Bob:这是合并,而不是追加;无论哪种方式,联合运算符都会保留密钥,因此只要在 $products 中没有密钥 0,那么联合之后就会有。
  • 我正在尝试 $products = array(0 => "Select a product") + $products;测试...它工作,谢谢。有很多不同的方法和方式来操作数组,让人感到困惑。
【解决方案2】:

只是为了好玩

$newArray = array_combine(array_merge(array_keys($array1),
                                      array_keys($array2)
                                     ),
                          array_merge(array_values($array1),
                                      array_values($array2)
                                     )
                         );

【讨论】:

    【解决方案3】:

    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 背景,具有更强大的类型。
    【解决方案4】:

    你可以使用array operator:+

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

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

    【讨论】:

    • 是的,这就是解决方案,但其他人先发布了它。但我仍然赞成它,我不知道 + 运算符可以这样使用,谢谢你的回答。
    【解决方案5】:

    来自docs

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

    【讨论】:

      【解决方案6】:

      你可以试试

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

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

      【讨论】:

      • 是的,客户希望它以某种混乱的任意顺序,
      【解决方案7】:

      你想看看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 会。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-31
        • 2016-10-07
        相关资源
        最近更新 更多