通过实现Iterator的对象一次迭代2个项目的优雅方式

时间:2012-11-26 04:27:42

标签: php phpquery

我正在使用phpQuery来解析与此结构类似的某些HTML

<div>
    <span>Name</span>
    <span>John</span>
    <span>Age</span>
    <span>23</span>
    <span>Location</span>
    <span>London</span>
</div>

我需要将所有这些信息收集到一个关联数组中,所以我做的是这样的事情:

$doc = new phpQuery($html);
foreach($doc['div span'] as $span){
    $text = pq($span)->text();
    // do some other stuff with $text
}

请注意,$doc$doc['div span']是实现phpQueryObjectIteratorCountable的{​​{1}}。

现在,为了关联这些数据,我不得不使用一个变量,我存储当前状态(标题或值)并不是很优雅。我想做的是能够一次迭代2个项目。我找到的一个解决方案是使用ArrayAccess遍历所有对象,将所有项添加到数组中,然后在该数组上使用foreachnext()来获取2个项目在一个循环中的时间,但这并不好。请注意,在each()对象上使用next()each()我只是得到它的公共属性,而这根本不是我想要的。有没有办法做到这一点并有一个很好的代码?


注意:虽然此问题与phpQuery有关,但我认为这是一般性phpQuery问题,不涉及php知识。

1 个答案:

答案 0 :(得分:1)

如问题中所述,phpQuery实施Iterator

所以我说这可能是你能做到你想做的最干净的方式:

$doc = new phpQuery($html);
$elements = $doc['div span'];

foreach($elements as $span){
    $key = pq($span)->text();
    $elements->next();
    $value = pq($elements->current())->text();
}