<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="sv">
	<id>https://wiki.linux.se/index.php?action=history&amp;feed=atom&amp;title=Generator-syntax</id>
	<title>Generator-syntax - Versionshistorik</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.linux.se/index.php?action=history&amp;feed=atom&amp;title=Generator-syntax"/>
	<link rel="alternate" type="text/html" href="https://wiki.linux.se/index.php?title=Generator-syntax&amp;action=history"/>
	<updated>2026-04-10T19:10:46Z</updated>
	<subtitle>Versionshistorik för denna sida på wikin</subtitle>
	<generator>MediaWiki 1.38.4</generator>
	<entry>
		<id>https://wiki.linux.se/index.php?title=Generator-syntax&amp;diff=3326&amp;oldid=prev</id>
		<title>Admin: Skapade sidan med &#039;== Generator-syntax ==  En generatorfunktion ser ut precis som en vanlig funktion, förutom att istället för att returnera ett värde, kan en generator avge (&#039;&#039;yield&#039;&#039;) så många värden som behövs. Alla funktioner som innehåller &#039;&#039;yield&#039;&#039; är en generatorfunktion.  När en generatorfunktion anropas returnerar den ett objekt som kan itereras över. När du itererar över det objektet (till exempel via en &#039;&#039;foreach&#039;&#039;-loop), kommer PHP att anropa objektets iterationsm...&#039;</title>
		<link rel="alternate" type="text/html" href="https://wiki.linux.se/index.php?title=Generator-syntax&amp;diff=3326&amp;oldid=prev"/>
		<updated>2024-08-24T10:53:02Z</updated>

		<summary type="html">&lt;p&gt;Skapade sidan med &amp;#039;== Generator-syntax ==  En generatorfunktion ser ut precis som en vanlig funktion, förutom att istället för att returnera ett värde, kan en generator avge (&amp;#039;&amp;#039;yield&amp;#039;&amp;#039;) så många värden som behövs. Alla funktioner som innehåller &amp;#039;&amp;#039;yield&amp;#039;&amp;#039; är en generatorfunktion.  När en generatorfunktion anropas returnerar den ett objekt som kan itereras över. När du itererar över det objektet (till exempel via en &amp;#039;&amp;#039;foreach&amp;#039;&amp;#039;-loop), kommer PHP att anropa objektets iterationsm...&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Ny sida&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Generator-syntax ==&lt;br /&gt;
&lt;br /&gt;
En generatorfunktion ser ut precis som en vanlig funktion, förutom att istället för att returnera ett värde, kan en generator avge (&amp;#039;&amp;#039;yield&amp;#039;&amp;#039;) så många värden som behövs. Alla funktioner som innehåller &amp;#039;&amp;#039;yield&amp;#039;&amp;#039; är en generatorfunktion.&lt;br /&gt;
&lt;br /&gt;
När en generatorfunktion anropas returnerar den ett objekt som kan itereras över. När du itererar över det objektet (till exempel via en &amp;#039;&amp;#039;foreach&amp;#039;&amp;#039;-loop), kommer PHP att anropa objektets iterationsmetoder varje gång det behöver ett värde. PHP sparar sedan generatorns tillstånd när generatorn avger ett värde, så att den kan återupptas när nästa värde behövs.&lt;br /&gt;
&lt;br /&gt;
När det inte finns fler värden att avge, kan generatorn helt enkelt returnera, och den anropande koden fortsätter precis som om en array hade tagit slut på värden.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Notera:&amp;#039;&amp;#039;&amp;#039; En generator kan returnera värden, som kan hämtas med &amp;#039;&amp;#039;Generator::getReturn()&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
=== yield-nyckelordet ===&lt;br /&gt;
&lt;br /&gt;
Hjärtat av en generatorfunktion är &amp;#039;&amp;#039;yield&amp;#039;&amp;#039;-nyckelordet. I sin enklaste form ser ett &amp;#039;&amp;#039;yield&amp;#039;&amp;#039;-uttalande ut mycket som ett &amp;#039;&amp;#039;return&amp;#039;&amp;#039;-uttalande, förutom att istället för att stoppa exekveringen av funktionen och returnera, så tillhandahåller &amp;#039;&amp;#039;yield&amp;#039;&amp;#039; istället ett värde till koden som itererar över generatorn och pausar exekveringen av generatorfunktionen.&lt;br /&gt;
&lt;br /&gt;
==== Exempel #1 Ett enkelt exempel på att avge värden ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
function gen_one_to_three() {&lt;br /&gt;
    for ($i = 1; $i &amp;lt;= 3; $i++) {&lt;br /&gt;
        // Observera att $i bevaras mellan yield.&lt;br /&gt;
        yield $i;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$generator = gen_one_to_three();&lt;br /&gt;
foreach ($generator som $value) {&lt;br /&gt;
    echo &amp;quot;$value\n&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ovanstående exempel kommer att ge följande output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Notera:&amp;#039;&amp;#039;&amp;#039; Internt kommer sekventiella heltalsnycklar att paras ihop med de avgivna värdena, precis som med en icke-associativ array.&lt;br /&gt;
&lt;br /&gt;
=== Avge värden med nycklar ===&lt;br /&gt;
&lt;br /&gt;
PHP stöder också associativa arrayer, och generatorer är inte annorlunda. Förutom att avge enkla värden, som visat ovan, kan du också avge en nyckel samtidigt.&lt;br /&gt;
&lt;br /&gt;
Syntaxen för att avge ett nyckel/värde-par är mycket lik den som används för att definiera en associativ array, som visas nedan.&lt;br /&gt;
&lt;br /&gt;
==== Exempel #2 Avge ett nyckel/värde-par ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
/*&lt;br /&gt;
 * Inmatningen är semi-kolon-separerade fält, där det första&lt;br /&gt;
 * fältet är ett ID som används som nyckel.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
$input = &amp;lt;&amp;lt;&amp;lt;&amp;#039;EOF&amp;#039;&lt;br /&gt;
1;PHP;Gillar dollartecken&lt;br /&gt;
2;Python;Gillar blanksteg&lt;br /&gt;
3;Ruby;Gillar block&lt;br /&gt;
EOF;&lt;br /&gt;
&lt;br /&gt;
function input_parser($input) {&lt;br /&gt;
    foreach (explode(&amp;quot;\n&amp;quot;, $input) som $line) {&lt;br /&gt;
        $fields = explode(&amp;#039;;&amp;#039;, $line);&lt;br /&gt;
        $id = array_shift($fields);&lt;br /&gt;
&lt;br /&gt;
        yield $id =&amp;gt; $fields;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
foreach (input_parser($input) som $id =&amp;gt; $fields) {&lt;br /&gt;
    echo &amp;quot;$id:\n&amp;quot;;&lt;br /&gt;
    echo &amp;quot;    $fields[0]\n&amp;quot;;&lt;br /&gt;
    echo &amp;quot;    $fields[1]\n&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ovanstående exempel kommer att ge följande output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1:&lt;br /&gt;
    PHP&lt;br /&gt;
    Gillar dollartecken&lt;br /&gt;
2:&lt;br /&gt;
    Python&lt;br /&gt;
    Gillar blanksteg&lt;br /&gt;
3:&lt;br /&gt;
    Ruby&lt;br /&gt;
    Gillar block&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Avge null-värden ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Yield&amp;#039;&amp;#039; kan anropas utan ett argument för att avge ett &amp;#039;&amp;#039;null&amp;#039;&amp;#039;-värde med en automatisk nyckel.&lt;br /&gt;
&lt;br /&gt;
==== Exempel #3 Avge null-värden ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
function gen_three_nulls() {&lt;br /&gt;
    foreach (range(1, 3) som $i) {&lt;br /&gt;
        yield;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var_dump(iterator_to_array(gen_three_nulls()));&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ovanstående exempel kommer att ge följande output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
array(3) {&lt;br /&gt;
  [0]=&amp;gt;&lt;br /&gt;
  NULL&lt;br /&gt;
  [1]=&amp;gt;&lt;br /&gt;
  NULL&lt;br /&gt;
  [2]=&amp;gt;&lt;br /&gt;
  NULL&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Avge genom referens ===&lt;br /&gt;
&lt;br /&gt;
Generatorfunktioner kan avge värden genom referens såväl som genom värde. Detta görs på samma sätt som att returnera referenser från funktioner: genom att sätta ett &amp;#039;&amp;#039;&amp;amp;&amp;#039;&amp;#039;-tecken före funktionsnamnet.&lt;br /&gt;
&lt;br /&gt;
==== Exempel #4 Avge värden genom referens ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
function &amp;amp;gen_reference() {&lt;br /&gt;
    $value = 3;&lt;br /&gt;
&lt;br /&gt;
    while ($value &amp;gt; 0) {&lt;br /&gt;
        yield $value;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Observera att vi kan ändra $number inom loopen, och&lt;br /&gt;
 * eftersom generatorn avger referenser, ändras $value&lt;br /&gt;
 * inom gen_reference().&lt;br /&gt;
 */&lt;br /&gt;
foreach (gen_reference() som &amp;amp;$number) {&lt;br /&gt;
    echo (--$number).&amp;#039;... &amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ovanstående exempel kommer att ge följande output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2... 1... 0...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Generatordelegation via &amp;#039;&amp;#039;yield from&amp;#039;&amp;#039; ===&lt;br /&gt;
&lt;br /&gt;
Generatordelegation gör det möjligt att avge värden från en annan generator, Traversable-objekt, eller array genom att använda &amp;#039;&amp;#039;yield from&amp;#039;&amp;#039;-nyckelordet. Den yttre generatorn kommer då att avge alla värden från den inre generatorn, objektet eller arrayen tills den inte längre är giltig, varefter exekveringen fortsätter i den yttre generatorn.&lt;br /&gt;
&lt;br /&gt;
Om en generator används med &amp;#039;&amp;#039;yield from&amp;#039;&amp;#039;, kommer &amp;#039;&amp;#039;yield from&amp;#039;&amp;#039;-uttrycket också att returnera vilket värde som helst som returneras av den inre generatorn.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Varning:&amp;#039;&amp;#039;&amp;#039; När man lagrar i en array (t.ex. med &amp;#039;&amp;#039;iterator_to_array()&amp;#039;&amp;#039;), återställer inte &amp;#039;&amp;#039;yield from&amp;#039;&amp;#039; nycklarna. Det bevarar nycklarna som returneras av &amp;#039;&amp;#039;Traversable&amp;#039;&amp;#039;-objektet eller arrayen. Därför kan vissa värden dela en gemensam nyckel med en annan &amp;#039;&amp;#039;yield&amp;#039;&amp;#039; eller &amp;#039;&amp;#039;yield from&amp;#039;&amp;#039;, vilket, vid insättning i en array, kommer att skriva över tidigare värden med den nyckeln.&lt;br /&gt;
&lt;br /&gt;
Ett vanligt fall där detta är viktigt är när &amp;#039;&amp;#039;iterator_to_array()&amp;#039;&amp;#039; returnerar en array med nycklar som standard, vilket kan leda till oväntade resultat. &amp;#039;&amp;#039;iterator_to_array()&amp;#039;&amp;#039; har en andra parameter &amp;#039;&amp;#039;preserve_keys&amp;#039;&amp;#039; som kan sättas till &amp;#039;&amp;#039;false&amp;#039;&amp;#039; för att samla alla värden medan nycklarna som returneras av Generatorn ignoreras.&lt;br /&gt;
&lt;br /&gt;
==== Exempel #5 &amp;#039;&amp;#039;yield from&amp;#039;&amp;#039; med &amp;#039;&amp;#039;iterator_to_array()&amp;#039;&amp;#039; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
function inner() {&lt;br /&gt;
    yield 1; // nyckel 0&lt;br /&gt;
    yield 2; // nyckel 1&lt;br /&gt;
    yield 3; // nyckel 2&lt;br /&gt;
}&lt;br /&gt;
function gen() {&lt;br /&gt;
    yield 0; // nyckel 0&lt;br /&gt;
    yield from inner(); // nycklar 0-2&lt;br /&gt;
    yield 4; // nyckel 1&lt;br /&gt;
}&lt;br /&gt;
// Skicka false som andra parameter för att få en array [0, 1, 2, 3, 4]&lt;br /&gt;
var_dump(iterator_to_array(gen()));&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ovanstående exempel kommer att ge följande output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
array(3) {&lt;br /&gt;
  [0]=&amp;gt;&lt;br /&gt;
  int(1)&lt;br /&gt;
  [1]=&amp;gt;&lt;br /&gt;
  int(4)&lt;br /&gt;
  [2]=&amp;gt;&lt;br /&gt;
  int(3)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exempel #6 Grundläggande användning av &amp;#039;&amp;#039;yield from&amp;#039;&amp;#039; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
function count_to_ten() {&lt;br /&gt;
    yield 1;&lt;br /&gt;
    yield 2;&lt;br /&gt;
    yield from [3, 4];&lt;br /&gt;
    yield from new ArrayIterator([5, 6]);&lt;br /&gt;
    yield from seven_eight();&lt;br /&gt;
    yield 9;&lt;br /&gt;
    yield 10;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function seven_eight() {&lt;br /&gt;
    yield 7;&lt;br /&gt;
    yield from eight();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function eight() {&lt;br /&gt;
    yield 8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
foreach (count_to_ten() som $num) {&lt;br /&gt;
    echo &amp;quot;$num &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ovanstående exempel kommer att ge följande output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 2 3 4 5 6 7 8 9 10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exempel #7 &amp;#039;&amp;#039;yield from&amp;#039;&amp;#039; och returvärden ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
function count_to_ten() {&lt;br /&gt;
    yield 1;&lt;br /&gt;
    yield 2;&lt;br /&gt;
    yield from [3, 4];&lt;br /&gt;
    yield from new ArrayIterator([5, 6]);&lt;br /&gt;
    yield from seven_eight();&lt;br /&gt;
    return yield from nine_ten();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function seven_eight() {&lt;br /&gt;
    yield 7;&lt;br /&gt;
    yield from eight();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function eight() {&lt;br /&gt;
    yield 8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function nine_ten() {&lt;br /&gt;
    yield 9;&lt;br /&gt;
    return 10;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$gen = count_to_ten();&lt;br /&gt;
foreach ($gen som $num) {&lt;br /&gt;
    echo &amp;quot;$num &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
echo $gen-&amp;gt;getReturn();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ovanstående exempel kommer att ge följande output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 2 3 4 5 6 7 8 9 10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
= Sidslut =&lt;br /&gt;
Orginalhemsidan på Engelska : https://www.php.net/manual/en/language.fibers.php&lt;br /&gt;
&amp;lt;BR&amp;gt;[[PHP]]&lt;br /&gt;
&amp;lt;BR&amp;gt;[[Språkreferens]]&lt;br /&gt;
&amp;lt;BR&amp;gt;[[Språkreferens#Generatorer]]&lt;br /&gt;
[[Kategori:Php]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;BR&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
Det här är en maskinöversättning av PHP-manualen till svenska. Om du hittar fel är vi tacksamma om du rapporterar dem via formuläret som finns på &lt;br /&gt;
https://www.linux.se/kontaka-linux-se/&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>