Почему эта ошибка: "Notice: Uninitialized string offset"?Попытка перебрать значения массива


<form method="POST" action="Capt_Calif.php">
<?php
    //listado de los alumnos del grupo que estan en esa materia:
     foreach ($alumbosByGpoMater as $alumno): 
?>
    <tr>    
        <!-- imprime contador de registros, o numero de registros que aparecen recuperados  -->
        <td><?php if ($i <= $num_rows) {  echo $i; } ?></td>
        <!-- imprime matrticula de alumno  -->
        <td><?php echo $alumno[0];?></td>
        <!-- imprime nombre de alumno  -->
        <td><?php echo $alumno[1];?></td>
        <!-- casillas para capturar caliicaciones  e inasistencias por periodo  -->
        <!-- parcialP1= calificacion periodo e inasistencias del periodo 1  -->
        <!-- intentaba enviar un solo arreglo con ambas columnas: calificacion e inasistencias por periodo  -->
        <td><input type="text" name="parcialP1[]" class="p1" size="3"></td>
        <td><input type="text" name="parcialP1[]" class="ip1" size="3"></td>
        <td><input type="text" name="parcialP2[]" class="p2" size="3"></td>
        <td><input type="text" name="parcialP2[]" class="ip2" size="3"></td>
        <td><input type="text" name="parcialP3[]" class="p3" size="3"></td>
        <td><input type="text" name="parcialP3[]" class="ip3" size="3"></td>
        <td><input type="text" name="final[]" class="final" size="3"></td>
        <!-- parametros enviados para ser usados en la clausula where,   -->
        <td><input type="hidden" name="idgpo" value="<?php echo $alumno[7]; ?>"></td>
        <td><input type="hidden" name="idalumno" value="<?php echo $alumno[10]; ?>"></td>
    </tr>
    <?php 
        $i++;  //incrementamos contador en 1 luego de cada alumno recuperado, 
    endforeach
    ?>   
    </tbody>
    </table>    
    <button type="submit" name="formAlumno" class="btn btn-success">Guardar</button>
</div>
</form>
<?php

require '../../Model/Model_Docentes.php';

$connect = conectar(); //conexion a la bd

if ( isset($_POST['formAlumno']) && !empty($_POST['idgpo']) && !empty($_POST['idalumno']) ) {
    //var_dump($_POST['idgpo']);
    //var_dump($_POST['idalumno']);
    var_dump($_POST['parcialP1']);

    //recibiendo los parametros de grupo y alumno a quienes pertenece cada calificacion y numero de inasistencias
    $grupo      = $_POST['idgpo']; 
    $alumno     = $_POST['idalumno'];

    //recibiendo el arreglo que contiene los valores de las columnas de calificacion e inasistencias del primer periodo
    $parcialP1  = $_POST['parcialP1']; 

    if(is_array($parcialP1))
    {
        $values = array();

        foreach($parcialP1 as $fila => $valor)
        {
            //intentando recibir la calificacion del periodo1
            $p1 = mysqli_real_escape_string($connect, $valor[0]); 
            //intentando recibir num de inasitencias del periodo1
            $inasisP1 = mysqli_real_escape_string($connect, $valor[1]);
            $values[] = "('$p1', '$inasisP1')";
        }
        $sql = "UPDATE alumno_grupo SET parcial1 = '".$p1."', inasisP1 = '".$inasisP1."' WHERE idAlumno = $grupo AND idGrupo = $alumno";
        $sql .= implode(', ', $values);
        mysqli_query($connect, $sql);
    } //if is array

    //   }

}  //isset

?>
//haciendo var_dump al ingresar una calificacion y una inasistencia:
array(74) { [0]=> string(1) "9" [1]=> string(1) "0" [2]=> string(0) "" [3]=> string(0) "" [4]=> string(0) "" [5]=> string(0) "" [6]=> string(0) "" [7]=> string(0) "" [8]=> string(0) "" [9]=> string(0) "" [10]=> string(0) "" [11]=> string(0) "" [12]=> string(0) "" [13]=> string(0) "" [14]=> string(0) "" [15]=> string(0) "" [16]=> string(0) "" [17]=> string(0) "" [18]=> string(0) "" [19]=> string(0) "" [20]=> string(0) "" [21]=> string(0) "" [22]=> string(0) "" [23]=> string(0) "" [24]=> string(0) "" [25]=> string(0) "" [26]=> string(0) "" [27]=> string(0) "" [28]=> string(0) "" [29]=> string(0) "" [30]=> string(0) "" [31]=> string(0) "" [32]=> string(0) "" [33]=> string(0) "" [34]=> string(0) "" [35]=> string(0) "" [36]=> string(0) "" [37]=> string(0) "" [38]=> string(0) "" [39]=> string(0) "" [40]=> string(0) "" [41]=> string(0) "" [42]=> string(0) "" [43]=> string(0) "" [44]=> string(0) "" [45]=> string(0) "" [46]=> string(0) "" [47]=> string(0) "" [48]=> string(0) "" [49]=> string(0) "" [50]=> string(0) "" [51]=> string(0) "" [52]=> string(0) "" [53]=> string(0) "" [54]=> string(0) "" [55]=> string(0) "" [56]=> string(0) "" [57]=> string(0) "" [58]=> string(0) "" [59]=> string(0) "" [60]=> string(0) "" [61]=> string(0) "" [62]=> string(0) "" [63]=> string(0) "" [64]=> string(0) "" [65]=> string(0) "" [66]=> string(0) "" [67]=> string(0) "" [68]=> string(0) "" [69]=> string(0) "" [70]=> string(0) "" [71]=> string(0) "" [72]=> string(0) "" [73]=> string(0) "" } 

Notice: Uninitialized string offset: 1 in C:\xampp\htdocs\cebProcedular\View\Docente\Capt_Calif.php on line 28

Notice: Uninitialized string offset: 1 in C:\xampp\htdocs\cebProcedular\View\Docente\Capt_Calif.php on line 28

Notice: Uninitialized string offset: 0 in C:\xampp\htdocs\cebProcedular\View\Docente\Capt_Calif.php on line 27

Notice: Uninitialized string offset: 1 in C:\xampp\htdocs\cebProcedular\View\Docente\Capt_Calif.php on line 28

Notice: Uninitialized string offset: 0 in C:\xampp\htdocs\cebProcedular\View\Docente\Capt_Calif.php on line 27
Author: Mariano, 2016-11-01

2 answers

Проблема в этой части кода:

foreach($parcialP1 as $fila => $valor) {

Где foreach проходит через массив $parcialP1, присваивая каждое значение $valor. Внутри цикла $valor уже является элементом массива. Таким образом, $valor[0] является первым символом item, а $valor[1] является вторым символом.

Когда item массива не имеет по крайней мере двух символов, ошибка срабатывает.



Я думаю, что было бы проще разделить заметки и несуществования на 2 разных массива. Без однако мы можем решить это так, как есть.

Предполагая, что значения в массиве parcialP1[] получены, перечислены следующим образом:

$parcialP1[0]; //nota del primer alumno
$parcialP1[1]; //inasistencias del primer alumno
$parcialP1[2]; //nota del segundo alumno
$parcialP1[3]; //inasistencias del segundo alumno
//etc.

Чтобы иметь возможность перемещаться по заметкам и отсутствиям каждого ученика, мы используем следующий цикл:

$n = count($parcialP1);
$num_alumno = 1;

//bucle que avanza 2 items por cada iteración
for ($i = 1; $i < $n; $i += 2, ++$num_alumno) {
    $p1 = $parcialP1[$i - 1];
    $inasisP1 = $parcialP1[$i];
    echo "Alumno: $num_alumno \t Nota: $p1.\t Inasistencias: $inasisP1 \n";
}

Пример результата:

Alumno: 1    Nota: 9.    Inasistencias: 15 
Alumno: 2    Nota: 4.    Inasistencias: 0 
Alumno: 3    Nota: 10.   Inasistencias: 11

Этот код, вероятно, может быть реализован по-другому, но я делаю это так, чтобы его было проще понять.

пример в rextester.com

 2
Author: Mariano, 2016-11-01 20:31:04

Я оставляю вам более простое решение.

Сначала вы должны изменить в своем HTML атрибут name inputs следующим образом:

<input type="text" name="parcial[<?php echo $i-1; ?>][]" class="p1" size="3">
<input type="text" name="parcial[<?php echo $i-1; ?>][]" class="ip1" size="3">
<input type="text" name="parcial[<?php echo $i-1; ?>][]" class="p2" size="3">
<input type="text" name="parcial[<?php echo $i-1; ?>][]" class="ip2" size="3">
<input type="text" name="parcial[<?php echo $i-1; ?>][]" class="p3" size="3">
<input type="text" name="parcial[<?php echo $i-1; ?>][]" class="ip3" size="3">

Переменная $i Вы запустили ее с 1 поэтому я вычитаю ее, чтобы начать index массива 0;

И здесь вы передаете значения каждого ученика в foreach:

if (isset($_POST['formAlumno']) && !empty($_POST['idgpo']) && !empty($_POST['idalumno'])) {        

    $grupo   = $_POST['idgpo'];
    $alumno  = $_POST['idalumno'];        
    $parcial = $_POST['parcial'];

    if (is_array($parcial)) {

        foreach ($parcial as $value) {

            $p1 = mysqli_real_escape_string($connect, $value[0]); // campo 1
            $inasisP1 = mysqli_real_escape_string($connect, $value[1]); ; // campo 2

            $sql = " UPDATE alumno_grupo SET parcial1 = '".$p1."', inasisP1 = '".$inasisP1."' WHERE idAlumno = $grupo AND idGrupo = $alumno ";
            mysqli_query($connect, $sql);
        }
    }
}
 2
Author: Black Sheep, 2016-11-01 23:51:41