2011-06-27 95 views
5

我正在与下面的代码的问题:问题与阵列

$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; 
     } 

一个print_r的揭示这一点:

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] => 
    ) 
) 

因此,我不能使用此代码生成的东西:

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++; 
     } 
    } 

任何想法,我在做什么错在这里?

编辑:你可能会发现很容易理解,如果你读这第一:Optimize this SQL query

+0

请注意,此代码易受sql注入攻击。 –

+0

就像一个旁注......可能'fetch_assoc()'(http://www.php.net/manual/de/mysqli-result.fetch-assoc.php)更适合您的需求吗? – pinkgothic

+0

我可能会错过某些东西,但是你应该在'foreach'之前放置'$ i = 0;',并且''motd''之后不需要'[]'。 – kapa

回答

3

第一 - 因为这两条线的代码将无法正常工作:

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

你应该使用$ MOTD,没有$ MOTD []中的foreach和检查$值 '味精'],而不是$ MOTD [ '味精']

其次,尝试使用,而不是mysql_fetch_array mysql_fetch_assoc

第三 - $ i没有初始值。

1

1)你可能有foreach ($motd[] as &$value) { 的问题或许应该是foreach ($motd as &$value) {

2)我宁愿使用,而不是一个foreach一个for()循环。

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

我已经重写了你的代码。没有必要多次定义整个HTML只是因为它有一个小的变化(我只发现了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++; 
    } 
} 

正如我在以前的评论中指出:

  1. foreach你必须指定数组本身,你不需要[]
  2. 始终初始化您的$i
  3. 您不需要&$value,如果您想修改阵列中的foreach,则只需要该参考。
+0

谢谢:) - 注意,它应该是$值['味精']第2行。 – bear

+0

@Shamil谢谢:)。 – kapa