Willkommen auf dem Portal für Mediengestalter
|
|
Autor |
Nachricht |
AndiN
Threadersteller
Dabei seit: 31.05.2005
Ort: -
Alter: 41
Geschlecht:
|
Verfasst Sa 15.12.2007 02:43
Titel Kombinationen mit PHP ausgeben |
|
|
Hallo zusammen,
ich stehe vor folgendem Problem:
Ich habe ein array mit 3 Symbolen (X, Y, Z).
Nun möchte ich Arrays erzeugen die jeweils 8 Einträge lang sind.
Diese Arrays möchte ich mit allen möglichen Kombinationen der o.g. 3 Symbole füllen.
Jede Kombination soll dabei nur einmal ausgegeben werden.
Ausgabebeispiele:
$a1 = array(X,X,X,X,X,Y,Y,X);
$a2 = array(Y,X,Y,Z,Z,Z,Z,X);
$a3 = array(X,Y,Z,Z,X,Y,Y,X);
usw.
Ein X ist von einem anderen X nicht unterscheidbar.
Es werden also rein rechnerisch 3^8 Arrays erstellt.
Wie kriege ich das mit PHP hin?
|
|
|
|
|
Kraat
Dabei seit: 05.10.2006
Ort: Köln
Alter: 42
Geschlecht:
|
Verfasst Sa 15.12.2007 09:37
Titel
|
|
|
Ich würde dir erlaubten Symbole vorher definieren: Also "x,y,z";
diese kannst Du dann jeweils mit der funktion rand(); in dein Array füllen..
Das ist nur der erste Gedanke, aber es ist noch früh
|
|
|
|
|
Anzeige
|
|
|
sidisinsane
Dabei seit: 30.01.2006
Ort: Hamburg
Alter: 52
Geschlecht:
|
Verfasst Sa 15.12.2007 10:24
Titel
|
|
|
Das ganze nennt sich Permutation. Hier eine Funktionsreihe dazu:
Code: | function perm($chars,$num)
{
$last = str_repeat($chars{0},$num);
$result = array();
while($last != str_repeat(lastChar($chars),$num))
{
$result[] = $last;
$last = addChar($chars,$last,$num-1);
}
$result[] = $last;
return $result;
}
function addChar($digits,$string,$char)
{
if($string{$char} <> lastChar($digits))
{
$string{$char} = $digits{strpos($digits,$string{$char})+1};
return $string;
}else{
$string = changeAll($string,$digits{0},$char);
return addChar($digits,$string,$char-1);
}
}
function lastChar($string)
{
return $string{strlen($string)-1};
}
function changeAll($string,$char,$start=0,$end=0)
{
if($end==0) $end=strlen($string)-1;
for($i=$start; $i<=$end; $i++)
{
$string{$i} = $char;
}
return $string;
} |
Dein Ausgabecode sähe dann so aus:
Code: | // Zeichen und Länge der Sequenz definieren und Funktion initieren
$array = perm("xyz",8);
// Zufallswiedergabe der Sequenzen
shuffle($array);
// Neue Namensgebung beginnt mit 1
$i2 = 1;
// Alle Ergebnisse formatiert ausgeben
for($i=0; $i<count($array); $i++)
{
$format = "\$a%d = array(%s);<br />\n";
printf($format,$i2++,$array[$i]);
} |
Um genau Deiner Vorgabe zu entsprechen fehlen noch die Kommata zwischen den einzelnen Zeichen. Wie Du das hinbekommst mußt Du selber schauen. Aber dies dürfte mehr als ein Anfang sein.
|
|
|
|
|
taste of ink
Dabei seit: 14.06.2005
Ort: Hamburg
Alter: 39
Geschlecht:
|
Verfasst Sa 15.12.2007 11:22
Titel
|
|
|
Also. Du hast 3 Symbole und möchtest alle Möglichkeiten mit acht Stellen erzeugen. Das sind 6561. Letztendlich hast du eine Art Zahlensystem mit der Basis 3 (Es gibt also nur die Werte 0, 1, 2). Jetzt musst du die Zahlen von 0-6560 einfach in das Zahlensystem umwandeln was die 3 als Basis hat. Und schon hast du alle Möglichkeiten. Am Ende ersetzt du die Zahlen 0, 1 und 2 durch deine gewünschten Symbole und Fertig. Dabei musst du darauf achten dass du immer alle acht stellen benutzt. Im Dezimalsystem müsstest du aus der Zahl 123 einfach eine achtstellige Zahl in der Form 00000123 erzeugen. Ich würde das ganze aber in ein array packen. das ist viel einfacher zu handeln.
Ich hab da mal was vorbereitet (Vorher am besten in den Editor kopieren und Codeformatierung machen):
Code: | <?php
// Anzahl der verschiedenen Symbole
$Base = 3;
// Werte der Symbole
$SymbolValues = array(
"0" => "X",
"1" => "Y",
"2" => "Z"
);
// Länge der Zeichenkette
$Lenght = 8;
// Anzahl der verschiedenen Möglichkeiten
$Size = pow($Base, $Lenght);
// Ausgabetest der Parameter
echo "Basis: ".$Base."<br />";
echo "Länge: ".$Lenght."<br />";
echo "Möglichkeiten: ".$Size."<br /><br />";
// Das große array mit allen möglichen Symbolkombinationen
$AllSymbols = array();
// Jede Mögliche Zahl durchlaufen und in das entsprechene Zahlensystem konvertieren
for($i=0; $i<=$Size-1; $i++){
// Die derzeitige Symbolenkombination
$Symbols = array();
// Divident Startwert
$Dividend = $i;
// Umrechnung ins Zielzahlensystem
do{
// den Rest der Division ist der letzte Wert der Zahl
$Rest = $Dividend%$Base;
$Symbols[] = $Rest;
// Neuen Dividend errechnen und abrunden (also ohne rest)
$Dividend = $Dividend/$Base;
$Dividend = floor($Dividend);
// Solange der Divident nicht 0 ist, weiter rechnen
}while($Dividend>0);
// Wenn die Zahl nicht die gewünschte länge hat, mit 0 auffüllen
if(count($Symbols)<$Lenght){
$Difference = $Lenght-count($Symbols);
$ArrayFill = array_fill(0, $Difference, (string)"0");
$Symbols = array_merge($Symbols, $ArrayFill);
}
// Umkehren der Symbolkombination (Die Zahl wird ja von hinten nach vorne aufgebaut)
$Symbols = array_reverse($Symbols);
// Die Zahelnwerte durch die definieren Symbole ersetzen
$Symbols = str_replace(array_keys($SymbolValues), array_values($SymbolValues), $Symbols);
// speichern
$AllSymbols[$i] = $Symbols;
// Werte zurücksetzen
unset($Symbols);
unset($Dividend);
unset($Rest);
unset($FillStart);
unset($FillLenght);
}
// Ausgabetest des Fertigen Array
foreach($AllSymbols as $Position=>$Row){
// Position des Array ausgeben
echo $Position;
echo " => ";
// Symbolkombination ausgeben
foreach($Row as $Value){
echo $Value." ";
}
echo "<br />";
}
?> |
|
|
|
|
|
AndiN
Threadersteller
Dabei seit: 31.05.2005
Ort: -
Alter: 41
Geschlecht:
|
Verfasst Sa 15.12.2007 13:55
Titel
|
|
|
*runter vom Schlau steige auf dem ich stand*
DANKE !!! .... man bin ich doof.
Soo... dann mache ich mir jetzt mal Gedanken um die Ausgabe und schaue wie toll ich mit PHP zeichnen kann.
|
|
|
|
|
|
|
|
Ähnliche Themen |
Web Font kombinationen
[PHP] Textdatei mit BOM ausgeben?
Datenbank ausgeben
[PHP] Whitespace mit ausgeben
Zufallstext ausgeben
PHP - Dateinamen auslesen + ausgeben
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|