循环(另一个)循环(未通过ID连接)Smarty

时间:2014-01-29 01:12:46

标签: php arrays templates loops smarty

请,我需要一些帮助,我是新的Smarty用户,但我被困在这约5天,请一些有经验的用户帮助我。

以下是我尝试转换的PHP代码示例: 代码:

$numone = "1"; 
$contest = $mysqli->prepare("SELECT `active`, `id`, `start`, `end`, `slots`,    `description`, `name`, `type`, `minimum`  FROM `contests` WHERE `active` = ?"); 
$contest->bind_param('i', $numone); 
$contest->execute(); 
$contest->bind_result($firstloop['active'], $firstloop['id'], $firstloop['start'], $firstloop['end'], $firstloop['slots'], $firstloop['description'], $firstloop['name'], $firstloop['type'], $firstloop['minimum']); 
$contest->store_result(); 


if ($contest->num_rows() >0){ 
 $n=0; 
 while($contest->fetch()){ 
 $n++; 
    if ($firstloop['active'] == "1") { 
        if ($firstloop['type'] == "0"){ 

     echo " 
     <table> 
     <tr><th colspan='2'>Contest name: ".$firstloop['name']." </th></tr> 
     <tr><th>Contest Start: ".$firstloop['start']."</th><th> Contest End: ".$firstloop['end']." </th></tr> 
     <tr><td>Description :<br> ".$firstloop['description']." </td></tr> 
             "; 

     $participants = $mysqli->prepare("SELECT COUNT(*), `uid` FROM `completed` WHERE `status` = ? AND `time` > ? AND `time` < ?  AND `payment` >= ? GROUP BY `uid` ORDER BY count(*) DESC LIMIT ?");       
        $participants->bind_param('issii', $numone, $firstloop['start'], $firstloop['end'], $firstloop['minimum'], $firstloop['slots']); 
        $participants->execute(); 
        $participants->bind_result($counted, $secondloop['uid']); 
        $participants->store_result(); 

     echo " 
     <tr><th>Place</th><th>ID</th><th>Completed</th></tr> 
          "; 
         while ($participants->fetch()){ 

     echo " 
        <tr><td>".$n."</td><td>".$secondloop['uid']." </td><td> ".$counted."</td></tr> 
             ";          

        } 
     echo  " 
     </table>    
           "; 
         } 
      } 
   } 
}

无论我尝试什么,我总是落在最后。伤心 如您所见,两个循环都没有通过ID连接。

如果有人可以帮助我,会在没有睡觉的情况下再拯救我一晚。感谢

编辑:我没有尝试转换为Smarty,我总是在第二个循环中得到错误的结果,所以我决定发布干净的循环示例,如果有人可以给我建议以正确的方式将其转换为smarty

编辑(已解决): 感谢dbone建议,关于具有唯一id的嵌套数组传递给第二个循环。 (查看dbone帖子)。 感谢

1 个答案:

答案 0 :(得分:0)

您需要将查询值转换为嵌套数组。只使用PHP进行查询,将它们加载到一个变量中即可发送到SMARTY引擎。在开头添加设置以清除变量(错误检查):

$to_smarty = NULL;

然后执行你已经在做的相同的代码,但是将$ to_smarty变量设置为具有第一个查询中的唯一ID的数组(这里我假设$ n,但你可以使用“name”):

 if ($contest->num_rows() >0){ 
  $n=0; 
  while($contest->fetch()){ 
  $n++; 
     if ($firstloop['active'] == "1") { 
         if ($firstloop['type'] == "0"){
             $to_smarty[$n] = firstloop

这会将所有数据存储到可以传递给SMARTY的数组中。当您执行第二个查询时,在$ to_smarty变量中创建一个新索引,并使用原始数组中每个条目的新值填充该索引:

 $participants = $mysqli->prepare("SELECT COUNT(*), `uid` FROM `completed` WHERE `status` = ? AND `time` > ? AND `time` < ?  AND `payment` >= ? GROUP BY `uid` ORDER BY count(*) DESC LIMIT ?");       
 $participants->bind_param('issii', $numone, $firstloop['start'], $firstloop['end'], $firstloop['minimum'], $firstloop['slots']); 
 $participants->execute(); 
 $participants->bind_result($counted, $secondloop['uid']); 
 $participants->store_result();
 $i = 0;
 while ($participants->fetch()){
      $to_smarty[$n]['participants'][$i]['n'] = $secondloop['uid'];
      $to_smarty[$n]['participants'][$i]['uid'] = $secondloop['uid'];
      $to_smarty[$n]['participants'][$i]['counted'] = $counted;
      $i++;

您现在可以将$ to_smarty变量传递给SMARTY引擎,以使用模板打印信息:

 $smarty->assign('stuff', $to_smarty);
 $smarty->display('template.tpl');

模板可能如下所示:

 {if $stuff}
 <table>
 {foreach $stuff as $first}
 <tr><th colspan='2'>Contest name: {$first.name} </th></tr>
 <tr><th>Contest Start: {$first.start}</th><th> Contest End: {$first.end}</th></tr> 
 <tr><td>Description :<br>{$first.description}</td></tr>
 <tr><th>Place</th><th>ID</th><th>Completed</th></tr>
 {foreach $first.participants as $participant}
      <tr><td>{$participant.n}</td><td>{$participant.uid}</td><td>{$participant.counted}</td></tr>
 {/foreach}
 {/foreach}
 </table>
 {/if}

关键是使用嵌套的关联数组。 (注意我的错别字,:-))