Replace a letter with multiple instances in a word once in php array

2 posts by 2 authors in: Forums > CMS Builder
Last Post: April 30, 2015   (RSS)

By dm - April 28, 2015

I have created a word game in cmsb where users are presented with a randomly selected word in a foreign language and then have to fill in missing letters (which depending on the word length are sometimes randomly removed or sometimes all letters are removed) from the english version of these words into form input fields which are later submitted to extra fields in the user accounts in the database via a form for checking...

The code below works ok except for when a word has more than one instance of a particular letter for examples the word "Bees"

For example it will go through find "e" but then replace both instances of the letter "e" with either

<input type="text" name="question_1_letter_1" class="inputs" maxlength="1" value="" />

or

<input type="text" name="question_1_letter_2" class="inputs" maxlength="1" value="" />

What I really want is for it to just replace once the first "e" it finds so one instance of the letter "e" is replaced by

<input type="text" name="question_1_letter_1" class="inputs" maxlength="1" value="" />

and the other instance is replaced with

<input type="text" name="question_1_letter_2" class="inputs" maxlength="1" value="" />

here is the main code

$one = "question_1_letter_$key1";
$two = "question_1_letter_$key2";
$three = "question_1_letter_$key3";
$four = "question_1_letter_$key4";

$string = Bees;

$selected_letter1 = B;
$selected_letter2 = e;
$selected_letter3 = e;
$selected_letter4 = s;

$Find = Array($selected_letter1, $selected_letter2, $selected_letter3, $selected_letter4);

$Replace = Array(
"<input type=\"text\" name=\"$one\" class=\"inputs\" maxlength=\"1\" value=\"\" />",
"<input type=\"text\" name=\"$two\" class=\"inputs\" maxlength=\"1\" value=\"\" />",
"<input type=\"text\" name=\"$three\" class=\"inputs\" maxlength=\"1\" value=\"\" />",
"<input type=\"text\" name=\"$four\" class=\"inputs\" maxlength=\"1\" value=\"\" />"
);

$New_string = strtr($string, array_combine($Find, $Replace));

echo $New_string;

Hope that makes sense! Im still very much a novice php programmer and stuck as to how I can achieve this and may well be overlooking a much simpler solution that I am currently unaware of... if anyone can lend a hand and give me some pointers it would be greatly appreciated!!

By gregThomas - April 30, 2015

Hey dm,

So you're trying to replace the first occurrence of a letter with the an input, then create a custom named input for each letter that gets replaced. I think this would be the easiest way to integrate this feature:

<?php

$word           = "diplodocus";  //The word we're testing the user on.
$replaceLetters = array('p', 'o'); //The letters we're going to replace.
$wordArray      = str_split($word); //This function will turn a string into an array, eg: array('d', 'i', 'p', 'l' etc.

//Cycle through the letters in our word.
foreach($wordArray as $letter){

  //If the letter is in our replace letters array, add it's key to the key variable and enter the if statement...
  if(($key = array_search($letter, $replaceLetters)) !== false){

    //Output the input, use the key as the unique identifier.
    echo "<input type=\"text\" name=\"question_1_letter_$key\" class=\"inputs\" maxlength=\"1\" value=\"\" />";

    //Remove this value from the replaceLetters array, as we've now set it.
    unset($replaceLetters[$key]);

  //If the letter isn't in the array, then display it.
  }else{
    echo $letter;
  }
}

?>

I've used the key value from the $replaceLetters array as the unique key value for the input. The advantage of this is that when the user submits the form it will be easier to detect if the user has entered the correct value or not. 

Let me know if you have any questions about how this code works, or how to integrate it.

Cheers,

Greg

Greg Thomas







PHP Programmer - interactivetools.com