Arraydaten aus einer Funktion werden nicht zurückgegeben?

cameeel

Erfahrenes Mitglied
Bin gerade dabei ein Online-Browser-Spiel zu programmieren (keine Sorge, nicht sowas wie Galaxy Wars ;)) und stehe nun vor einem Problem.

Jedes mal, wenn der User eine Figur (bzw. Blase) auf dem Spielfeld anklickt, muss das Spielfeld neu berechnet werden. Dazu hab ich mir die Funktion "gen_gamefield()" geschrieben. Dort wird das Array, das in einer Session gespeichert wurde, eingelesen und die Daten werden überprüft.
Um das neue Spielfeld zu errechnen, müssen nun einige Blasen entfernt werden. Da es sich hierbei um eine rekurisve Funktion handeln wird, hab ich mir gedacht, dass ich diese Rechenschritte wiederrum in eine extra Funktion packe.
Die Daten werden also der Funktion "delete_bubbles()" übergeben. Das funktioniert auch noch, aber die Daten, die dort berechnet werden, werden nicht mehr an "gen_gamefield()" zurückgeben. Das heißt, das Spielfeld wird nicht aktualisiert!

Nun noch ein bisschen vom Code. Ich hoffe, damit könnt ihr mir sagen, woran das liegt.
Hinweis: bei "$gamefield" handelt es sich um ein zweidimensionales, nummerisches Array, das die Farbwerte der Blasen des Spielfeldes enthält.
Ihr könnt euch das Spiel gerne schonmal anschauen.
Wie ihr seht, wird immer nur die Blase entfernt, die angeklickt wird (weil der Befehl nicht in der delete_bubbles()-Funktion steht sondern in der gen_gamefield()-Funktion).
PHP:
<?php
	function gen_gamefield() {
  		// Lade Array Daten
  		$gamefield = $_SESSION['Spieledaten'];
  			 // Daten der angeklickten Blaße
  			$row = strip_tags($_GET['row']);
  			$col = strip_tags($_GET['col']);
  			$colour = strip_tags($_GET['colour']);
  			// ... es folgen weitere Befehle...
  
 			// Die Funktion die die umliegenen Blasen entfernen soll wird aufgerufen:
  			delete_bubbles($gamefield, $colour, $row, $col);
  
  			// ... es folgen weitere Befehle...
	}

	function delete_bubbles($gamefield, $colour, $row, $col) {
 			// ... es folgen Befehle um die umliegenen Blasen zu entfernen...
 			// Neu berechneten Daten (Spielfeld) werden zurückgegeben...
  			return $gamefield;
	}
?>

So und in "return $gamefield;" liegt, glaub ich, der Fehler, weil die Daten eben nicht zurückgegeben werden ...

Was ich bereits getestet habe:
  1. Die Daten kommen korrekt bei der Funktion "delete_bubbles()" an.
  2. Die Funktion "delete_bubbles()", die das neue Spielfeld berechnen soll, funktioniert an sich ohne Fehler.
Ich hoffe mal, ihr könnt mir helfen.
Sorry, dass das jetzt so lang wurde, aber ich glaub, die Erklärung war notwendig.

Danke,
cAm3eel.
 
Wie sieht denn der rekursive Aufruf von delete_bubbles aus? Vielleicht liegt der Fehler ja an der Stelle.

Außerdem wäre es vielleicht speicherschonender, das Spielfeld per Referenz zu übergeben.
 
Matthias Reitinger hat gesagt.:
Wie sieht denn der rekursive Aufruf von delete_bubbles aus? Vielleicht liegt der Fehler ja an der Stelle.

Außerdem wäre es vielleicht speicherschonender, das Spielfeld per Referenz zu übergeben.

Bei der rekursiven Funktion bin ich noch gar net... erst mal muss die Funktion an sich laufen. (Wenn ich den Code der in "delete_bubbles()" steht ganz normal in die "gen_gamefield()" baue funktoniert alles, deshalb weis ich ja das in der Funktion an sich kein Fehler ist sondern einfach nur die Daten nicht zurückgegeben werden...

Was genau meinst du mit "per Referenz zu übergeben"?

Danke,
cAm3eel.
 
Ein Beispiel zur Übergabe per Referenz:
PHP:
<?php

function ohneReferenz($arg)
{
	$arg = 42;
}

function mitReferenz(&$arg)
{
	$arg = 42;
}

$var = 0;

ohneReferenz($var);
echo $var; // Ausgabe: 0

mitReferenz($var);
echo $var; // Ausgabe: 42

?>
Besonders sinnvoll bei der Übergabe größerer Datenstrukturen, da nicht bei jedem Aufruf eine Kopie angelegt werden muss, sondern nur eine Referenz übergeben wird.

Zum eigentlichen Problem: Sollte der Rückgabewert des Aufrufs delete_bubbles($gamefield, $colour, $row, $col); nicht in $gamefield gespeichert werden?
 
Matthias Reitinger hat gesagt.:
Zum eigentlichen Problem: Sollte der Rückgabewert des Aufrufs delete_bubbles($gamefield, $colour, $row, $col); nicht in $gamefield gespeichert werden?

Naja das ganze soll so funktionieren:
Die Funktion delete_bubbles() wird in gen_gamefield() aufgerufen und der delete_bubbles() Funktion werden die Daten des Array $gamefield übergeben.
In delete_bubbles() wird das Array verändert (Datensätze gelöscht, verschoben usw.). Dann soll das Array zurück an die Funktion gen_gamefield() gesendet werden die dann das neue Spielfeld erstellt.

Danke übrigens für dein Beispiel. Um die Übergabe per Referenz werd ich mich kümmern sobald das eigentliche Problem gelöst ist.

cAm3eel.
 
cAm3eel hat gesagt.:
Dann soll das Array zurück an die Funktion gen_gamefield() gesendet werden die dann das neue Spielfeld erstellt.
Und genau das meinte ich mit meinem Hinweis. Meiner Meinung nach sollte es eher so aussehen:

PHP:
// Die Funktion die die umliegenen Blasen entfernen soll wird aufgerufen:
$gamefield = delete_bubbles($gamefield, $colour, $row, $col);
 
Zurück