我正在使用PHP框架將SQL結果作爲迭代對象返回。問題是我有一個返回一行的SQL查詢,我不想創建一個foreach
-loop來獲取第一個也是唯一的元素。如何訪問迭代器中的第一個元素?
那我該怎麼做呢?
這些不工作:
$obj->item(0)->propName;
$obj->next()->propName;
$obj[0]->propName;
任何想法?
我正在使用PHP框架將SQL結果作爲迭代對象返回。問題是我有一個返回一行的SQL查詢,我不想創建一個foreach
-loop來獲取第一個也是唯一的元素。如何訪問迭代器中的第一個元素?
那我該怎麼做呢?
這些不工作:
$obj->item(0)->propName;
$obj->next()->propName;
$obj[0]->propName;
任何想法?
假設通過「迭代」,您的意思是該對象實現Iterator
interface,您可以使用$obj->current()
檢索當前元素,因此$obj->current()->propName
可能是你想要的。
如果迭代指針已被移動(例如,如果它是在一個foreach
,不復位指針使用),那麼你可以調用$obj->rewind()
你打電話$obj->current()
之前設置指針回到第一個元素。
只有可以穿越類接口:Iterator和IteratorAggregate(任何其他必須執行這些之一)。
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();
你不能獲得第一要素的任何簡單。 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
'$ obj->電流() - > propName'吧? – Crisp
放了一個'var_dump'並檢查結果對象的結構 –
Crisp的答案沒有辦法。做出一個單獨的答案,我會將其標記爲答案。 var_dump給了我這樣無用的垃圾:http://pastebin.com/GeNDbiN4 – neubert