循环映射不同大小的平面数组并对值求和

问题描述 投票:0回答:4

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

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

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

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

它包含两倍数量的键,因为它将从两种不同的形式获取线索,因此

key 0
key 3
的值将用于活动 1,而
key 2
key 4
将用于活动 2。永远这样。如果有 5 个营销活动,潜在客户数组将有 10 个键,
key 0
key 5
将用于营销活动 1,
key 1
key 6
用于营销活动 2,依此类推。

然后我有这段代码要组合(push):

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
]

然后我可以将其与营销活动数组组合,因为两个数组中的键数量现在将匹配,这将给我一个看起来像这样的数组

[
    "campaign 1" => 255, 
    "campaign 2" => 386, 
    "campaign 3" => 736
]
php arrays sum mapping cyclic
4个回答
1
投票

使用 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
)

1
投票

您可以通过利用当前索引和组数组计数之间的模值来避免分块和转置。

这针对效率进行了优化(因为它不进行迭代函数调用),具有最低的时间复杂度(因为它只迭代值数组一次),并且当您有任意数量的值要处理时,它将起作用。

代码:(演示

$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,
)

0
投票

试试这个

$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);

0
投票

@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]
© www.soinside.com 2019 - 2024. All rights reserved.