【问题标题】:Sorting related pictures to artists - PHP/MySQL将相关图片排序给艺术家 - PHP/MySQL
【发布时间】:2011-01-10 20:28:21
【问题描述】:

我需要任何人的帮助,我会很感激的。

我已经做了 2 个 JOiN-s。事实上,我有 3 张桌子

  1. 艺术家姓名表 (m)
  2. 带有产品信息的表格,在本例中为图片地址 (p)
  3. 具有艺术家 ID 和产品 ID 的表。 (pmx)

这是 SELECT 语句:

SELECT
    m.manufacturer_id ,
    m.mf_name ,
    p.product_id ,
    p.product_full_image
FROM
    jos_vm_product_mf_xref AS pmx 
JOIN
    jos_vm_manufacturer AS m ON m.manufacturer_id = pmx.manufacturer_id 
JOIN
    jos_vm_product AS p ON p.product_id = pmx.product_id 
WHERE
    m.mf_chars = 'm'

我想要达到的效果类似于 [http://www.ugallery.com/ArtistList.aspx?RC=1][1]

事实上我得到的只是:

  1. 名称1 - 产品1
  2. 名称1 - 产品2
  3. 名称2 - 产品1
  4. 名称1 - 产品3

我想要它,在 foreach (smth) { smth } 之后得到:

  1. 名称1 - prod1 prod2, prod3
  2. 名称2 - prod1 prod2
  3. 名称3....等

    <ul>
    <?php foreach ($this->artistlist as $item) 
                {   ?>
        <li><a href="index.php?option=com_virtuemart&page=shop.browse&manufacturer_id=<?php echo $item->manufacturer_id; ?>"><?php echo $item->mf_name; ?></a>
    
        <a href="index.php?page=shop.product_details&flypage=flypage.tpl&product_id=<?php echo $item->product_id; ?>&option=com_virtuemart">
            <img src="components/com_virtuemart/shop_image/product/<?php echo $item->product_full_image; ?>" height="75px">
        </a>
    
        </li>
    <?php   } ?>
    </ul>
    

这是我现在正在使用的 PHP 代码...

所以请,请,请...。谁能帮助我?

这是一段代码

foreach ($this->artistlist as $picture) {
   if(!isset($artists[$picture['manufacturer_id']])) {   <---this is line 22
      $artists[$picture['manufacturer_id']] = array(
         'name'=>$picture['mf_name']
      );
   }

所以...错误:警告:在第 35 行的 D:\Server\xampp\htdocs\ta\components\com_artists\views\artists\tmpl\default.php 中为 foreach() 提供的参数无效

foreach($artist['pictures'] as $pictureId=>$pictureFullImage) {

还有另一个问题: 输出的 HTML 是这样的:

       <ul>
    <li>
        <a href="/ta/index.php?option=com_virtuemart&amp;page=shop.browse&amp;manufacturer_id=3">Giorgi Mihkeil</a>

**</li><li>** <--- and, can we get rid of this pieces? *<a href="/ta/index.php?option=com_virtuemart&amp;page=shop.browse&amp;manufacturer_id=$picture->artist_id"></a>* <-- what is this link? where does it come from?    
    <a href="/ta/index.php?page=shop.product_details&amp;flypage=flypage.tpl&amp;product_id=1&amp;option=com_virtuemart">
       <img src="/ta/components/com_virtuemart/shop_image/product/Lonely_Boat_4cfa773e83874.jpg" height="75px">
    </a>    <a href="/ta/index.php?page=shop.product_details&amp;flypage=flypage.tpl&amp;product_id=2&amp;option=com_virtuemart">
       <img src="/ta/components/com_virtuemart/shop_image/product/Naked_Couple_4cfbd12805f5b.jpg" height="75px">
    </a>    <a href="/ta/index.php?page=shop.product_details&amp;flypage=flypage.tpl&amp;product_id=4&amp;option=com_virtuemart">
       <img src="/ta/components/com_virtuemart/shop_image/product/Lonely_Boat_4d246dbef30e1.jpg" height="75px">
    </a></li></ul>

现在这个 html 就像:&lt;ul&gt;&lt;li&gt;NAME &lt;/li&gt;&lt;li&gt; &lt;img1&gt;&lt;img2&gt;&lt;img3&gt; &lt;/li&gt;&lt;/ul&gt; 我们可以像这样:&lt;ul&gt;&lt;li&gt;NAME &lt;img1&gt;&lt;img2&gt;&lt;img3&gt; &lt;/li&gt;&lt;/ul&gt; 吗?

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    通常,您会为此使用 GROUP_CONCAT

    SELECT
        m.mf_name ,
        GROUP_CONCAT(p.product_id),
        p.product_full_image
    FROM
        jos_vm_product_mf_xref AS pmx 
    JOIN
        jos_vm_manufacturer AS m ON m.manufacturer_id = pmx.manufacturer_id 
    JOIN
        jos_vm_product AS p ON p.product_id = pmx.product_id 
    WHERE
        m.mf_chars = 'm'
    GROUP BY m.mf_name
    

    但是如果你选择图片,你不能使用它,你必须在你的应用程序语言中使用哈希。

    【讨论】:

    • 我的第一反应也是 GROUP_CONCAT... 可能仍然有效,如果您可以在 PHP 处理中解析 GROUP_CONCAT 结果以填充 IMG 标签。
    • 是的,我已经尝试过了,但实际上当在 MySQL 的 Query 选项卡中进行此查询时,我只得到了该艺术家的 1 张图片
    【解决方案2】:

    假设您已经将图片放入数组中:

    $artists = array();
    
    foreach($pictures as $picture) {
       if(!isset($artists[$picture['manufacturer_id']])) {
          $artists[$picture['manufacturer_id']] = array(
             'name'=>$picture['mf_name']
          );
       }
    
       $artists[$picture['artist_id']]['pictures'][$picture['product_id']] = $picture['product_full_image'];
    }
    
    foreach($artists as $artistId=>$artist) {
       echo $artist['name'].': ';
       foreach($artist['pictures'] as $pictureId=>$pictureFullImage) {
          echo "<img src='{$pictureFullImage}' />";
       }
    }
    

    这比 dqhendricks 提出的解决方案要复杂一些,因为它不仅存储艺术家的 ID,还存储他/她的姓名。这意味着涉及到一个额外的数组层。

    根据您在下面的评论:http://pastebin.com/2Cuyvp3U - 我认为应该这样做吗?虽然不知道你突然引入的 mf_prior 字段是什么...

    【讨论】:

    • 哇...感谢您这么快的回复!!!我使用了这段代码......它给了我第一行的错误 - foreach - 说为 foreach() 提供的参数无效。所以..我现在可能会玩小傻瓜......但是有些事情我无法通过这段代码弄清楚......我在foreach中有这个数组 - foreach ($this->artistlist as $item) .. ..
    • artistlist as $item) { ?>
    • mf_name; ?> product_full_image; ?>" height="75px">mf_prior; ?>
    • 这是我的代码....
  • 可能想将其添加到您的问题中 - cmets 中的代码往往会严重格式化报价;)
  • 任何想法如何使我的网站根据您的代码工作?它真的让我死了......我已经考虑了两天了,我在这个网站上找到了和你一样的代码,但无法根据我的情况调整它......
  • 根据您刚刚添加到问题中的内容,使用指向 pastebin 的链接更新了我的答案 :)
  • 【解决方案3】:

    在您的查询中添加订单依据

     ORDER BY  m.manufacturer_id ,p.product_id
    

    在您的 foreach 循环上解析有序查询会容易得多。

    【讨论】:

      【解决方案4】:

      您可能想要处理这个 PHP 端。在伪代码中。

      $record_list = array();
      while ($row_result) {
          if (!array_key_exists($row_result['name'], $record_list)) {
              $record_list[$row_result['name']] = array();
          }
          $record_list[$row_result['name']][] = $row_result['value'];
      }
      var_dump($record_list);
      

      这将以您正在寻找的格式创建一个多维数组。

      【讨论】:

        猜你喜欢
        相关资源
        最近更新 更多
        热门标签