2011-06-27 7 views
5

estoy funcionando en problemas con el siguiente código:Problema con arreglo

$ids = '"' . implode('", "', $crumbs) . '"'; 
$motd = array(); 
$dober = $db->query("SELECT id, name, msg, datetime FROM tbl_depts td INNER JOIN tbl_motd tm ON td.id = tm.deptid WHERE td.id IN (" . $ids . ")"); 

while ($row = $dober->fetch_array()) { 
       $motd[] = $row; 
     } 

Un print_r revela esto:

Array 
(
[0] => Array 
    (
     [0] => 1 
     [id] => 1 
     [1] => Management 
     [name] => Management 
     [2] => New Management Rule! 
     [msg] => New Management Rule! 
     [3] => 
     [datetime] => 
    ) 

[1] => Array 
    (
     [0] => 2 
     [id] => 2 
     [1] => Human Resources 
     [name] => Human Resources 
     [2] => DPS 
     [msg] => DPS 
     [3] => 
     [datetime] => 
    ) 
) 

Como tal, no puedo utilizar este código para generar cosas:

foreach ($motd[] as &$value) { 

     if ($motd['msg'] != "") { 
      if ($i == 0) { 
       ?> 


       <li><a href="#" title="content_<?php echo $value['id']; ?>" 
         class="tab active"><?php echo $value['name']; ?></a></li> 
       <? 
      } elseif ($i == $len - 1) { 
       ?> 
       <li><a href="#" title="content_<?php echo $value['id']; ?>" 
         class="tab"><?php echo $value['name']; ?></a></li> 

       <?php } else { ?> 
       <li><a href="#" title="content_<?php echo $value['id']; ?>" 
         class="tab"><?php echo $value['name']; ?></a></li> 
       <? 
      } 
      $i++; 
     } 
    } 

¿Alguna idea sobre lo que estoy haciendo mal aquí?

EDIT: Puede que le resulte más fácil de entender si lee esto primero: Optimize this SQL query

+0

tenga en cuenta que este código es vulnerable a los ataques de inyección sql. –

+0

Al igual que una nota al margen ... ¿podría 'fetch_assoc() '(http://www.php.net/manual/de/mysqli-result.fetch-assoc.php) adaptarse mejor a sus necesidades? – pinkgothic

+0

Podría perder algo, pero debería poner '$ i = 0;' antes del 'foreach', y no necesita el' [] 'después de' $ motd' allí. – kapa

Respuesta

3

En primer lugar - el código no funcionará debido a esto las dos líneas:

foreach ($motd[] as &$value) { 
    if ($motd['msg'] != "") { 

Debe utilizar $ motd, no $ motd [] en foreach y comprobar el valor $ [ 'msg'], no $ motd [ 'msg']

en segundo lugar, tratar de usar en lugar de mysql_fetch_assoc mysql_fetch_array

Tercero: no hay un valor inicial para $ i.

1

1.) Es posible que tenga un problema con foreach ($motd[] as &$value) { tal vez debería ser foreach ($motd as &$value) {

2.) Prefiero usar un bucle for() en lugar de un foreach.

for($a=0, $cnt=count($motd)-1; $a<=$cnt; $a++) 
    { 
     if($motd[$a]["msg"] != "") 
     { 
      #do something here 
     } 
    } 
1

He reescrito el código un poco. No es necesario definir todo el HTML varias veces solo porque hay un pequeño cambio en él (solo detecté active).

$i=0; 
foreach ($motd as $value) { 
    if ($value['msg'] != "") { 

     $active = $i == 0 ? ' active' : ''; //based on the value of `$i` 

     ?> 
     <li> 
     <a href="#" 
      title="content_<?php echo $value['id']; ?>" 
      class="tab<?php echo $active?>"><?php echo $value['name']; ?></a></li> 
     <?php 

     $i++; 
    } 
} 

Como he señalado en los comentarios anteriores:

  1. En foreach usted tiene que especificar la matriz en sí, no es necesario [].
  2. Inicialice siempre su $i.
  3. No necesita &$value, solo necesita esa referencia si desea modificar su matriz en el foreach.
+0

Gracias :) - fíjate que debe ser $ valor ['msg'] en la línea 2. – bear

+0

@Shamil Gracias :). – kapa