如果我們有一個產生值的方法,使用PHP> = 5.5,那麼計算這些值的最佳方法是什麼?PHP - 如何計算髮電機產量
我期待的是能夠將發生器轉換爲數組並計數,但它會返回一個空數組。 Count()也不起作用,因爲發生器報告爲空,儘管不是空的。
我對此感到莫名其妙。如果你不需要計算髮電機的功率,那麼這是一個很好的功能,否則我沒有看到太多的觀點。有一種方法可以檢測一個生成器是否爲空,這是通過使用key()方法,並且如果它返回NULL,那麼沒有收益或生成器已經被迭代通過,這將意味着當前指針爲空。
如果我們有一個產生值的方法,使用PHP> = 5.5,那麼計算這些值的最佳方法是什麼?PHP - 如何計算髮電機產量
我期待的是能夠將發生器轉換爲數組並計數,但它會返回一個空數組。 Count()也不起作用,因爲發生器報告爲空,儘管不是空的。
我對此感到莫名其妙。如果你不需要計算髮電機的功率,那麼這是一個很好的功能,否則我沒有看到太多的觀點。有一種方法可以檢測一個生成器是否爲空,這是通過使用key()方法,並且如果它返回NULL,那麼沒有收益或生成器已經被迭代通過,這將意味着當前指針爲空。
您應該明白,generator不是數據結構 - 它是Generator
類的一個實例,實際上它是Iterator
的特殊類型。因此,你不能指望直接的項目(準確地說 - 這是因爲Generator
該類只實現Iterator
接口,而不是Countable
接口老實說,我無法想象它如何可以實現)
要統計本地生成器的值,你必須遍歷它。但是這不能做到常識 - 因爲在大多數情況下,它是你誰將決定將會產生多少物品。從手動著名xrange()
樣本:
function xrange($start, $limit, $step = 1) {
if ($start < $limit) {
if ($step <= 0) {
throw new LogicException('Step must be +ve');
}
for ($i = $start; $i <= $limit; $i += $step) {
yield $i;
}
} else {
if ($step >= 0) {
throw new LogicException('Step must be -ve');
}
for ($i = $start; $i >= $limit; $i += $step) {
yield $i;
}
}
}
-as你可以看到,它的你誰必須定義邊界。最終數量將取決於此。通過生成器迭代只有在靜態邊界定義的生成器時纔有意義(即當項目數總是靜態時 - 例如嚴格地在生成器內定義)。在任何其他情況下,你會得到參數相關的結果。對於xrange()
:
function getCount(Generator $functor)
{
$count = 0;
foreach($functor as $value)
{
$count++;
}
return $count;
}
- 和用法:
var_dump(getCount(xrange(1, 100, 10)));//10
var_dump(getCount(xrange(1, 100, 1)));//100
-as你可以看到, 「伯爵」 將改變。更糟的是,發電機並不是有限的。它可能會產生無限的一組值(例如,邊界在外部循環中定義) - 這是使「計數」接近無意義的另一個原因。
我明白。在我的情況下,我實際上是在從數據庫的循環中產生對象,這意味着雖然有一個「yield」語句,但它會重複多次。我能想出的唯一方法是克隆生成器並對其進行迭代(允許原始生成器仍然迭代其數據)或分別對行進行計數。那麼根據你的說法,我不能在最佳實踐中使用它? – JLT93
在SQL中有'COUNT'分組功能。用這個代替 –
我想如果發生器是無限的,那麼計數就沒有用了,然而在一個人無限期地使用同一個發生器的情況下 - 在這個時刻它會停止讓你使用存儲在發生器中的值?它最終不得不停止,否則它只是毫無意義地產生價值,對吧?通過計數行,我的意思是使用COUNT,但它必須是一個單獨的查詢。一個獲取行數,一個獲取數據。然後產生計數數據,這意味着生成器中的第一個值是行計數。那會是你怎麼做這樣的事情? – JLT93
如果你必須這樣做,你可以用本機的功能做在一個行:
count(iterator_to_array($generator, false));
然而,照顧。在此之後,您的$generator
被執行並且被消耗。因此,如果您將同一個$generator
放入下一行的foreach
中,它將始終循環0次。
發電機設計高度動態(與固定數據結構如陣列相反),這就是爲什麼他們不提供count()
或rewind()
。
希望使用本地函數可以使此方法比@Alma Do所描述的方法更有效。它可以用來對數組進行排序而不是計數嗎? –
儘管您不能使用count()
您可以使用引用來設置計數以使其可供外界訪問。
function generate(&$count = 0) {
// we have 4 things
$count = 4;
for($i = 0; $i < $count; $i++) {
yield $i;
}
}
$foo = generate($count);
echo $count; // 4
foreach ($foo as $i) {
echo $i;
}
下降到這是它不會告訴你有多少剩餘,但有多少它開始。
我不知道你在說什麼。 – AmazingDreams
在發佈這篇文章的時候,我只嘗試過在帖子中提到的count(),但沒有成功。我也是一個主題,因爲它是我的一個特定的編程問題。至於提供一個代碼示例,我想我可以完成顯示當前的使用情況,但我希望那些點擊這篇文章的人能夠知道PHP中的收益率的使用情況。有了這些,我不知道我違反了任何規則,但如果我這樣做了,那我真的很抱歉。 – JLT93