以特殊顺序同时迭代多个迭代器

时间:2015-03-17 16:34:32

标签: php algorithm iterator

假设我有两个迭代器:

$a = new ArrayIterator(array(4, 3, 2));
$b = new ArrayIterator(array(6, 5, 1));

现在我想以某种方式迭代它们以输出以下内容:

 a b sum

 4 6  10 
 4 5  9 
 3 6  9 
 3 5  8 
 2 6  8 
 2 5  7 
 4 1  5 
 3 1  4 
 2 1  3 

所以我想迭代所有可能的组合。另外,我想要的是,总和最高值的那个将首先出现。

我不想使用数组(因此也没有数组排序),我需要使用迭代器(因为我原来的情况下的约束)。

1 个答案:

答案 0 :(得分:0)

这是你要求的订单抛出的东西。没有某种形式,你不能做到这一点;但堆数据结构可能是一个选项:

$a = new ArrayIterator(array(4, 2, 3));
$b = new ArrayIterator(array(1, 6, 5));

class MyHeap extends SplHeap {
    public function compare($v1, $v2) {
        if ($v1->sum === $v2->sum) return 0;
        return $v1->sum < $v2->sum ? -1 : 1;
    }
}

$heap = new MyHeap();
foreach($a as $val1) {
    foreach($b as $val2) {
        $heap->insert(
            (object) [
                'val1' => $val1,
                'val2' => $val2,
                'sum' => $val1+$val2
            ]
        );
    }
}

$heap->top();
foreach($heap as $value) {
  echo $value->val1, ' ', $value->val2, ' ', $value->sum, PHP_EOL;
}