Pregunta

Tengo una matriz que contiene las categorías para un artículo en particular ($ link_cat). Luego estoy usando mysql_fetch_array para imprimir todas las categorías disponibles en una lista con casillas de verificación. Mientras hace esto, quiero que compare el valor en el que está, con un valor de la otra matriz. Si hay una coincidencia, significa que una de las categorías se aplica a este artículo y debe imprimir una línea de código para aplicar el atributo marcado. ¡genial! excepto que no funciona = [

    while ( $row = mysqli_fetch_array($results, MYSQLI_ASSOC) ){
    $cat[$i] = $row['category'];
    $cat_id[$i] = $row['cat_id'];

    echo '<li><input type="checkbox" ';

    $catCount = count($link_cat);
    for ($ct = 0; $ct < $catCount; $ct++){
        if ($cat_id[$i] == $link_cat[$ct]){ 
            echo 'checked="checked" ';
        }
    }

    echo 'name="' . $cat_id[$i] . '" />' . $cat[$i] . '</li>';

    $i++;
}

Nunca antes había hecho un bucle anidado (sospecho que ese es el problema).

El problema parece ser que cuando esto se ejecuta, $ link_cat [0], que tendrá la primera categoría para verificar, no se registra. Viene en blanco. La impresión de variables dentro del bucle for confirmó esto. Cualquier otro [1] [2] etc., está bien. Es solo [0]. ¿Pero por qué? No parece tener ningún sentido. Sé que hay algo allí, porque imprimí el contenido de la matriz a medida que lo llenaba, solo para verificar. Sin embargo, no solo se muestra durante el ciclo. ¿Alguna idea?

¿Fue útil?

Solución

ligera corrección de errores (y cambio de estilo descarado): su versión puede imprimir marcada = " marcada " varias veces. ¿ $ cat y $ cat_id deben ser matrices?

while ( $row = mysqli_fetch_array($results, MYSQLI_ASSOC) ) {
    $cat = $row['category'];
    $cat_id = $row['cat_id'];

    echo '<li><input type="checkbox" ';
    if ( in_array($cat_id, $link_cat) ) {
        echo 'checked="checked" ';
    }
    echo "name='$cat_id' />$cat</li>";
}

Para una situación en la que uno normalmente arrojaría un depurador a un problema, me gusta agregar un buen print_r en un bloque de comentarios (ver fuente para salida de depuración, más seguro en sitios live-ish).

echo '<!-- ' . print_r($link_cat, TRUE) . ' -->';

Otros consejos

Si bien originalmente estaba muy equivocado acerca del bucle de la matriz que necesitaba un reinicio, no puedo evitar la sensación de que recorrer la matriz no es la forma más rápida de hacer lo que buscas.

Quizás array_search lo haría, o tal vez array_key_exists . in_array parece un ganador, pero no pensé en

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top