2016-10-27 4 views
0

Ich habe den einen Code, der etwa so aussieht (ich habe es vereinfacht):Rückergebnis von foreach-Schleife (n)

function process_something($a){ 
    foreach($a as $b){ 
     // Some logic here 
     return $something; 
    } 
} 
$input=[]; // An array of some kind 
echo process_something($input); 

Ich gehe davon aus, dass letzte Zeile zu wiederholen, was die Schleifen zurückgekehrt, aber ich nichts bekommen. Vielleicht funktioniert der obige Code nicht. Ich habe es nur zur Veranschaulichung eingefügt. Ich habe viele verschachtelte Schleifen, die zusammenarbeiten, um verschiedene Dinge zurückzugeben.

Wenn ich die Schleifen echo Daten haben, funktioniert es. Ich benötige diese Funktion jedoch, um das Endergebnis zur weiteren Verarbeitung an mich zurückzugeben, anstatt es an den Benutzer zurückzusenden.

Wie gehe ich vor?

+0

wenn 'return' Aufruf der Funktion endet ... das ist die Art von' return' –

+0

Sie wissen, dass diese Schleife wird das nur einmal tun? In der ersten Schleife wird er von der Funktion zurückkehren. –

+0

Können Sie ein aktuelles Beispiel veröffentlichen? Es wird viel einfacher zu verstehen sein, was Sie erreichen wollen. –

Antwort

1

In diesem Fall wird diese Schleife nur einmal ausgeführt, da return beim ersten Auftreten aus einer Funktion springt.

Es sollte eher sein:

function process_something($a){ 
    foreach($a as $b){ 
     $something = 'Some math or other logic here'; 
    } 
    return $something; 
} 
$input=[]; // An array of some kind 
echo process_something($input); 

Bitte Code schreiben, werden wir versuchen, herauszufinden, was falsch ist.

+0

OK, das beantwortet es für mich. Keine Notwendigkeit für mich, Code zu schreiben, da es wirklich komplex wird.Um den Code lesbar zu halten (es ist riesig!) Ich wollte es als eine Reihe von Schleifen und Funktionen (die Daten zurückgeben), aber das könnte wahrscheinlich funktionieren. Oder vielleicht kann ich die Funktionen erhalten, um eine andere Variable außerhalb der Schleifen zu aktualisieren. – DaveHolt

+1

Ich bin froh, dass ich helfen konnte. Wenn es Ihrem Bedarf entspricht, bitte akzeptieren Sie meine Antwort :) Wenn Sie weitere Fragen haben, fragen Sie einfach;) Danke! –

0

Ich habe dich richtig bekommen. Aber ich denke, dass Sie nach dem letzten Wert des Arrays suchen. zu tun, dass es gerade tun:

function process_something($a){ 
    $b = array_reverse ($a); 
    return $b[0]; 
} 
+0

Nein, das ist es nicht, aber danke für die heads-up auf 'array_reverse'! – DaveHolt

1

Dies ist der perfekte Fall für eine generator ist, ein Konzept, das habe ich selten gesehen.

function process_something($a){ 
    foreach($a as $b){ 
     // Some logic here 
     yield $something; 
    } 
    } 

    $input=[]; // An array of some kind 

    /** 
    * The generator returns an Iterator instance 
    * so you'd need to loop over it 
    */ 
    foreach(process_something($input) as $item){ 
    // do stuff here 
    // echo $item 
    // echo $item->something 
    // your call 
    } 

Der große Vorteil dabei ist, dass Sie „ohne tatsächlich Rückkehr zurückkehren“ können, sind Sie Wert Nachgeben und der Generator weiterhin auf die Arbeit mit ihm ist.

Nicht zu erwähnen, es ist sehr Speicher effizient, obwohl 99% der Zeit Speicher kein Problem ist.

UND, das ist der nette Teil, können Sie spezifische Logik für jede der Elemente in der $input anwenden, ohne einige seltsame hack-ish-Funktion zu tun.


Alternativen

function process_something($a){ 
    $return = []; 

    foreach($a as $b){ 
     // Some logic here 
     $return[] = $something; 
    } 

    return $return; 
    } 

Der einzige Grund, warum diese Antwort nicht ein Kommentar ist, dass es sehr selten, dass ich eine Frage zu sehen, die berechtigterweise von einem Generator profitieren würde. Dies ist einer von ihnen.


Mehr über Generatoren:

http://blog.ircmaxell.com/2012/07/what-generators-can-do-for-you.html

https://scotch.io/tutorials/understanding-php-generators

+0

Während Karol das Problem für mich gelöst hat, denke ich, dass dies eine gute Antwort ist und etwas, in das ich schauen muss, da ich überhaupt nicht von "Ertrag" wusste. – DaveHolt

+1

Es ist ziemlich neu, seit PHP 5.6 (glaube ich), es ist neu nur für PHP tho, andere Programmiersprachen verwenden regelmäßig Generatoren, wir folgen nur in ihre Fußstapfen: D – Andrew

+0

Um ehrlich zu sein, um dies zu verwenden, ich muss Teile meines Codes ändern. Im Moment habe ich die Antwort von Karol akzeptiert, weil es Fortschritte bei meinem Projekt gemacht hat, aber es wird es wert sein, diesen Ansatz in Zukunft zu verwenden, sobald ich alles aufräumen muss. Es ist ein Ansatz, von dem ich wünschte, ich wüsste, bevor ich anfing! – DaveHolt