如何将两个不同长度的数组相乘?

时间:2014-04-22 04:10:26

标签: php arrays math multiplication

我有两个不同长度的数组:

$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中是否有内置函数来完成此任务?如何有效地解决这个问题?

4 个答案:

答案 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
)

Demo


更新:如果您希望重复较短的数组而不管其长度顺序如何,您可以使用以下解决方案:

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

Demo

答案 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))次,即最大数组的大小。