会话数组被覆盖

I am working on a simple "wheel of fortune" style algorithm. The correct answer is being stored in $phrase, and the user can submit a letter to guess a part of the phrase.

My problem is that each time the user submits their guess, my session array gets blown away and doesn't dynamically update like I would like.

So ideally if the answer is "boat", and the user's first guess is "o", the following displays: "#o##

Second guess is "t", the following displays: "#o#t"

Any suggestions or comments are greatly appreciated.

<!doctype html>
<?php session_start();?>

<html>
<head>
<meta charset="UTF-8">
<title>Untitled Document</title>
</head>

<body>


    <!-- Form for user guess input -->
    <form method="post" action="wof2.php">
    Input Letter: <input type="text" name="usr_guess">
    <input type="submit" value="submit">
    </form><br/><br/><br/>

<?php

    // Set the phrase
    $phrase = "The Terminator";

    // Dump phrase into an array
    $split = str_split($phrase);

    // Counter used in the comparrison 
    $count = 0;

    if (!isset($_SESSION['answer'])) {
        $_SESSION['answer'] = array();
        foreach ($split as $char) {
            array_push($_SESSION['answer'], $char);
        }
    }

    if (isset($_POST['usr_guess'])) {

        // User's guess
        $usr_guess = $_POST['usr_guess'];

        foreach ($split as $char) {

            // Compares user guess to the answer and sets the answer in count position
            if ($usr_guess == $char) {
                    $_SESSION['answer'][$count] = $usr_guess;
                    $count++;
            }
            else {    // Checks for breaks in the word, used in accurately displaying spaces between words or # if it is a character
                if ($split[$count] == " ") {
                    $_SESSION['answer'][$count] = " ";
                    $count++;
                }
                else {
                $_SESSION['answer'][$count] = "#";
                $count++;

                }
            }
        }
    }
?>
</body>
</html>

You should store everything and check against the stored values.

// Set the phrase
$phrase = "The Terminator";

// Dump phrase into an array
$split = str_split($phrase);

// Set container if not set
if(!isset($_SESSION['phrase'])) {
        // Save phrase
        $_SESSION['phrase']['full']     =   $phrase;
        // Split phrase for checking
        $_SESSION['phrase']['split']    =   $split;
    }
// If guess set, attempt process
if (isset($_POST['usr_guess'])) {
        // If not already in array, process
        if(!in_array($_POST['usr_guess'],$_SESSION['guess']))
            // Store each guess
            $_SESSION['guess'][]        =   strip_tags($_POST['usr_guess']);
    }

// Set a container array for letter to phrase storage
// For each letter check if there are spaces
foreach($_SESSION['phrase']['split'] as $_letter) {
        if(preg_match("/\\s/",$_letter))
            $_comp[]        =   " ";
        // No spaces, check if instance of upper or lowercase letter in phrase
        else
            $_comp[]        =   (preg_grep("/".$_letter."/i",$_SESSION['guess']))? $_letter: '#';
    }       

// If no instances of # are in comp, juse echo saved phrase
if(!in_array("#",$_comp))
    echo $_SESSION['phrase']['full'];
// If # in comp, implode the current comp array
else
    echo ucwords(implode("",$_comp));

Here is a class version (just for kicks)

class   VannaWhite
    {
        public  static function Play($phrase) {
                // Dump phrase into an array
                $split  = str_split($phrase);

                // Set container if not set
                if(!isset($_SESSION['phrase'])) {
                        // Save phrase
                        $_SESSION['phrase']['full']     =   $phrase;
                        // Split phrase for checking
                        $_SESSION['phrase']['split']    =   $split;
                    }

                // If guess set, attempt process
                if (isset($_POST['usr_guess'])) {
                        // If not already in array, process
                        if(!in_array($_POST['usr_guess'],$_SESSION['guess']))
                            // Store each guess
                            $_SESSION['guess'][]        =   strip_tags($_POST['usr_guess']);
                    }

                // Set a container array for letter to phrase storage
                // For each letter check if there are spaces
                foreach($_SESSION['phrase']['split'] as $_letter) {
                        if(preg_match("/\\s/",$_letter))
                            $_comp[]        =   " ";
                        // No spaces, check if instance of upper or lowercase letter in phrase
                        else
                            $_comp[]        =   (preg_grep("/".$_letter."/i",$_SESSION['guess']))? $_letter: '#';
                    }       

                // If no instances of # are in comp, juse echo saved phrase
                if(!in_array("#",$_comp)) {
                        echo $_SESSION['phrase']['full'];
                        // Unset the session arrays ready for new word/phrase
                        self::Clear();
                    }
                // If # in comp, implode the current comp array
                else
                    echo ucwords(implode("",$_comp));
            }

        protected   static  function Clear()
            {
                unset($_SESSION['phrase'],$_SESSION['guess'],$_SESSION['answer']);
            }
    }

// Create Instance
VannaWhite::Play("The Terminator");

I was able to figure it out this morning with some simplification of my code. I was running myself in circles by continually overwriting all the contents of my session array instead of just matching characters. My next step will be to link image files to each character so it displays graphics instead of just plain html.

<?php

    // ***************************************** Game Initialization ***************************************


    // Set the phrase
    $phrase = "The Terminator";

    // Dump phrase into an array
    $split = str_split($phrase);


    // If Session array doesn't already exist, create it and dump each character of the phrase into it
    if (!isset($_SESSION['answer'])) {
        $_SESSION['answer'] = array();
        foreach ($split as $char) {
            array_push($_SESSION['answer'], $char);
        }

        $counter = 0; // Counter used to assign hidden characters to the phrase, change array contents " " if a space, "*" if a character
        foreach ($_SESSION['answer'] as $char) {
            if ($char == " ") {
                $_SESSION['answer'][$counter] = " ";
                $counter++;
            }
            else {
                $_SESSION['answer'][$counter] = "*";
                $counter++;
            }
        }
    }


    // ********************************************** Comparing Algorithm ***************************

    // Counter used in the comparrison algorithm
    $count = 0;

    // Check if user has submitted a guess
    if (isset($_POST['usr_guess'])) {

        // Dump user's guess into a variable
        $usr_guess = $_POST['usr_guess'];

        foreach ($split as $char) {

            // Compares user guess to the answer and sets the answer in count position
            if ($usr_guess == $char) {
                    $_SESSION['answer'][$count] = $usr_guess;

                    echo $_SESSION['answer'][$count];
                    $count++;
            }
            else {
                echo $_SESSION['answer'][$count];
                $count++;
            }
        }
    }
?>