2013-01-22 72 views
14

我正在使用PHP框架將SQL結果作爲迭代對象返回。問題是我有一個返回一行的SQL查詢,我不想創建一個foreach -loop來獲取第一個也是唯一的元素。如何訪問迭代器中的第一個元素?

那我該怎麼做呢?

這些不工作:

$obj->item(0)->propName; 
$obj->next()->propName; 
$obj[0]->propName; 

任何想法?

+3

'$ obj->電流() - > propName'吧? – Crisp

+2

放了一個'var_dump'並檢查結果對象的結構 –

+0

Crisp的答案沒有辦法。做出一個單獨的答案,我會將其標記爲答案。 var_dump給了我這樣無用的垃圾:http://pastebin.com/GeNDbiN4 – neubert

回答

13

假設通過「迭代」,您的意思是該對象實現Iterator interface,您可以使用$obj->current()檢索當前元素,因此$obj->current()->propName可能是你想要的。

如果迭代指針已被移動(例如,如果它是在一個foreach,不復位指針使用),那麼你可以調用$obj->rewind()你打電話$obj->current()之前設置指針回到第一個元素。

6

只有可以穿越類接口:IteratorIteratorAggregate任何其他必須執行這些之一)。


迭代

Iterator的第一個元素可以按如下方式獲得:

$iterator->rewind(); 
if (!$iterator->valid()) { 
    throw new Exception('There is no any element!'); 
} 
$firstElement = $iterator->current(); 

如果你是肯定的:

  • $iterator從未被foreach走過,或如果是這樣,但循環從未停止過break;
  • 從來就沒有所謂的$iterator->next();

你可以從前面的例子中省略$iterator->rewind();

如果您確定$iterator中元素的個數爲而非爲零,您甚至可以省略條件塊測試$iterator->valid()

所以,如果這些以前的情況將被保留,那麼你所需要的僅僅是:

$firstElement = $iterator->current(); 

IteratorAggregate

你不能獲得第一要素的任何簡單。 IteratorAggergate實際上只是一個Iterator或另一個IteratorAggregate的信封。從邏輯上講,這意味着最後有一個迭代器。不幸的是,你不知道有多少層次。

實現的第一個元素的最簡單的方法是:

$array = iterator_to_array($iteratorAggregate); 
if (count($array) === 0) { 
    throw new Exception('There is no any element!'); 
} 
$firstElement = reset($array); 

(!令人驚訝的完全相同的解決方案也適用於一個迭代

我們將其轉化爲一個普通的數組所以下一個程序是usual way to fetch the first element from an array不幸的是在biig陣列的情況下,這是一個小矯枉過正因爲所有元素的副本必須創建,儘管我們只需要一個。

有一個解決方案,似乎鬆懈:

while ($iteratorAggregate instanceof \IteratorAggregate) { 
    $iteratorAggregate = $iteratorAggregate->getIterator(); 
} 
$iterator = $iteratorAggregate; 

並在下一步中,我們與它的工作就像是在第一個示例的迭代器。我爲一個10000個成員陣列做了一個簡單的基準測試,這個解決方案几乎快了6倍。

LLAP

相關問題