mediengestalter.info
FAQ :: Mitgliederliste :: MGi Team

Willkommen auf dem Portal für Mediengestalter

Aktuelles Datum und Uhrzeit: Do 28.03.2024 17:18 Benutzername: Passwort: Auto-Login

Thema: Kombinationen mit PHP ausgeben vom 15.12.2007


Neues Thema eröffnen   Neue Antwort erstellen MGi Foren-Übersicht -> Programmierung -> Kombinationen mit PHP ausgeben
Autor Nachricht
AndiN
Threadersteller

Dabei seit: 31.05.2005
Ort: -
Alter: 41
Geschlecht: Männlich
Verfasst Sa 15.12.2007 02:43
Titel

Kombinationen mit PHP ausgeben

Antworten mit Zitat Zum Seitenanfang

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? * Keine Ahnung... *
  View user's profile Private Nachricht senden
Kraat

Dabei seit: 05.10.2006
Ort: Köln
Alter: 42
Geschlecht: Männlich
Verfasst Sa 15.12.2007 09:37
Titel

Antworten mit Zitat Zum Seitenanfang

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 * Mal bisschen die Nase pudern... *
  View user's profile Private Nachricht senden
Anzeige
Anzeige
sidisinsane

Dabei seit: 30.01.2006
Ort: Hamburg
Alter: 52
Geschlecht: Männlich
Verfasst Sa 15.12.2007 10:24
Titel

Antworten mit Zitat Zum Seitenanfang

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.
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
taste of ink

Dabei seit: 14.06.2005
Ort: Hamburg
Alter: 39
Geschlecht: Männlich
Verfasst Sa 15.12.2007 11:22
Titel

Antworten mit Zitat Zum Seitenanfang

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 />";
}

?>
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
AndiN
Threadersteller

Dabei seit: 31.05.2005
Ort: -
Alter: 41
Geschlecht: Männlich
Verfasst Sa 15.12.2007 13:55
Titel

Antworten mit Zitat Zum Seitenanfang

*runter vom Schlau steige auf dem ich stand*


DANKE !!! .... man bin ich doof. Menno!

Soo... dann mache ich mir jetzt mal Gedanken um die Ausgabe und schaue wie toll ich mit PHP zeichnen kann. Grins
  View user's profile Private Nachricht senden
 
Ähnliche Themen Web Font kombinationen
[PHP] Textdatei mit BOM ausgeben?
Datenbank ausgeben
[PHP] Whitespace mit ausgeben
Zufallstext ausgeben
PHP - Dateinamen auslesen + ausgeben
Neues Thema eröffnen   Neue Antwort erstellen
MGi Foren-Übersicht -> Programmierung


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.