2011-06-27 144 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