Optimice la división de los resultados de mysql_fetch_array en secciones HTML

Estoy obteniendo una variedad de nombres de animales, tipos, edades, etc. de una base de datos MySQL. Quiero dividirlos en secciones para edades como esta ...

Ages 5 - 10
Dog named Brian
Cat named Kitty
Dog named Buster

Ages 10+
Cat named Moody
Dog named Milo

Así es como lo estoy haciendo en este momento (la consulta ya está ordenada por edad):

while ($results = mysql_fetch_array($animals) {

if (($results[age] <= 10 && $results[age] >= 5) && !$head1 && !$head1display) {
    $head1 = 'Ages 5 to 10<br />';
    $head1display++;
} else $head1  = NULL;

if ($results[age] > 10 && !$head2 & !$head2display) {
    $head2 = 'Ages 10+<br />';
    $head2display++;
} else $head2  = NULL;  

echo $head1.$head2.$results[type].' named '.$results[name].'<br />';

}

¿Hay una mejor manera de hacer esto? Tenga en cuenta que no quiero tener dos consultas o dos bucles ...

preguntado el 08 de noviembre de 11 a las 18:11

3 Respuestas

Sugeriría usar la agrupación / ordenación en su SQL para buscar los animales que ya están de la manera correcta, como:

$sql = "select type, name, if(age<5, 'Ages <5', if(age<10, 'Ages 5 - 10', 'Ages 10+)) "heading"
        from animals
        order by age";

Luego, en su php puede hacer una salida casi directa:

$heading = '';
while ($results = mysql_fetch_array($animals) {
    if($results['heading'] != $heading) {
        $heading = $results['heading'];
        echo '<br/>' . $heading . '<br/>';
    }
    echo $results['type'].' named '.$results['name'].'<br />';
}

respondido 08 nov., 11:22

Probablemente sea más fácil de leer con este método, pero no estoy seguro de cuánto está optimizado. También asumí $ resultado ['nombre'] para el nombre del animal

$younger = array();
$older = array();

while ($results = mysql_fetch_array($animals) {
    if ($results['age'] <= 10 && $results['age'] >= 5) {
        $younger[] = $result['type'].' named '.$result['name'];
    }

    if ($results['age'] > 10) {
        $older[] = $result['type'].' named '.$result['name'];
    }
}

if (count($younger)) {
    echo 'Ages 5 to 10<br />';
    join('<br />', $younger);
}

if (count($older)) {
    echo 'Ages 10+<br />';
    join('<br />', $older);
}

respondido 19 nov., 11:20

Hola Samura, no estaba trabajando en eso al mismo tiempo. El suyo es similar, pero movería $ arr1 y $ arr2 fuera del ciclo while, ya que se restablecerán en cada iteración. Definitivamente, el tuyo se publicó antes que el mío y tiene el mismo patrón lógico, por lo que si cualquiera de ellos fuera aceptado, debería ser el tuyo. - Jason Brumwell

no. tienes razón. ¡El mío tiene un gran error! Corrigiendo de todos modos +1 - Samura

Hubo algunos errores en su código como:

$results[type].' named '.$results[type]

que cambié a:

$results[type].' named '.$results[name]

Esto solo funciona si tiene un name columna en su base de datos - cámbiela en consecuencia.

$arr1 = array();
$arr2 = array();  
while ($results = mysql_fetch_array($animals)) {

  if ($results['age'] <= 10 && $results['age'] >= 5)
    $arr1[] =  $results['type'].' named '.$results['name'];
  elseif($results['age'] > 10)
    $arr2[] =  $results['type'].' named '.$results['name'];
}

echo (sizeof($arr1)) ? 'Ages 5 to 10<br />'. implode('<br/>', $arr1).'<br/>' : '' . (sizeof($arr2)) ? 'Ages 10+<br />'. implode('<br/>', $arr2).'<br/>' : '';

respondido 08 nov., 11:23

Me gusta su uso de matrices e impresión fuera del ciclo, sin embargo, siento que esto no está totalmente optimizado ya que hay duplicación de impresión dos veces ... - 0pt1m1z3

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