合并关联数组(PHP)中重复名称(键)的值

时间:2016-08-26 16:38:08

标签: php arrays

假设我在篮子中有不同类型水果的关联数组,每个篮子中的数量('Banana'=> 50等),我需要知道每种类型的水果有多少,但是在开始生成数组的循环之前,我不知道可能的水果类型。这可能会导致重复的条目,例如:

$baskets = array(
   "Apple"=>"35", 
   "Banana"=>"37", 
   "Apple"=>"43"
);

问题A:甚至可以制作第二个“Apple”条目,还是会导致错误?

  

答案是:不可能,它将用43覆盖第一个

问题B1:假设A的答案是“可能的”,我如何合并这两个以便$篮子成为(“Apple”=>“78”,“Banana”=> “37”)?

问题B2:假设A的答案是“不可能”,我该如何确定阵列中是否已经有苹果并将数量添加到条目中而不是尝试添加它作为阵列中的新点?

即使A是“可能的”,对B2的回答显然会使B1过时。

如果B1和B2都不可能,那么还有其他一些方法可以跟踪每种水果的数量,因为我循环穿过篮子吗?

感谢所有有用的答案。

4 个答案:

答案 0 :(得分:1)

问:答:不 问:

if(isset($baskets["apple"]))
{
  $baskets["apple"] = $baskets["apple"] + VALUE
}

答案 1 :(得分:1)

您永远不会获得数组中的重复键,只能有唯一键。您只会覆盖重复水果密钥的值。

答案B:由于上述原因,您必须检查循环中是否存在生成的数组中的密钥,如果确实存在,请将新值添加到现有数据中,否则将值存储在此键。

答案B1:见答案答案。

回答B2:array_key_existsisset

算法取决于数据的存储方式。也许有一种更聪明的方式。

答案 2 :(得分:1)

  

问题A:甚至可以制作第二个" Apple"进入还是会导致错误?

不,试一试会这么难吗?

 $basket['apple']=35;
 $basket['apple']=43;
 print $basket['apple']; // the output will be 43

第二项任务会覆盖前者。

  

如何合并两个

你可以这样做:

$basket['apple']+=35;
$basket['apple']+=43;
print $basket['apple'];

问题在于,第一次引用数组中的条目时,将触发PHP警告,因为它尚不存在。虽然您应该在生产系统上禁用错误报告(但启用了错误日志记录),但这会导致性能和支持问题,因此更好的解决方案是....

function add_to($basket, $product, $amount)
{
   if (isset($basket[$product])) {
      $basket[$product]+=$amount;
   } else {
      $basket[$product]=$amount;
   }
}
add_to($basket, 'apple', 35);
add_to($basket, 'apple', 43);
print $basket['apple']; // output will be 78

答案 3 :(得分:-1)

在关联数组中,不可能有一次相同的键('Apple')。如果您循环并且遇到'Apple'两次,第二个条目将覆盖第一个:

array['Apple'] = 35
array['Banana']= 37
array['Apple' = 43

会产生一个数组:

( 'Apple' => 43, 'Banana' = 37 )

请参阅Labradorcode的正确实现答案,不要忘记将字符串值转换为整数!

编辑以详细说明他的答案

for($i = 0; i < count(list_of_fruits){
    if(!array_key_exists($fruit, $basket){
        $basket[$fruit] = 0;
    }
    $basket[$fruit] = $basket[$fruit] + (int)$num_fruits;

类似的东西