【问题标题】:PHP - filter and output data from an associative array on htmlPHP - 从 html 上的关联数组中过滤和输出数据
【发布时间】:2021-05-10 08:11:41
【问题描述】:

我有以下从数据库调用的关联数组:

Array
(
    [0] => Array
        (
            [id] => 81
            [book_sku] => BokFoxME
            [book_name] => BokFoxME
            [book_price] => 123.4
            [b_weight] => 123
            [f_width] => 
            [f_length] => 
            [post_time] => 2021-02-05 04:02:30
            [origin] => book
        )

    [1] => Array
        (
            [id] => 234
            [book_sku] => TESTDVD
            [book_name] => TESTDVD
            [book_price] => 323
            [b_weight] => 12
            [f_width] => 
            [f_length] => 
            [post_time] => 2021-02-02 00:23:04
            [origin] => dvd
        )

    [3] => Array
        (
            [id] => 41
            [book_sku] => Мебель
            [book_name] => Мебель
            [book_price] => 21
            [b_weight] => 21
            [f_width] => 21x
            [f_length] => 21
            [post_time] => 2021-01-31 21:16:52
            [origin] => furniture
        )
  
)

数据库中有三个表(DVD、书籍、家具),其中包含将添加新产品的不同列字段。我加入了UNION ALL,以便按时间戳排序(以便新产品出现在产品列表中的第一位)。 好吧,我正在获取按时间戳排序的数据,但是在将其输出到 HTML 页面时出现了困难。

这是我在html 上显示数据的代码,但我不知道如何显示每个产品的描述。

<?php
    // $dvds = array_filter($data_dvd, function ($item) {
    //     return $item['origin'] === 'dvd';
    // });

    foreach((array)$data_dvd as $prod){
?>

<!-- Fetching DVD -->
  <div class="card" style="width: 12rem; height: 12rem;">
      <div class="card-body">
          <label class="checkbox-inline">
          <input  name="box[]" type="checkbox" value="<?php echo $prod["id"];?>">
          </label>
      <br>
      <div class="cardt text-center">
          <p class="card-title"><b><?php echo $prod["book_sku"];?></b></p>
          <p class=""><?php echo $prod["book_name"]; ?></p>
          <p class=""><?php echo $prod["book_price"]; ?>$</p>
          
          <!-- the problem occurs with this part of the code -->
          <p>Size: <?php echo $prod["b_weight"]; ?> MB </p>
          <p>Size: <?php echo $book["b_weight"]; ?> Weight </p>
          <p>Dimension:<br><small> <?php echo $prod["b_weight"]; ?> x <?php echo $prod["f_width"]; ?> x <?php echo $prod["f_length"]; ?></small></p>

      </div>
      </div>
  </div>


  <?php
          }
  ?>

也就是说,DVD 产品应显示描述“MB”,书籍应显示“重量”,家具应显示“尺寸”。但目前我遇到了以下混乱:

产品必须显示在盒子中,每个产品都有自己的产品描述。同时不会通过时间戳破坏产品的显示。如下例所示:

由于我使用的是UNION,因此数组中的键名对于所有产品都是相同的,这使得在输出时调用特定产品变得更加困难。

如何解决这种情况,在不破坏时间戳的情况下,按照产品描述正确显示产品?

【问题讨论】:

  • 基于origin 的值的switch 语句有什么问题?

标签: php mysql associative-array


【解决方案1】:

如果我理解您的描述和查询输出,您只需要在您的origin 的 HTML 测试中使用一点 PHP 条件逻辑:

<?php if ($prod["origin"] == "dvd"): ?>
<p>Size: <?php echo $prod["b_weight"]; ?> MB </p>

<?php elseif ($prod["origin"] == "book"): ?>
<p>Size: <?php echo $prod["b_weight"]; ?> Weight </p>

<?php elseif ($prod["origin"] == "furniture"): ?>
<p>Dimension:<br><small> <?php echo $prod["b_weight"]; ?> x <?php echo $prod["f_width"]; ?> x <?php echo $prod["f_length"]; ?></small></p>

<?php else: ?>
<p>unknown type or skip this </p>
<?php endif; ?>

在您的 SQL 查询中,我建议在可变列上使用别名,这样它们就不会全部显示为 b_weight。这很令人困惑,当您必须在 2 年内更改此代码时,您会感谢自己。

SELECT
  id,
  -- Give the column you "overload" an alias that applies to all 3
  book_sku AS sku,
  b_weight AS measure,
  ...
UNION ALL
SELECT
  id,
  dvd_sku AS sku,
  dvd_mb AS measure,
  ...
UNION ALL
SELECT
  id,
  furniture_sku AS sku,
  furniture_weight AS measure
  ....

【讨论】:

  • +。感谢您推荐在查询中使用别名,它确实改进了我的代码。
  • @David 很高兴能帮到你,祝你好运
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-08
  • 2011-10-04
  • 2015-06-23
  • 2011-09-30
相关资源
最近更新 更多