【问题标题】:Wrap div.container around in foreach将 div.container 包裹在 foreach 中
【发布时间】:2015-12-09 15:46:12
【问题描述】:

也许是一个简单的问题,就这样吧。 我有一个简单的 php foreach 脚本,可以很好地输出结果。我需要每隔一个项目用一个容器 div 包装结果。示例可能是:

脚本是什么样子的

$result = $wpdb->get_results('SELECT id, fdate, tdate FROM database');
$i = 0;
foreach ($result as $date):
   $i++; 
   echo '<div class="range" data-range="'. $date->id .'">';
   echo 'test';
   echo '</div>';
endforeach;

将输出:

<div class="range" data-range="00000000"></div>
<div class="range" data-range="00000000"></div>
<div class="range" data-range="00000000"></div>
<div class="range" data-range="00000000"></div>
<div class="range" data-range="00000000"></div>
<div class="range" data-range="00000000"></div>

但我需要以下示例:每隔一个结果围绕范围包装一个容器 div。像这样:

<div class="container">
<div class="range" data-range="00000000"></div>
<div class="range" data-range="00000000"></div>
</div>
<div class="container">
<div class="range" data-range="00000000"></div>
<div class="range" data-range="00000000"></div>
</div>
<div class="container">
<div class="range" data-range="00000000"></div>
<div class="range" data-range="00000000"></div>
</div>

我试过了:

$result = $wpdb->get_results('SELECT id, fdate, tdate FROM database');
$i = 0;
foreach ($result as $date):
   $i++; 
   if($i%2 == 0) {
     echo $i > 0 ? "</div>" : "";
     echo "<div class='container'>";
   }
   echo '<div class="range" data-range="'. $date->id .'">';
   echo 'test';
   echo '</div>';
endforeach;

但这不能与我正在寻找的结果正常工作:) 想法? =)

【问题讨论】:

    标签: php html containers counter


    【解决方案1】:

    你真的很亲密。 :)

    您希望您的容器在 foreach 循环之外回显。

    $result = $wpdb->get_results('SELECT id, fdate, tdate FROM database');
    $i = 0;
    echo '<div class="container">';
    foreach ($result as $date):
       $i++;
       echo '<div class="range" data-range="'. $date->id .'">';
       echo 'test';
       echo '</div>';
    endforeach;
    echo '</div>';
    

    编辑:对不起,我误解了你的问题,但仍然很简单。

    $result = $wpdb->get_results('SELECT id, fdate, tdate FROM database');
    $i = 0;
    foreach ($result as $date):
       $i++; 
       if($i%2 == 1) {
         echo "<div class='container'>";
       }
       echo '<div class="range" data-range="'. $date->id .'">';
       echo 'test';
       echo '</div>';
       if($i%2 == 0) {
         echo "</div>";
       }
    endforeach;
    

    编辑 2:哇,真的没有那么简单。如果结果数为奇数,您将不会关闭最后一个标签。所以,你实际上想要这个:

    $result = $wpdb->get_results('SELECT id, fdate, tdate FROM database');
    $i = 0;
    foreach ($result as $date):
       if($i%2 == 0) {
         echo "<div class='container'>";
       }
       echo '<div class="range" data-range="'. $date->id .'">';
       echo 'test';
       echo '</div>';
       if($i%2 == 1) {
         echo "</div>";
       }
       $i++; 
    endforeach;
    if($result->Size() % 2 == 1)
    {
        echo '</div>';
    }
    

    【讨论】:

    • 虽然他应该在输出第一个 div#container 之前检查 if (!empty($result)) ......而且他仍然需要在那里进行模测试以输出一个新的 div#container 并关闭标记。
    • 我误解了这个问题。哎呀!谢谢:)
    • 这会将所有范围类放在一个容器中:/ :)
    • 是的!自最初的答案以来,我进行了两次编辑。毕竟没那么容易。 :)
    【解决方案2】:

    这个 sn-p 应该可以满足您的需要

    $result = $wpdb->get_results('SELECT id, fdate, tdate FROM database');
    $i = 0;
    foreach ($result as $date):
       $i++;
       if($i%2 == 1) {
           echo '<div class="container">';
       }
       echo '<div class="range" data-range="'. $date->id .'"></div>';
       if($i%2 == 0) {
           echo '</div>';
       }
    endforeach;
    

    【讨论】:

    • 不。对不起。它将所有内容都包装在一个容器中,不像想要的结果:) 上面将输出:
    • 对不起我的错误。我搞砸了自己的代码——它起作用了。谢谢一百万:)
    【解决方案3】:
    <?php
    define ('TEMPLATE_SUB_CONTAINER',   '<div class="range" data-range="%s">%s</div>');
    define ('TEMPLATE_CONTAINER',       '<div class="container">%s</div>'); 
    
    $result = $wpdb->get_results('SELECT id, fdate, tdate FROM database');
    $i      = 0 ;
    $buffer = '';
    
    foreach ($result as $date):
       if ($i == 2) {
           flushBuffer($buffer);
           $buffer = '';
           $i=0;
       }
       $buffer .= sprintf(TEMPLATE_SUB_CONTAINER . '<br />', $date->id, 'test');
       $i++;
    endforeach;
    flushBuffer($buffer);
    
    function flushBuffer($buffer) {
        if (strlen($buffer) > 0) {
            $buffer .= spintf(TEMPLATE_CONTAINER, $buffer);
            printf("%s", $buffer);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-23
      • 1970-01-01
      • 1970-01-01
      • 2015-05-09
      相关资源
      最近更新 更多