2014-02-18 37 views
0

情況:我做了一個腳本,從數據庫中讀取數據並呈現它,以便它可以由jQuery UI操作爲選項卡。jQuery UI選項卡與PHP:用foreach和當前的迭代

守則

function renderTabs(){ 

    $_db = array(
      'host' => MYSQL_HOST, 
      'user' => MYSQL_USER, 
      'password' => '', 
      'database' => DB 
     ); 

    $_channels = array(
     'chan1'  => 'db1', 
     'chan2'  => 'db2', 
     'chan3'  =>'db3', 
     'chan4'  => 'db4' 
    ); 

    $html = ''; 

    $conn = new mysqli($_db['host'],$_db['user'],$_db['password'],$_db['database']); 

    $html .= '<div id="tabs"> 
       <ul>'; 

    foreach ($_channels as $i => $channel){ 

     while($chan = current($_channels)){ 
      echo $tab = array_search($chan,array_values($_channels)); 
      $html .= '<li><a href="#tabs-'.$tab.'">'.array_keys($_channels)[$tab].'</a></li>'; 
      next($_channels);} 

     $html .= '</ul>'; 

     $n_tab = array_search($i,array_keys($_channels)); 

     $n_tab++; 

     $results = $conn->query('SELECT * FROM table_test WHERE date BETWEEN (CURDATE() - INTERVAL 7 DAY) AND CURDATE() AND channel = \''.$channel.'\' GROUP BY id ORDER BY total DESC LIMIT 10'); 

     $html .= '<div id="tabs-'.$n_tab.'"> 
        <table style="width:100%"> 
        <tr><td>TEST</td> 
        <td>TEST COL1</td> 
        <td>TEST COL2</td> 
        <td>TEST COL3</td> 
        <td>TEST COL4</td></tr>'; 

     foreach($results as $row){ 

      $html .= '<tr><td><a href="'.$row['url'].'">'.$row['title'].'</a></td> 
        <td>'.$row['data1'].'</td> 
        <td>'.$row['data2'].'</td> 
        <td>'.$row['data3'].'</td> 
        <td>'.$row['data4'].'</td></tr>'; 
     } 

     $html .= '</table></div>'; 

    } 

    $html .= '</div>'; 

    return $html; 

} 

的HTML結構jQuery UI的需要呈現的標籤:

<div id="tabs"> 
    <ul> 
    <li><a href="#tabs-1">tab1_title</a></li> 
    <li><a href="#tabs-2">tab2_title</a></li> 
    <li><a href="#tabs-3">tab3_title</a></li> 
    </ul> 
    <div id="tabs-1"> 
    <p>content1</p> 
    </div> 
    <div id="tabs-2"> 
    <p>content2</p> 
    </div> 
    <div id="tabs-3"> 
    <p>content3</p> 
    </div> 
</div> 

的問題:我有一個問題,一個疑問。問題是隻有4個選項卡中的3個被渲染(而所有四個內容都正確生成),我不知道爲什麼。

我也使用每個()這樣的嘗試:

while($chan = each($_channels)){ 
    echo $chan[1]; 
    print_r(array_values($_channels)); 
    echo $tab = array_search($chan[1],array_values($_channels)); 
    $html .= '<li><a href="#tabs-'.$tab.'">'.array_keys($_channels)[$tab].'</a></li>';} 

,但無濟於事。

懷疑:我做了上面的嘗試,以避免再次循環訪問數組,也因爲我希望能夠通過向$ _channels數組添加元素來添加或刪除選項卡(及其生成的內容)。有沒有任何方便的方法來實現這一點,而不必迭代兩次?

感謝您的支持。

編輯:我可能已經發現了這個問題,似乎在foreach一個移動的$ _channels內部指針,這就是爲什麼當前()循環返回3個元素,而不是4 我知道的重置()但它也沒用這裏..

EDIT2:這真的是一個PHP的問題,手冊說:

除非數組是被引用,foreach指定數組的一個拷貝,而不是該數組本身運行。 foreach對數組指針有一些副作用。不要在foreach期間或之後依賴數組指針而不重置它。

那麼,我怎樣才能重置指針而不破壞代碼的其餘部分?

回答

1

進行測試,但這裏有可能爲你工作的方式:

關鍵是要分裂格式和數據收集。將你的2部分拆分爲2個數組,然後在恢復完所有部分後再做整體。

function renderTabs(){ 

    $_db = array(
      'host' => MYSQL_HOST, 
      'user' => MYSQL_USER, 
      'password' => '', 
      'database' => DB 
     ); 

    $_channels = array(
     'chan1'  => 'db1', 
     'chan2'  => 'db2', 
     'chan3'  =>'db3', 
     'chan4'  => 'db4' 
    ); 

    $html = ''; 
    $ul = array(); 
    $tabs = array(); 
    $tab = 0; 
    $conn = new mysqli($_db['host'],$_db['user'],$_db['password'],$_db['database']); 


    foreach ($_channels as $i => $channel){ 
     $ul[] = '<li><a href="#tabs-'.++$tab.'">'.$channel.'</a></li>'; 

     $results = $conn->query('SELECT * FROM table_test WHERE date BETWEEN (CURDATE() - INTERVAL 7 DAY) AND CURDATE() AND channel = \''.$channel.'\' GROUP BY id ORDER BY total DESC LIMIT 10'); 

     foreach($results as $row){ 

      $tabs[] = '<div id="tabs-'.$tab.'"> 
        <table style="width:100%"> 
        <tr><td>TEST</td> 
        <td>TEST COL1</td> 
        <td>TEST COL2</td> 
        <td>TEST COL3</td> 
        <td>TEST COL4</td></tr> 
        <tr><td><a href="'.$row['url'].'">'.$row['title'].'</a></td> 
        <td>'.$row['data1'].'</td> 
        <td>'.$row['data2'].'</td> 
        <td>'.$row['data3'].'</td> 
        <td>'.$row['data4'].'</td></tr> 
       </table></div>'; 
     } 

    } 

    $html .= '<div id="tabs">'; 
    $html .= "<ul>" . implode($ul). "</ul>"; 
    $html .= implode($tabs); 
    $html .= '</div>'; 

    return $html; 

} 
+0

是啊!有用! 但是,如果可能的話,我仍然希望聽到我的方法可能的解決方案。 謝謝! – TheHacker66