在 foreach() 循环内唯一地显示元素

Posted

技术标签:

【中文标题】在 foreach() 循环内唯一地显示元素【英文标题】:Inside foreach() loop display elements uniquely 【发布时间】:2018-01-04 16:34:32 【问题描述】:

这是我的数据库结构。

表格:成员资格

mbs_id | mbs_color | mbs_name
   1   |    red    | Standard
   2   |  yellow   | Premium
   3   |   green   | Elite
   4   |   blue    | Ultimate

表格:广告

ad_id  | ad_memberships
   1   | 1,2          
   2   | 1,2,3          
   3   | 1,3            
   4   | 2,3   

我有一个代码,它根据ad_memberships 中的值显示每个循环的颜色。这意味着如果ad_membership 包含 1,2,那么它会在方形框中并排显示红色和黄色。使用以下代码可以很好地完成这项工作。但是我现在想要做的是,当我放置这些框时,它会显示成员名称,如title 属性。对于会员名称,我的意思是mbs_name。例如,如果悬停红色框会显示Standard,如果悬停黄色框会显示Premium 等。这些彩色框从<span class="membership-indicator"> 显示。这里应该添加什么?

代码:

<div class="ads-container">
  <?php
    $cat = $pdo->prepare("SELECT * FROM ads_category");
    $cat-> execute();

    $i = 0;
    while($s = $cat->fetch())
      $ads = $pdo->prepare("SELECT *, GROUP_CONCAT(memberships.mbs_color) AS colors FROM advertisements
                                INNER JOIN memberships ON FIND_IN_SET(memberships.mbs_id, advertisements.ad_memberships)
                                LEFT JOIN ads_category ON advertisements.ad_category = ads_category.ac_id
                                WHERE ad_credits >= ac_credits AND ad_category = :cat AND ad_status = 'active'
                                GROUP BY advertisements.ad_id");
      $ads-> bindValue(':cat', $s['ac_id']);
      $ads-> execute();

      while($a = $ads->fetch()) 
         $mbs_colors = explode(',', $a['colors']);
  ?>
      <div class="" <?php if($i++ != 0) echo "style='margin-top: 30px'";  ?>>
        <i class="fa fa-bullhorn" aria-hidden="true"></i> <?php echo $ac_category; ?>
      </div>
      <div class="col-sm-4">
        <div class="adcover">
          <div class="ad-title">
            <a href="surf.php?ad=<?php echo $a['ad_id']; ?>" target="_blank"><?php echo $a['ad_title']; ?></a>
          </div>
          <div class="ad-footer-two">
            <?php foreach($mbs_colors as $color)   ?>
              <span class="membership-indicator" style="background: <?php echo $color; ?>; margin-top: 4px" title="<?php echo $a['mbs_name']; ?>"></span>
            <?php  ?>
          </div>
        </div>
      </div>
  <?php   ?>
</div>

【问题讨论】:

【参考方案1】:

首先,你可以像获取颜色一样获取mbs_name数据:

GROUP_CONCAT(memberships.mbs_name) AS names

在您的 while 循环中,您可以再次等价地分解它们:

$mbs_names = explode(',', $a['names']);

然后你可以将两个数组加在一起:

$membershipData = array_map(function($color, $name)
    return (object)['color' => $color, 'name' => $name];
, $mbs_colors, $mbs_names);

最后你可以遍历这个新创建的数组并打印出数据:

<?php foreach($membershipData as $membership)   ?>
    <span class="membership-indicator" style="background: <?php echo $membership->color; ?>; margin-top: 4px" title="<?php echo $membership->name; ?>"></span>
<?php  ?>

【讨论】:

完美..正是我想要的:)

以上是关于在 foreach() 循环内唯一地显示元素的主要内容,如果未能解决你的问题,请参考以下文章

浅谈for each循环

浅谈for each循环

在 PHP 中使用 foreach 循环时查找数组的最后一个元素

SwiftUI List 和 For Each 循环与空白元素

如何形象地解释 JavaScript 中 map,foreach,reduce 间的区别

Laravel - 在条件内循环时元素显示两次