2017-10-10 53 views
-1

我有2个阵列中PHP7:PHP7:联合两个阵列,其中一个是键,第二个是值(整数),总和值重复键

$Array1 = ["bus","bus","int"]; 
$Array2 = [2,18,10]; 

其中$数组1是和$ ARRAY2对于每个索引是
我需要将重复键的两个值和总和相加,例如得到以下输出:

$Array3 = ["bus" => 20, "int" => 10]; 

谢谢!

+0

如果没有重复键,那么你可以使用['array_combine()'](HTTP:// PHP。净/手动/ EN/function.array-combine.php)。如果有重复键,那么['array_map()'](http://php.net/manual/en/function.array-map.php)是一个可能的解决方案。在这两种情况下,一个普通的'foreach'循环都可以完成这项工作。你尝试过什么吗? – axiac

回答

1

您需要的代码就这么简单:

// The input arrays 
$Array1 = ['bus', 'bus', 'int']; 
$Array2 = [2, 18, 10]; 

// Build the result here 
$Array3 = []; 

// There is no validation, the code assumes that $Array2 contains 
// the same number of items as $Array1 or more 
foreach ($Array1 as $index => $key) { 
    // If the key $key was not encountered yet then add it to the result 
    if (! array_key_exists($key, $Array3)) { 
     $Array3[$key] = 0; 
    } 

    // Add the value associate with $key to the sum in the results array 
    $Array3[$key] += $Array2[$index]; 
} 

print_r($Array3); 

其输出:

Array 
(
    [bus] => 20 
    [int] => 10 
) 
+0

谢谢Axiac,这正是我一直在寻找的!完善! – Aleksey

-1

我会做到的。我希望它对你有所帮助:你可以通过使用一个额外的数组来获得你需要的输出,首先,计算你的数组元素,这是你的条件。这个简单的检查

$Array1[$x] == $Array1[$x+1] 

将检查数组连续地址是否有相同的值。 (条件是阵列必须被排序),

,另一个值是这样的:

$arr[$Array1[$x]] // assign a key 

这是用于使得副阵列:

$Array1 = ["bus","bus","int"]; 
$Array2 = [2,18,10]; 

$arr = []; 

for ($x = 0; $x < count($Array1); $x++) { 
    if($Array1[$x] == $Array1[$x+1]) 
    { 
     $arr[$Array1[$x]] = $Array2[$x] + $Array2[$x+1]; 
     $x++; 
    } 
    else 
    { 
    $arr[$Array1[$x]] = $Array2[$x]; 
    } 

} 

输出为:

Array ([bus] => 20 [int] => 10) 
+0

感谢您使用此代码段,这可能会提供一些即时帮助。通过说明为什么这是一个很好的解决方案的问题,可以大大提高(https://meta.stackexchange.com/q/114762)其教育价值,并且可以使未来的读者更加有用,但不完全相同的问题。请编辑您的答案以添加解释,并指出适用的限制和假设。 – GrumpyCrouton

+0

只有相同的密钥彼此相邻时,此代码才有效。 '$ Array1 [$ x + 1]'在循环的最后一次迭代中不是有效的索引。 – SirDarius

+0

数组必须排序 –

0

这一个可以工作:

$Array1 = ['bus', 'bus', 'int']; 
$Array2 = [2, 18, 10]; 

# Let $Array3 be the required results array. 
$Array3 = []; 
for($j = 0; $j < count($Array1); $j += 1){ 
    $k = $Array1[$j]; 
    /*If the key already exists in $Array3 , add to it the value in the present key, 
    else just enter it as a new element. */ 
if(array_key_exists($k,$Array3)){ $Array3[$k] = $Array3[$k] + $Array2[$j];} 
    else { 
# But first check that the length of $Array2 is not exceeded 
    if($j <= count($Array2)){ 
    $Array3[$k] = $Array2[$j]; 
      } 
     } 
} 

print_r($Array3); 

     # gives: Array ([bus] => 20 [int] => 10) 
+0

嗨,约翰,非常感谢您的及时答复!在我的情况下,默认情况下Array1和Array2的长度相同,所以我使用@axiac中的代码,但是您的解决方案完美无缺。特别是当需要长度验证时。非常感谢你。 – Aleksey

相关问题