2011-06-27 38 views
5

Tôi đang chạy vào các vấn đề với đoạn mã sau:Vấn đề với mảng

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

Một print_r tiết lộ này:

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

Như vậy, tôi không thể sử dụng mã này để tạo điều:

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

Bất kỳ ý tưởng nào về những gì tôi đang làm sai ở đây?

EDIT: bạn có thể tìm thấy nó dễ dàng hơn để hiểu nếu bạn đọc này đầu tiên: Optimize this SQL query

+0

lưu ý rằng mã này dễ bị tấn công bằng cách tiêm sql. –

+0

Cũng giống như một sidenote ... có thể 'fetch_assoc()' (http://www.php.net/manual/de/mysqli-result.fetch-assoc.php) phù hợp hơn với nhu cầu của bạn? – pinkgothic

+0

Tôi có thể bỏ lỡ một cái gì đó, nhưng bạn nên đặt '$ i = 0;' trước 'foreach', và bạn không cần' [] 'sau' $ motd' ở đó. – kapa

Trả lời

3

Đệ Nhất - mã của bạn sẽ không hoạt động vì hai dòng này:

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

Bạn nên sử dụng $ motd, không $ motd [] trong foreach và kiểm tra giá trị $ [ 'msg'], chứ không phải $ motd [ 'msg']

thứ hai, cố gắng sử dụng mysql_fetch_assoc thay vì mysql_fetch_array

Thứ ba - không có giá trị ban đầu cho $ i.

1

1.) Bạn có thể có một vấn đề với foreach ($motd[] as &$value) { có lẽ nó nên foreach ($motd as &$value) {

2.) Tôi thà sử dụng một cho() vòng lặp thay vì một foreach.

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

Tôi đã viết lại mã của bạn một chút. Không cần phải xác định toàn bộ HTML nhiều lần chỉ vì có một thay đổi nhỏ trong nó (tôi chỉ phát hiện 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++; 
    } 
} 

Như tôi đã lưu ý trong các ý kiến ​​trước đó:

  1. Trong foreach bạn phải xác định mảng chính nó, bạn không cần phải [].
  2. Luôn khởi tạo $i của bạn.
  3. Bạn không cần &$value, bạn chỉ cần tham chiếu đó nếu bạn muốn sửa đổi mảng của mình trong foreach.
+0

Cảm ơn :) - thông báo rằng nó phải là $ value ['msg'] trong dòng 2. – bear

+0

@Shamil Cảm ơn :). – kapa