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

时间:2018-01-04 16:34:33

标签: php mysql sql sql-server

这是我的数据库结构。

表:会员资格

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 个答案:

答案 0 :(得分:2)

首先,您可以像获取颜色一样获取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 } ?>