PHP - Kleines Problem bei Array-Vergleich
bearbeitet von Jörg ReinholzMoin!
> 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:
>
> ~~~php
> <?
> $solution_word = 'abcde';
> $provided_solution = 'acbda';
>
> // convert solution-word to array
> $aLetters = str_split(strtoupper($solution_word));
>
> // convert provided-solution to array
> $aSolution = str_split(strtoupper($provided_solution));
>
> // check solution against solution-word
> foreach ($aSolution as $ks => $vs) {
> if ($aLetters[$ks] == $vs) {
> $aStatus[] = 'T';
> } else {
> if (in_array($vs, $aLetters)) {
> $aStatus[] = 'P';
> } else {
> $aStatus[] = 'F';
> }
> }
> }
>
> // show the resluts array
> echo '<pre>';
> print_r($aStatus);
> echo '</pre>';
> ?>
> ~~~
Fangen wir mal an:
~~~php
> // convert solution-word to array
> $aLetters = str_split(strtoupper($solution_word));
>
> // convert provided-solution to array
> $aSolution = str_split(strtoupper($provided_solution));
~~~
Das Splitten ist hier überflüssig:
~~~php
<?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:
~~~php
> 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
<?php
$aLetters='abcde';
$aSolution='acbda';
$aStatus=array();
for ( $i=0; $i < strlen($aSolution); $i++ ) {
if ($aLetters[$i] == $aSolution[$i]) {
$aStatus[$i] = 'T';
} else {
if ( 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
PHP - Kleines Problem bei Array-Vergleich
bearbeitet von Jörg ReinholzMoin!
> 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:
>
> ~~~php
> <?
> $solution_word = 'abcde';
> $provided_solution = 'acbda';
>
> // convert solution-word to array
> $aLetters = str_split(strtoupper($solution_word));
>
> // convert provided-solution to array
> $aSolution = str_split(strtoupper($provided_solution));
>
> // check solution against solution-word
> foreach ($aSolution as $ks => $vs) {
> if ($aLetters[$ks] == $vs) {
> $aStatus[] = 'T';
> } else {
> if (in_array($vs, $aLetters)) {
> $aStatus[] = 'P';
> } else {
> $aStatus[] = 'F';
> }
> }
> }
>
> // show the resluts array
> echo '<pre>';
> print_r($aStatus);
> echo '</pre>';
> ?>
> ~~~
Fangen wir mal an:
~~~php
> // convert solution-word to array
> $aLetters = str_split(strtoupper($solution_word));
>
> // convert provided-solution to array
> $aSolution = str_split(strtoupper($provided_solution));
~~~
Das Splitten ist hier überflüssig:
~~~php
<?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 der count nicht die Elemente des Strings zählen will.
Das eigentliche Problem:
~~~php
> 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
<?php
$aLetters='abcde';
$aSolution='acbda';
$aStatus=array();
for ( $i=0; $i < strlen($aSolution); $i++ ) {
if ($aLetters[$i] == $aSolution[$i]) {
$aStatus[$i] = 'T';
} else {
if ( 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