簡體   English   中英

基於鍵交集的數組值總和

[英]Sum array values based on key intersection

我有一個循環,其中我同時將值推入兩個數組中,因此得到了兩個這樣的數組:

$array1 = [ 1 , 1 , 1 , 2 , 2 , 3 ];
$array2 = [ 2 , 4 , 5 , 2 , 1 , 5 ];

我如何從$array2獲得每個唯一$array1的總和,即1,2,3 ,該數字的相應鍵。

例; 對於$array1的值1 ,我們得到了鍵0, 1, 2 現在,我想對$array2中具有這些鍵的值求和,得出2 + 4 + 5 = 11

我會寫一個循環來獲取$array1所有具有1的索引,然后使用這些索引從$array2獲取所有值,以此類推嗎?

您可以使用array_map傳遞功能來使兩個數組起作用,並使用對每個總計的空數組的引用:

$total = array_fill_keys( array_unique($array1), 0 );

array_map
(
    function( $a, $b ) use( &$total )
    {
        $total[$a] += $b;
    },
    $array1,
    $array2
);

print_r( $total );

輸出:

Array
(
    [1] => 11
    [2] => 3
    [3] => 5
)

評估演示

array_map接受多個數組,並同步傳遞其每個項目,因此您可以使用與$array1值相同的鍵將每個$array2值求和到$total元素。

請注意,我們僅使用array_fill_keys初始化$total以避免在創建新的$total元素時發出通知。

如果您已經將值推入$array1且同時將值推入$array1 $array2 ,為什么不簡單地創建第三個數組並將第二個數組的值推入相應元素的和中,並使用第一個數組中的鍵?!

因此,您不必調用任何其他函數即可執行此操作,並且可以在循環本身中直接進行操作。

偽代碼:

<?php

    $sum = [];

    loop {

        $arrayOne[] = $valueOne;
        $arrayTwo[] = $valueTwo;


        if(!isset($sum[$valueOne])) $sum[$valueOne] = 0; $sum[$valueOne] += $valueTwo;

    }

    print_r($sum);

?>

因此,最終得到一個具有如下模式的數組:

Array (
    [unique value from array one] => sum
)

說明

首先,我們只需通過使用array_flip()將其翻轉即可從$array1獲得所有唯一值。 由於您不能有重復的鍵,因此我們最終將所有唯一值作為$uniqueValues鍵。 我們還使用一個空數組初始化$sum ,在其中將每個值的總和放入其中。

現在,我們遍歷所有唯一值,並從$array1獲取所有鍵,這些鍵通過array_keys()具有特定的值。

然后,我們使用第二個數組中的所有鍵array_intersect_key()array_intersect_key()獲得所有值。 注意,由於我們按鍵進行交集,因此必須翻轉鍵數組,以便將鍵作為數組的鍵。

之后,我們將$array2中的所有值都放在一個數組中,該值對應於當前迭代中第一個數組的值。 我們可以將其與array_sum()求和,然后將其保存在$sum

<?php

    $array1 = [ 1 , 1 , 1 , 2 , 2 , 3 ];
    $array2 = [ 2 , 4 , 5 , 2 , 1 , 5 ];

    $sum = [];
    $uniqueValues = array_flip($array1);

    foreach($uniqueValues as $v => $notNeeded){
        $keys = array_keys($array1, $v);
        $sum[$v] = array_sum(array_intersect_key($array2, array_flip($keys)));
    }

    print_r($sum);

?>

輸出:

Array (
    [1] => 11
    [2] => 3
    [3] => 5
)

嘗試對array_reduce使用功能性方法:

<?php

$array1 = [ 1 , 1 , 1 , 2 , 2 , 3 ];
$array2 = [ 2 , 4 , 5 , 2 , 1 , 5 ];

$newArray = array_reduce($array1, function($carry, $item) use($array2) {
    $item2 = $array2[$carry['index']];
    $carry[$item] = empty($carry[$item]) ? $item2 : $carry[$item] + $item2;
    $carry['index'] = $carry['index'] + 1;
    return $carry;
}, ['index' => 0]);

unset($newArray['index']);
var_dump($newArray);

輸出將是:

array(3) {
  [1]=>
  int(11)
  [2]=>
  int(3)
  [3]=>
  int(5)
}

解有序序列(例如, 1 , 1 , 1 , 2 , 2 , 3 ),使用array_count_valuesarray_walkarray_sum功能:

$array1 = [ 1 , 1 , 1 , 2 , 2 , 3 ];
$array2 = [ 2 , 4 , 5 , 2 , 1 , 5 ];

$counts = array_count_values($array1);
$offset = 0;
$sums = [];

array_walk($counts, function($v, $k) use($counts, &$sums, $array2, &$offset){
    $offset += isset($counts[$k-1])? $counts[$k-1] : 0;
    $sums[$k] = array_sum(array_slice($array2, $offset, $v));
});

print_r($sums);

輸出:

Array
(
    [1] => 11
    [2] => 3
    [3] => 5
)

http://php.net/manual/zh/function.array-count-values.php
http://php.net/manual/zh/function.array-walk.php

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM