【问题标题】:SplPriorityQueue::next() is removing the itemSplPriorityQueue::next() 正在删除项目
【发布时间】:2015-02-12 08:47:49
【问题描述】:

我想知道如何多次迭代 SplHeap 或 SplPriorityQueue。

next() 方法删除最后一项,因此第二个 foreach(或 for)没有得到任何结果。

例子:

<?php
class Teste extends SplPriorityQueue {}

$teste = new Teste();
$teste->insert( 'A', 1 );
$teste->insert( 'B', 3 );
$teste->insert( 'D', 5 );
$teste->insert( 'C', 2 );
$teste->insert( 'A', 4 );

echo '<pre>';

var_dump( $teste->count() );

echo '<br>';

foreach( $teste as $t )
    var_dump( $t );

echo '<br>';

var_dump( $teste->count() );

返回:

int(5)

string(1) "D"
string(1) "A"
string(1) "B"
string(1) "C"
string(1) "A"

int(0) <--- I need this to still be 5

我需要基于 compare() 方法插入项目,如下所示:http://php.net/manual/en/splheap.compare.php

谢谢!

【问题讨论】:

    标签: php iterator next spl


    【解决方案1】:

    我想知道如何多次迭代 SplHeap 或 SplPriorityQueue。

    简短的回答是,对于类的单个实例,您不会重复多次

    稍长一点的答案是在迭代时使用多个相同的实例。这可以通过迭代堆/pqueue 的clone 轻松实现。

    快速示例

    <?php
    
    $queue = new SplPriorityQueue();
    $queue ->insert('A', 30);
    $queue ->insert('C', 10);
    $queue ->insert('B', 20);
    
    var_dump(count($queue));
    foreach (clone $queue as $item) {
        var_dump($item);
    }
    var_dump(count($queue));
    foreach (clone $queue as $item) {
        var_dump($item);
    }
    var_dump(count($queue));
    

    以上输出:

    int(3)
    string(1) "A"
    string(1) "B"
    string(1) "C"
    int(3)
    string(1) "A"
    string(1) "B"
    string(1) "C"
    int(3)
    

    【讨论】:

    • 感谢您的回复。但是,如果我想将 SplObjectStorage 与自动排序的对象一起使用,就像 SplHeap 与 compare() 方法一样,该怎么办?
    • 我不是 100% 清楚你在问什么,但你应该能够毫无问题地完成上述操作。
    猜你喜欢
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    相关资源
    最近更新 更多