基于键交叉的Sum数组值

时间:2016-03-26 20:19:30

标签: php jquery arrays

我有一个循环,我将值同时推入两个数组,所以我得到两个这样的数组:

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

如何从$array1获取该数字的相应键的1,2,3的每个唯一编号(即$array2)的总和。

实施例;对于1的值$array1,我们得到了密钥0, 1, 2。现在,我想总结$array2中包含这些键的值,结果为2 + 4 + 5 = 11

我是否会编写一个循环来获取1$array1的所有索引,然后使用这些索引从$array2获取所有值,依此类推?

5 个答案:

答案 0 :(得分:2)

如果您已经将值推送到$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
)

答案 1 :(得分:2)

解释

首先,只需将$array1翻转,即可获取$uniqueValues中的所有唯一值。由于您不能拥有重复的密钥,因此我们最终将所有唯一值作为$sum中的密钥。我们还使用空数组初始化$array1,我们将把每个值的总和放入其中。

现在,我们遍历所有唯一值,并获取$array2的所有密钥,其具有array_flip()的特定值。

然后我们从第二个数组中获取所有使用array_keys()进行的键的值。请注意,由于我们按键交叉,我们必须翻转我们的键数组,以便我们将键作为数组的键。

之后我们在数组中得到$sum的所有值,它对应于当前迭代中第一个数组的值。我们可以将其与array_intersect_key()一起汇总并保存在<?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
)

输出:

<div>
  <input id="img1" type="radio" name="img-descr">
     <div id="tt0110912"> <!-- Pulp fiction -->
         <h1 id="Title"></h1>
         <p id="Runtime"></p>
         <p id="Plot"></p>
     </div>
</div>
<div>
  <input id="img2" type="radio" name="img-descr">
     <div id="tt0796366"> <!-- Star Trek -->
         <h1 id="Title"></h1>
         <p id="Runtime"></p>
         <p id="Plot"></p>
     </div>
</div>
<div>
  <input id="img3" type="radio" name="img-descr">
     <div id="tt0251413"> <!-- Star Wars -->
         <h1 id="Title"></h1>
         <p id="Runtime"></p>
         <p id="Plot"></p>
     </div>
</div>

<!-- Script para la api de OMDB -->    

<script>            
var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function() {
        if (xhr.readyState == XMLHttpRequest.DONE) {
            var fullMovie = JSON.parse(xhr.responseText);
            var movie = { title: fullMovie.Title, runtime: fullMovie.Runtime, plot: fullMovie.Plot, };
            document.getElementById('Title').innerText = movie.title;
            document.getElementById('Runtime').innerText = movie.runtime;
            document.getElementById('Plot').innerText = movie.plot
        }
    }
    xhr.open('GET', 'variable?', true);
    xhr.send(null);
</script>

答案 2 :(得分:2)

您可以使用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
)

eval.in demo

array_map接受多个数组,并将其每个项目同步传递,因此您可以将每个$array2值与$total元素相加,并使用与$array1值相同的键。

请注意,我们仅使用$total初始化array_fill_keys,以避免在创建新$total元素时发出通知。

答案 3 :(得分:0)

尝试使用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)
}

答案 4 :(得分:0)

使用1 , 1 , 1 , 2 , 2 , 3array_count_valuesarray_walk函数解决有序序列(例如array_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/en/function.array-count-values.php
http://php.net/manual/en/function.array-walk.php