Moin!
für ein kleines Ratespiel möchte ich das Lösungswort mit dem Lösungsvorschlag des Spielenden vergleichen, das klappt soweit auch ganz gut bis auf eine kleine Unschönheit wenn im Lösungsvorschlag ein Buchstabe doppelt vorkommt.
Hier mal der bisherige Quelltext:
<?
$solution_word = 'abcde';
$provided_solution = 'acbda';
$aLetters = str_split(strtoupper($solution_word));
$aSolution = str_split(strtoupper($provided_solution));
foreach ($aSolution as $ks => $vs) {
if ($aLetters[$ks] == $vs) {
$aStatus[] = 'T';
} else {
if (in_array($vs, $aLetters)) {
$aStatus[] = 'P';
} else {
$aStatus[] = 'F';
}
}
}
echo '<pre>';
print_r($aStatus);
echo '</pre>';
?>
Fangen wir mal an:
>
> $aLetters = str_split(strtoupper($solution_word));
>
>
> $aSolution = str_split(strtoupper($provided_solution));
Das Splitten ist hier überflüssig:
<?php
$s='Hallo';
echo $s[0], $s[strlen($s)-1], "\n";
Die Ausgabe von "Ho" besagt, dass ein String "Array genug" ist. Allerdings musst Du die Länge mit strlen fest stellen, weil count() nicht die Elemente des Strings zählen will. Ein String ist eben zugleich doch kein Aarray ...
Das eigentliche Problem:
> foreach ($aSolution as $ks => $vs) {
Das ist die Ursache Deines Problems, denn es entsteht ein Hash. Kommt ein Buchstabe doppelt vor, wird das erste Element mit diesem Key nur überschrieben, kein weiteres angelegt.
Benutze einen Iterator:
<?php
$aLetters='abcde';
$aSolution='acbda';
$aStatus=array();
for ( $i=0; $i < strlen($aSolution); $i++ ) {
if ($aLetters[$i] == $aSolution[$i]) {
$aStatus[$i] = 'T';
} elseif ( false !== strpos($aLetters, $aSolution[$i]) ) {
$aStatus[$i] = 'P';
} else {
$aStatus[$i] = 'F';
}
}
echo '<pre>', implode('', $aStatus), '</pre>', "\n";
sollte also erst mal die gesuchte Lösung sein. Du musst aber noch was mit der Länge der Antwort machen ...
Jörg Reinholz