我有一个循环,我将值同时推入两个数组,所以我得到两个这样的数组:
$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
获取所有值,依此类推?
答案 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 , 3
,array_count_values
和array_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