检查数组中的所有值是否都存在于表中

时间:2014-09-05 07:35:47

标签: php mysql sql arrays joomla

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

现在,当用户提交任务时,它会将文章信息(id,title等)存储在已完成的任务表中。如果任务的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。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

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

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

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

CREATE TABLE arp2i_prereqs ( article_id INT , prereq_id INT );

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

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

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

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

答案 1 :(得分:0)

由于您的任务存储在数据库数组中,您可以在显示文章之前添加验证并使用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";
}
?>

祝你好运!