我有两个不同长度的数组:
$a = array(10, 20, 30, 40, 50);
$b = array(1, 2, 3);
我想将它们相乘(例如$c=array_mult($a, $b)
),重复较短的数组。 $c
应该是10, 40, 90, 40, 100
,因为:
10 * 1 = 10
20 * 2 = 40
30 * 3 = 90
40 * 1 = 40
50 * 2 = 100
PHP中是否有内置函数来完成此任务?如何有效地解决这个问题?
答案 0 :(得分:1)
没有内置功能可以做到这一点。您可以使用foreach
和模运算符轻松地执行此操作:
$c = array();
$len = count($b);
foreach($a as $key => $value){
$c[$key] = $value*$b[($key % $len)];
}
答案 1 :(得分:1)
使用带模数运算符的for
循环(%
):
$a = array(10, 20, 30, 40, 50);
$b = array(1, 2, 3);
$aCount = count($a);
$bCount = count($b);
for ($i=0; $i < $aCount; $i++) {
$result[] = $b[$i % $bCount] * $a[$i];
}
输出:
Array
(
[0] => 10
[1] => 40
[2] => 90
[3] => 40
[4] => 100
)
更新:如果您希望重复较短的数组而不管其长度顺序如何,您可以使用以下解决方案:
$a = array(10, 20);
$b = array(1, 2, 3);
$smallArr = min($a, $b);
$largeArr = max($a, $b);
$smallCount = count($smallArr);
$largeCount = count($largeArr);
for ($i=0; $i < $largeCount; $i++) {
$result[] = $smallArr[$i % $smallCount] * $largeArr[$i];
}
输出:
Array
(
[0] => 10
[1] => 40
[2] => 30
)
答案 2 :(得分:0)
首先$b
的长度与$a
相同:
$i=0;
while(count($b) < count($a)){
if($i > count($b){$i=0;}
$b[] = $b[$i];
$i++;
}
然后将两个数组相乘:
$total = array_map(function($x, $y) { return $x * $y; }, $a, $b);
$total
包含您想要的内容。
答案 3 :(得分:0)
投掷MultipleIterator
解决方案(要求&gt; = 5.5):
$a = array(10, 20, 30, 40, 50);
$b = array(1, 2, 3);
$m = new MultipleIterator(MultipleIterator::MIT_KEYS_ASSOC);
$m->attachIterator(new InfiniteIterator(new ArrayIterator($a)), 'a');
$m->attachIterator(new InfiniteIterator(new ArrayIterator($b)), 'b');
$c = array();
foreach (new LimitIterator($m, 0, max(count($a), count($b))) as $both) {
$c[] = $both['a'] * $both['b'];
}
print_r($c);
我使用InfiniteIterator
重复内部迭代器的次数是必要的;然后将两个迭代器附加到MultipleIterator
,它将同时迭代两个内部迭代器。它实际上是另一个InfiniteIterator
,因此需要加以限制。
最后,LimitIterator
将迭代其内部迭代器max(count($a), count($b))
次,即最大数组的大小。