Array ausserhalb einer Funktion beschreiben?

Hallo Experten!

Folgendes versuche ich gerade:
Ich bin ein großer Fan von Kakuro (http://de.wikipedia.org/wiki/Kakuro) und wollte mir es etwas einfacher machen (und mal wieder zwischendurch PHP coden) und mir ein kleines Codeschnipsel schreiben, dass mir durch Angabe der Feldanzahl und des gewünschten Ergebnisses alle verfügbaren Zahlenkombinationen angibt.
Die etwas stupide Idee, das zu lösen ist einfach einen Array mit der Feldlänge aufzubauen, alle möglichen Kombinationen einzutragen und über array_sum() zu prüfen, ob ich ein Ergebnis habe. Kann man vermutlich auch irgendwie anders lösen, aber bleiben wir mal dabei.
Ich habe auch jetzt eine Funktion, die mir das gewünschte Ergebnis „sozusagen“ liefert:

function calErg($arrPosi, $fanzahl, $eArray, $sum)
{
 $zus=array();
 for ($h=1; $h ";
 }
 }
 return $zus;
}

$alles=calErg(0, $feldanzahl, $ergebnisarray, $ergebnis);

Ich fange meinen Array mit 0 an, übergebe die Feldanzahl, das Array, das ich betrachte und die Summe, die ich Suche. Das Array wird davor mit 1en gefüllt (weil sonst findet er auch einzelne Zahlen). Das ganze rufe ich dann entsprechend Rekursiv auf.

Nicht schön aber selten und vor allem habe ich zwei Probleme:

  1. Warum auch immer, bekomme ich jedes (?) Ergebnis zweimal angezeigt.
  2. Gibt es natürlich doppelte Ergebnisse
    (Ja, hier ist „doppelt“ und „zweimal“ anders gemeint :stuck_out_tongue:)

Für die Feldanzahl 2 und Ergebnis 3 gibt es die Ausgabe:
12
12
21
21

Beide Probleme könnte ich lösen, wenn ich meine Ergebnisarrays sortiere (ist hier auskommentiert drin für Problem 2) und dann alle in einen „globales“ Array schieben könnte (also ein Array von Arrays, ist ja grundsätzlich kein Problem) und dann mir einfach mit array_unique() das ganze einschrumpfe.

Doch wie komme ich mit der Funktion da raus? Ich habe es mit der Rückgabe $zus versucht, was nicht so wirklich funktioniert… zudem kann die Funktion ja nicht nach „draussen“ zugreifen … oder ist das irgendwie möglich und ich weiss es jetzt nicht?

Danke für Hilfestellungen!

grüße
Geisterkarle

Hallo Geisterkarle,

leider versteh ich nicht wirklich, was du machen willst, aber egal, wenn du in einer Funktion auf eine globale Variablen zugreifen willst, dann geht das so:

// Variable
$array1 = array();

function calErg($arrPosi, $fanzahl, $eArray, $sum)
{

global $array1;

$array1[] = ‚Test‘;

(…)
return $zus;
}

$alles=calErg(0, $feldanzahl, $ergebnisarray, $ergebnis);

// Ausgabe
print_r($array1);

Ich hoffe, dass ich dir helfen konnte.

Gruß Daniel

Kann man machen, ist allerdings recht unsauber.

2 moegliche Loesungen:

(a) mit Referenzen arbeiten
siehe http://www.php.net/manual/de/language.references.pas…

(b) mehrere Rueckgabewerte (als Array)
siehe http://php.net/manual/de/functions.returning-values.php

Gruss
Stefan

Hallo Geisterkarle,

Hallo!

egal, wenn du in einer Funktion auf eine globale Variablen
zugreifen willst, dann geht das so:

Hab ich inzwischen auch rausgefunden! Mach es jetzt auch so; auch wenn Kollege Stefan das „unschön“ findet :stuck_out_tongue:

leider versteh ich nicht wirklich, was du machen willst, aber

Mir tut grad das Kreuz weh, also hab ich Zeit das zu erklären :stuck_out_tongue:
Also hab ja das Spiel Kakuro erwähnt. Bei großen Kakurofeldern, die auch noch entsprechend schwierig gestaltet sind muss man - ich zumindest, sonst komm ich da nicht zum Ergebnis - erstmal in die Felder alle möglichen Zahlenkombinationen eintragen.
Eindeutige Kombinationen, wie „3 Felder und Ergebnis 24 kann nur 789 sein - muss ich nur noch die Reihenfolge finden“ hab ich im Kopf.
Hab ich dagegen 4 Felder mit Ergebnis 24, habe ich ganze 8 Möglichkeiten:
1689
2589
2679
3489
3579
3678
4569
4578

DIE hab ich jetzt nicht auswendig im Kopf! Bisher ergrübele ich mir die „mühsam“ Daher wollt ich jetzt mir in PHP kleines Programm schreiben, die mir die berechnet. Dafür baue ich jetzt ein Array auf, dass so viele Indizes hat wie Felder. Diese Indizes fülle ich jetzt einfach rekursiv 1-9 und prüfe jede Möglichkeit auf Zahleneinzigartigkeit und korrektes Ergebnis und speichere das gefundene Array in einem Ergebnisarray, das ich nochmal vereinzigartige (sonst finde ich 789 und 987 als zwei Ergebnisse, obwohl es gleich ist).

Ich hoffe, dass ich dir helfen konnte.

Bisle zu spät :wink: Aber danke trotzdem!
Hoffe konnte dir erläutern, was ich tue!

Gruß Daniel

Grüße
Geisterkarle

PS:
Falls wen jetzt mein „endgültiger“ Code interessiert:

<?php // Zu suchen:<br />$feldanzahl=4;
$ergebnis=24;

// hilfsarray für suche
$ergebnisarray=array();

// suchergebnisse
$allErg=array();

// hilfsarray mit 1en füllen
for ($i=0; $i \< $feldanzahl; $i++)
{
 $ergebnisarray[$i]=1;
}

// eigentliche suchfunktion
function calErg($arrPosi, $eArray)
{
 // globale deklarierung
 global $allErg, $feldanzahl, $ergebnis; 
 for ($h=1; $h \<= 9; $h++)
 {
 // rekursiver aufruf aller feld-positionen
 if ($arrPosi \< $feldanzahl-1)
 {
 calErg($arrPosi+1,$eArray);
 }
 $eArray[$arrPosi]=$h;
 // array auf ergebnis prüfen
 if (count($eArray) == count(array\_unique($eArray)) && array\_sum($eArray) == $ergebnis)
 {
 // sortieren
 sort($eArray);
 // in Ergebnisarry speichern
 $allErg[]=$eArray;
 // in dieser FOR-Schleife wird kein weiteres Ergebnis sein
 break;
 }
 }

}

// array\_unique für Mehrdimensionale Arrays
function super\_unique($array)
{
 $result = array\_map("unserialize", array\_unique(array\_map("serialize", $array)));

 foreach ($result as $key =\> $value)
 {
 if ( is\_array($value) )
 {
 $result[$key] = super\_unique($value);
 }
 }

 return $result;
}

// Eigentliche Suche
calErg(0, $ergebnisarray);

// Einzigartig
$allErgU=super\_unique($allErg);
// "Lücken" in Array-Indizes beseitigen
$allErgV=array\_values($allErgU);

echo " ";

// Ausgabe
if (count($allErgV) ";
 }
}

?\>