Obtener un desplazamiento indefinido en mi matriz de PHP mientras estoy en un foreach

Necesito ayuda, aunque creo que estoy comprobando la longitud de la matriz y debería salir del bucle, sigo recibiendo advertencias en mi línea [else if ($value....] . Me estoy perdiendo algo crucial o he estado mirando este segmento de código demasiado tiempo y es obvio. Cualquier idea sería apreciada.

    $count = count($filter); //Filter is an array
    if ($count > 1 ){
        //Compare values and generate a range to choose from
        $i = 1;
        foreach($filter as $value){
            //Break the loop if at the end of the array
            if ($i >= $count){
                //throw new exception($i .' '.$count);
                break;
            }
            //if the value is smaller then the next procceding value, because they are already in order of presidence,
            //add it to our range of potentials.
            else if($value < $filter[$i]->value){
                array_push($range, key($filter));
            }
        $i++;
        }           
    }else {
        return false;
    }

preguntado el 11 de junio de 12 a las 19:06

Muestre la salida de var_dump($filter);. Si hay lagunas en su matriz o si es una matriz asociativa (índices de cadena), esto sucederá. -

¿Cuál es la advertencia que recibes? else if ($value... ? -

Aviso: Desplazamiento indefinido: 1 en //archivo yadada// línea # - pero las respuestas fueron correctas. Mis llaves no son secuenciales, derp. Gracias chicos. -

3 Respuestas

Sospecho que hay lagunas en su matriz. Prueba esto:

$filter = array_values($filter); // this will remove any gaps in the array
$count = count($filter);
if ($count <= 1)
    return false;

for ($i = 0; $i < $count; $i++)
{
    if ($i != $count-1 && $filter[$i]->value < $filter[$i+1]->value)
        array_push($range, key($filter));
}

Respondido el 11 de junio de 12 a las 19:06

Gracias, debería haberlo sabido mejor. - dbergunder

Su matriz puede tener claves no numéricas. Entonces prueba esto:

foreach($filter as $key=>$value)
{
   // test for $filter[$key];
}

O su matriz de filtro $ no contiene objetos, entonces no puede usar el -> in

$filter[$key]->value

Respondido el 11 de junio de 12 a las 20:06

prueba este código... no hay necesidad de verificar el conteo...

$range = array();
$i = 1;
foreach($filter as $value)
{
    if(isset($filter[$i]) && $value < $filter[$i]->value)
    {
        array_push($range, key($filter));
        $i++;
    }
    else
    {
        break;
    }
}

Respondido el 11 de junio de 12 a las 19:06

Me gusta esta respuesta, pero mi momento derp se señaló antes. Así que tienes mi agradecimiento. - dbergunder

Si no verifica el conteo, en la última iteración, comparará la última entrada en la matriz con un índice indefinido de la matriz. Por eso, en su ejemplo, comprueba if ($i >= $count) { break; }. - parodia3

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.