php 循环Map不同大小的平面阵列并对值求和

whitzsjs  于 2023-01-08  发布在  PHP
关注(0)|答案(4)|浏览(141)

我遇到了需要合并的两个数组的问题,其中第一个数组包含活动名称(page_data)的列表,如

[
    "Campaign 1",
    "Campaign 2",
    "Campaign 3"
]

另一个数组包含营销活动的潜在客户数量。但此数组包含的键数是营销活动数组的两倍,如下所示:

[
    222,
    342,
    71,
    33,
    43,
    665
]

它包含两倍的关键字,因为它将从两种不同的形式获取销售线索,因此key 0key 3的值将用于市场活动1,key 2key 4将用于市场活动2。它将始终如此。如果有5个市场活动,销售线索数组将有10个关键字,key 0key 5将用于市场活动1。活动2的key 1key 6等。
然后我有这段代码要合并(推送):

foreach (json_decode($result) as $key) {                                           
   foreach ($pages["page_data"] as $p => $pvalue) {
       array_push(
           $leadArray,
           array(
               "pageName" => $pvalue["form_name"],
               "pageLeads" => $key[$p]
           )
       );              
    }        
}

这将错误地生成如下所示的数组:

[
    "campaign 1" => 222, 
    "campaign 2" => 342, 
    "campaign 3" => 71
]

但这只需要0,1,2键,所以3,4,5键不在数组中。
我想要的是要组合的导联阵列中的键0和键3、键1和键4等,这样新的导联阵列将是

[
    255,
    386,
    736
]

然后,我可以将其与campaigns数组合并,因为两个数组中的键数现在将匹配,这将给予一个如下所示的数组

[
    "campaign 1" => 255, 
    "campaign 2" => 386, 
    "campaign 3" => 736
]
ztyzrc3y

ztyzrc3y1#

使用array_chunk函数来分割第二个数组,这样求和就很容易了。
当你使用这个函数时,你的数组将被拆分成两个数组。在第一个数组中你将有值0,1,2,而在第二个数组中你将有值3,4,5。现在通过使用键来遍历你的第一个数组,你将可以访问值对:0-3 1-4 2-5
验证代码:

<?php

$array1 = [0 => "Campaign 1", 1 => "Campaign 2", 2 => "Campaign 3"];
$array2 = [0 => 222, 1 => 342, 2 => 71, 3 => 33, 4 => 43, 5 => 665];

$chunkedArray2 = array_chunk($array2, count($array1), false);

$result = [];
foreach($array1 as $key => $value) {
    $result[$value] = $chunkedArray2[0][$key] + $chunkedArray2[1][$key];
}

var_dump($result);

结果是:

Array
(
    [Campaign 1] => 255
    [Campaign 2] => 385
    [Campaign 3] => 736
)
ao218c7q

ao218c7q2#

试试这个

$result = json_decode($result);
$count = count($result);
$final = array();
foreach($result as $key => $value){
  $final[$value] = $pages["page_data"][$key] + $pages["page_data"][$key+$count];
}
var_dump($final);
iyfamqjs

iyfamqjs3#

通过利用当前索引和groups数组计数之间的模值,可以避免分块和转置。
这是为了提高效率而优化的(因为它不进行迭代函数调用),具有最低的时间复杂度(因为它只迭代values数组一次),并且当您使用any number of values进行处理时也能正常工作。
代码:(Demo

$groups = ["Campaign 1", "Campaign 2", "Campaign 3"];
$values = [222, 342, 71, 33, 43, 665];

$count = count($groups);
$result = [];
foreach ($values as $index => $value) {
    $group = $groups[$index % $count]; 
    $result[$group] = ($result[$group] ?? 0) + $value;
}
var_export($result);

输出:

array (
  'Campaign 1' => 255,
  'Campaign 2' => 385,
  'Campaign 3' => 736,
)
rta7y2nd

rta7y2nd4#

@aslawin方法可以通过一些函数轻松实现

$array1 = [0 => "Campaign 1", 1 => "Campaign 2", 2 => "Campaign 3"];
$array2 = [0 => 222, 1 => 342, 2 => 71, 3 => 33, 4 => 43, 5 => 665];

$res = array_combine($array1, 
           array_map(function($i1, $i2) { return $i1+$i2; },
                 ...array_chunk($array2, count($array1))))

回复评论:OP需要的长度是第二个数组的两倍以上,这一点并不明显,但是代码可以很容易地重写为任何长度

$array1 = [0 => "Campaign 1", 1 => "Campaign 2", 2 => "Campaign 3"];
$array2 = [222, 342, 71, 33, 43, 665, -255, -385, -736];

$res = array_combine($array1, 
           array_map(function(...$ar) { return array_sum($ar); },
                 ...array_chunk($array2, count($array1))));
                 
print_r($res);

输出

[0, 0, 0]

相关问题