【问题标题】:Check if all values in array exist in a table检查数组中的所有值是否都存在于表中
【发布时间】:2014-09-05 07:35:46
【问题描述】:

我有一些当前在 Joomla 中生成动态文章列表的工作代码。这是我正在开发的任务系统的一部分。每篇文章(任务)都有一个自定义的先决条件值分配给它。我已经使用一个名为 Fields Attach 的扩展来分配这些值,它允许您定义自定义文章属性并将它们存储在数据库中。下面的代码列出了 prereq 值为 0 的所有任务或任何 prereq 值与已完成任务表中任务的文章 id 匹配的任务。

现在,当用户提交任务时,它会将文章信息(id、标题等)存储在已完成任务表中。如果任务的 prereq 值与尚未完成的任务的 id 匹配,则不会显示。希望这是有道理的。

所以,我的问题是:如何存储文章 ID 数组?例如,如果我希望某个特定任务具有多个先决条件,我可以为该任务分配类似 1、2、3 的值。但是,我如何检查以确保存储数组中的所有值都存在于已完成的任务表中?我必须能够为使该系统正常工作的任务分配多个先决条件。显示我当前的代码可能会有所帮助:

这是我用来编译列表的查询:

$query = "SELECT c.id, c.title, c.catid, r.user_id, r.prereqID, f.fieldsid, f.articleid, f.value FROM arp2i_fieldsattach_values AS f
LEFT JOIN arp2i_content AS c
ON f.articleid=c.id
AND f.fieldsid=5
AND f.value!=0
LEFT JOIN arp2i_completed_quests AS r
ON r.user_id = $userID
ORDER BY f.articleid, c.id"; // prepare query

$db = &JFactory::getDBO(); // get database object
$db->setQuery($query); // apply query
$prereqs = $db->loadObjectList(); // execute query, return result list

显示列表的php:

foreach ($prereqs as $prereq){ // loop through articles 

if ($prereq->fieldsid == 1) {
$questXp2 = $prereq->value;
}

else if ($prereq->fieldsid == 3) {
$hexValue2 = $prereq->value;
}

else if ($prereq->fieldsid == 4) {
$image2 = $prereq->value;
}

if ($prereq->catid == $catID
&& $prereq->prereqID == $prereq->value) {

 echo '<div class="questBlock" style="background-color:' . $hexValue2 . ';">' . '<a class="questLink" href="http://localhost/quest/index.php/quests/' . $prereq->articleid . '-' . $prereq->c.title . '">'  . '<img src="images/documents/' . $prereq->articleid . '/' . $image2 .  ' " />'  . $prereq->title . '<span class="xpFloat">' . $questXp2 . ' XP' . '</span>' . '</a>'  . '</div>' ;}

}

为了澄清,假设我有 4 个任务,文章 ID 为 1、2、3 和 4。我希望任务 4 的先决条件值为 1、2、3。这样,任务 4 将不会显示,直到任务 1、2 和 3 已完成。任何帮助将不胜感激。

【问题讨论】:

    标签: php mysql sql arrays joomla


    【解决方案1】:

    如果您想从数据库中选择所有任务,然后根据其先决条件过滤它们,您可以将 prereqID 字段更改为 VARCHAR(512)(或不同的适当大小)并将先决条件数组存储为JSON 编码的字符串。请参阅 PHP 函数 json_encodejson_decode

    根据您的数据库中有多少任务,这可能不是最好的主意,但它可能是最容易实现的。

    另一种可能性是从表arp2i_completed_quests 中删除字段prereqID,然后创建一个新的n:m-表arp2i_prereqs,将任务映射到它们的先决条件,如下所示:

    CREATE TABLE arp2i_prereqs ( article_id INT , prereq_id INT );
    

    我在这里使用了INT,因为我不知道您的文章ID 的确切数据类型。相应地更改它。

    对于每个先决条件,将一条记录插入到将文章映射到其先决条件的表中。在你的情况下,看起来像:

    article_id   prereq_id
    ----------------------
             4           1
             4           2
             4           3
    

    当从您的数据库中选择任务时,请确保与此表完全外连接,否则您将过滤掉那些没有先决条件的任务。

    【讨论】:

      【解决方案2】:

      由于您的任务存储在数据库数组中,您可以在显示文章之前添加验证并使用 php in_array() 函数进行比较。

      以下是基本语法示例:

      <?php
      $os = array("Mac", "NT", "Irix", "Linux");
      if (in_array("Irix", $os)) {
          echo "Got Irix";
      }
      if (in_array("mac", $os)) {
          echo "Got mac";
      }
      ?>
      

      祝你好运!

      【讨论】:

        猜你喜欢
        • 2021-08-03
        • 2015-04-12
        • 2021-01-07
        • 2020-09-19
        • 2014-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多