Jörg Reinholz: PHP - Kleines Problem bei Array-Vergleich

Beitrag lesen

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';

// 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:


> // 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
$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