PHP里面的树

时间:2013-07-29 11:00:18

标签: php

我有一张名为quest的表:

id  name
1   First Quest
2   Second Quest
3   Third Quest
4   Fourth Quest
5   Fifth Quest
6   Sixth Quest
7   Seventh Quest
8   Eighth Quest
9   Ninth Quest
10  Tenth Quest
11  Eleventh Quest
12  Twelfth Quest

和一个名为current_quests的表:

id  user
5   motoc

在我的quests.php页面中,我打印了所有12个任务并分配了每个任务的链接。 对于第一个: 本地主机/ quests.php?寻求= 1 对于第二个: 本地主机/ quests.php?寻求= 2 等...

因为在我的current_quests表中我有id 5,我想在quests.php和4,6 italic中使第五个任务变为粗体。

First Quest
Second Quest
Third Quest
*Fourth Quest*
**Fifth Quest**
*Sixth Quest*
Seventh Quest
Eighth Quest
Ninth Quest
Tenth Quest
Eleventh Quest
Twelfth Quest

我想做什么,我不知道当我在current_quest中插入另一个id时,怎么说id = 6

id  user
5   motoc
6   motoc

我希望第五和第六个变得大胆而且4和7斜体

First Quest
Second Quest
Third Quest
*Fourth Quest*
**Fifth Quest**
**Sixth Quest**
*Seventh Quest*
Eighth Quest
Ninth Quest
Tenth Quest
Eleventh Quest
Twelfth Quest

这是我尝试的但我确信这很糟糕。

function SelectQuest($i){
        $sth = $this->dbh->prepare("SELECT * FROM quests");
        $sth->execute();
        while($row = $sth->fetch(PDO::FETCH_ASSOC)){


switch ($row['id']) {
case $row['id'] == $i:
    print "<a href='quests.php?quest=$row[id]'><b>$row[name]</b><br><br></a>";
    break 1;
case $row['id'] == $i-1:
    print "<a href='quests.php?quest=$row[id]'><i>$row[name]</i><br><br></a>";
    break 1;
case $row['id'] == $i+1:
    print "<a href='quests.php?quest=$row[id]'><i>$row[name]</i><br><br></a>";
    break 1;
default:
    print "<a href='quests.php?quest=$row[id]'>$row[name]<br><br></a>";
}

}

$sth = $dbh->prepare("SELECT * FROM current_quest");            
    $sth->execute();   
    $row = $sth->fetch(PDO::FETCH_ASSOC); 

    if (isset($_GET['quest'])) {
        $item = $_GET['quest'];
    print "string";

    }elseif(isset($row['id'])){

    $quest = new Quests($dbh);
    $quest->SelectQuest($row['id']);       
    }

对不起,很长的帖子。 这是我想要实现的目标的图片。

enter image description here

由于

3 个答案:

答案 0 :(得分:0)

首先获取current_quest表数据。解析收到的数据并创建与此类似的数组(为每一行创建此条目):

$isCurrentQuest[$YourQuestID] = true

获取quest表数据并按如下方式解析:

if(!isset($isCurrentQuest[$QuestID] && (isset($isCurrentQuest[$QuestID - 1]) || isset($isCurrentQuest[$QuestID + 1])
{
   // Italic
}
else if(isset($isCurrentQuest[$QuestID])
{
   // Bold
}
else
{
   // Normal
}

(只有在任务之间没有空ID时,此代码才能正常工作)

所以你的代码是:

$sth = $dbh->prepare("SELECT * FROM current_quest");            
$sth->execute();   
while($row = $sth->fetch(PDO::FETCH_ASSOC))
{
    $isCurrentQuest[$row['id']] = true
}

$sth = $dbh->prepare("SELECT * FROM quests");
$sth->execute();
while($row = $sth->fetch(PDO::FETCH_ASSOC))
{
    if(!isset($isCurrentQuest[$QuestID] && (isset($isCurrentQuest[$QuestID - 1]) || isset($isCurrentQuest[$QuestID + 1])
    {
        print "<a href='quests.php?quest=$row[id]'><i>$row[name]</i><br><br></a>";
    }
    else if(isset($isCurrentQuest[$QuestID])
    {
        print "<a href='quests.php?quest=$row[id]'><b>$row[name]</b><br><br></a>";
    }
    else
    {
        print "<a href='quests.php?quest=$row[id]'>$row[name]<br><br></a>";
    }
}

答案 1 :(得分:0)

我建议您使用LEFT JOIN在一个查询中从DB接收所需的所有数据。接收到的表格数据也将包含渲染所需视图的所有必要数据。

$quests = array();

// performing single database query
$sth = $this->dbh->prepare("SELECT * FROM quests
         LEFT JOIN current_quests ON current_quests.id = quest.id");
$sth->execute();
while($row = $sth->fetch(PDO::FETCH_ASSOC))
  $quests[] = $row;

foreach($quests as $key => $quest)
{
  // use $quest['user'] or other current_quest field to find if quest is active
  if($quest['user'])
    echo "<a href='quests.php?quest=".$quest['id']."><b>$row['name']</b></a>";
  // mark neighbour item
  elseif((($key+1) < count($quests)) && $quest['user'])
    echo "<a href='quests.php?quest=".$quest['id']."><i>$row['name']</i></a>";
  // render ordinary item
  else
    echo "<a href='quests.php?quest=".$quest['id'].">$row[name]</a>";
}

答案 2 :(得分:0)

尝试使用case $i:代替case TRUE:case FALSE:

通过在那里进行布尔比较,正在评估。关于如何使用switch-case语句的Reading the documentation可能有所帮助。您已经在switch()部分中为其提供了要测试的值。每个case都是您要测试的值/大小写,以查看它是否匹配,这就是您不需要布尔值的原因。

相关问题