【问题标题】:Trying to access array offset on value of type int - problem with for loop尝试访问 int 类型值的数组偏移量 - for 循环的问题
【发布时间】:2022-02-14 02:03:04
【问题描述】:

我创建了一个带有 php 会话的策划游戏。我以 contador 的名义存储了一个柜台。

当我每次用户尝试输入这样的输入时尝试迭代和打印时: 1。你的数字是... 2. 你的号码是... 3. 你的号码是……等等

我收到此错误:

! ) 注意:尝试访问第 64 行 C:\xampp\htdocs\PhpProject4\juego.php 中 int 类型值的数组偏移量

这是会话代码

// abrimos sesion siempre arriba del todo php para que no de errores
session_start();

// initialize session variables
$_SESSION['logged_in_user_id'] = '1';
$_SESSION['logged_in_user_name'] = 'Paco';

//recogo los datos enviados por el metodo post
if (isset($_POST["enviar"])) {

    //compruebo que no esten vacios los datos
    if (($_POST['numero1'] === '') && ($_POST['numero2'] === '') && ($_POST['numero3'] === '') && ($_POST['numero4'] === '')) {
        //si estan vacios me sale el error siguiente y me muestra un boton para volver atras
        echo "Tienes que escribir numeros";
        ?>
        <html lang="es">
        <head>
            <title>Juego Mastermind</title>
        </head>
        <body>
        <br>
        <a href="juego.php">Volver</a>
        </body>
        </html>
        <?php
    } else {
        //if(is_numeric){
        //guardo cada numero en una variable
        $_SESSION['numero1'] = $_POST['numero1'];
        $_SESSION['numero2'] = $_POST['numero2'];
        $_SESSION['numero3'] = $_POST['numero3'];
        $_SESSION['numero4'] = $_POST['numero4'];

        //le doy +1 a contador y lo guardo en sesion
        if (!isset($_SESSION['contador'])){
            $_SESSION['contador'] = 1;
        }else{
            $_SESSION['contador']+=1;
        }




        //declaro el array
        $numerosPedidos = [];

        //meto los datos en el array
        array_push($numerosPedidos, $_SESSION['numero1'], $_SESSION['numero2'], $_SESSION['numero3'], $_SESSION['numero4']);

        //guardo el array de numeros pedidos
        $_SESSION['numerosPedidos'] = $numerosPedidos;


        //recibo el array de numeros aleatorios
        $arrayAleatorios = $_SESSION['numerosAleatorios'];


        //paso heridos y muertos al otro archivo php
        $_SESSION['muertos'] = buscarMuertos($numerosPedidos, $arrayAleatorios);
        $_SESSION['heridos'] = buscarHeridos($numerosPedidos, $arrayAleatorios);

        //session_destroy();

        //vuelvo al php juegos donde vuevlo a comprobar y muestro datos por pantalla
        header("Location:juego.php");
    }
}

//funcion buscar muerto que devuelvo la cantidad
function buscarMuertos($numerosPed, $numerosAle)
{
    //declaro el numero de muertos
    $muertos = 0;
    //hago un bucle para comprobar que esten en la misma posicion
    for ($i = 0; $i < 4; $i++) {
        if ($numerosPed[$i] == $numerosAle[$i]) {
            $muertos++;
        }
    }
    return $muertos;
}

//funcion buscar heridos que devuelve la cantidad
function buscarHeridos($numerosPed, $numerosAle)
{
    //declaro el numero de heridos
    $heridos = 0;

    //hago un bucle para comprobar numero de heridos
    for ($i = 0; $i < 4; $i++) {
        //primero comprouebo que el numero que quiero esta en ambos arrays
        if (in_array($numerosPed[$i], $numerosAle)) {
            //despues comrpuebo que esos numeros esten en posiciones diferentes
            if ($numerosPed[$i] != $numerosAle[$i]) {
                $heridos++;
            }

        }

    }
    return $heridos;
}

这是游戏代码

<?php
//abrimos sesion al principio para que no falle
session_start();

$usuario = $_SESSION['usuario'];
//compruebo que entre datos de usuario para acceder, si no da error y termina el programa
if ($usuario == null || $usuario = "") {
    echo "Debes escribir un nombre de usuario para acceder";
    die();
}

/*   Si no existe la varaible numeroaleatorios dentro de la sesion la creo, en caso contrario la mantengo para que no cambie el numero
     cada vez que cambio de sesion*/
if (!isset($_SESSION['numerosAleatorios'])) {
    //generamos los numeros con un rango del 0 al 9 y los guardo en un array de forma aleatoria
    $numeros = range(0, 9);
    shuffle($numeros);

    //los hacemos aleatorios en un array pero tienen 9 posiciones por lo que solo voy a usar las 4 primeras y son las unicas que extraigo
    for ($i = 0; $i < 4; $i++) {
        $aleatorios[$i] = $numeros[$i];
    }

    //creo el array para enviarlo a sesion.php y alli hacer comprobaciones
    $_SESSION['numerosAleatorios'] = $aleatorios;
} else {
    //establezco aleatorios de nuevo para que funcione y no de errores el codigo
    $aleatorios = $_SESSION['numerosAleatorios'];
    ?>
    <!--            genero el HTML              -->
    <html lang="es">
    <head>
        <title>Juego Mastermind</title>
    </head>
    <body>
    <h3>Bienvenido de nuevo <?php echo $_SESSION['usuario'] ?></h3>
    <!--Imprimo las 4 primeras cifras del array numeros que son las que voy a usar-->
    <h2>Numero: <?php print_r($aleatorios[0] . $aleatorios[1] . $aleatorios[2] . $aleatorios[3]) ?></h2>
    <h1>Mastermind Juego de los muertos y heridos</h1>
    <h2>Registro de jugadas</h2>
    <?php
    //si esta creada la sesion contador entonces me hace el proceso de mostrarme la informacion
    if (isset($_SESSION['contador'])) {

//        paso el contador a una variable
        $contador = $_SESSION['contador'];

        //si el numero de muertos es menor que cuatro muestro por pantalla, si es 4 reenvio a otra sesion donde muestro que ha ganado
        if ($_SESSION['muertos'] < 4) {
//          hago un bucle para escribir por pantalla los numeros que lleva
            /*
            foreach ($_SESSION as $sesion){
                //aqui transformo el array en un string para que me lo muestre sin problemas mas adelante
                $numerosTransformados = implode("", $_SESSION['numerosPedidos']);

                echo "<p>".$contador.". Con el numero introducido: " . $numerosTransformados . " tienes " . $_SESSION['muertos'] .
                    " muertos y " . $_SESSION['heridos'] . " heridos" . "</p>";
            }*/

            for ($i=0; $i<$contador; $i++){
                //aqui transformo el array en un string para que me lo muestre sin problemas mas adelante
                $numerosTransformados = implode("", $_SESSION['numerosPedidos']);

                echo "<p>".$contador[$i].". Con el numero introducido: " . $numerosTransformados[$i] . " tienes " . $_SESSION['muertos'] .
                    " muertos y " . $_SESSION['heridos'] . " heridos" . "</p>";
            }
        } else if ($_SESSION['muertos'] == 4) {
            header("Location:ganado.php");
        }
    }
    ?>
    <form method="POST" action="sesion.php">
        <p>Introduce Numeros</p>
        <label for="numero1">
            <input type="number" min="0" max="9" name="numero1">
        </label>
        <label for="numero2">
            <input type="number" min="0" max="9" name="numero2">
        </label>
        <label for="numero3">
            <input type="number" min="0" max="9" name="numero3">
        </label>
        <label for="numero4">
            <input type="number" min="0" max="9" name="numero4">
        </label>

        <button type="submit" name="enviar" value="enviar" id="enviar">Enviar</button>
    </form>
    <a href="cerrarSesion.php">Cerrar sesion</a>
    </body>
    </html>
    <?php
}
?>

非常感谢您

【问题讨论】:

    标签: php for-loop session


    【解决方案1】:

    错误信息很清楚。第 64 行就是这一行:

            echo "<p>".$contador[$i]." // followed by more strings
    

    但是$contador 是一个整数,而不是一个数组。我们可以看到您在该行之前(正确地)将 is 视为整数:

        for ($i=0; $i<$contador; $i++){
    

    所以访问$contador[$i] 毫无意义。我不知道你想做什么,但将其替换为 $contador 将解决错误。

    然后,出于同样的原因,您可能会得到$numerosTransformados[$i] 的意外输出。那不是一个数组,……它是一个字符串。所以这将产生索引$i处的字符。

    【讨论】:

    • 感谢 trincot。我想要做的是每次用户选择一个数字加上尝试次数时在屏幕上打印。比如:1. 你的号码是...... 2. 你的号码是......等等
    猜你喜欢
    • 2023-02-23
    • 2021-07-23
    • 2020-05-20
    • 2020-09-18
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多