4

抱歉英语不好,标题不好!

我有表“发布”

id    title
1     test Thread
2     hello
3     just

所以有“标签”

tagid   tagname
1       test
2       russia
3       new site

所以有一个post_tags

tagid    postid
1        1
2        1
3        1

我需要一个来自下面的 var_dump 的数组:

$posts = array(
    1 => array(
        'title' => 'test Thread',
        'tags' => array(
            'test', 'russia', 'new site',
        ),
    ),
    2 => array(
        'title' => 'hello',
        'tags' => NULL
    ),
    3 => array(
        'title' => 'just',
        'tags' => NULL
    ),
)

我试着去做,但我得到的不是我想要的。

SELECT `post`.`id`, `post`.`title`, `tags`.`tagname` FROM `post` 
LEFT JOIN `post_tags` ON `post_tags`.`tagid` = `post`.`id` 
LEFT JOIN `tags` ON `post_tags`.`tagid` = `tags`.`tagid`

我接下来进入 SQL:

id  title            tagname
1   test Thread     test
1   test Thread     russia
1   test Thread     newsite
2   hello           NULL
3   just            NULL

PHP

$query = mysql_query("SELECT `post`.`id`, `post`.`title`, `tags`.`tagname` FROM `post` 
    LEFT JOIN `post_tags` ON `post_tags`.`tagid` = `post`.`id` 
    LEFT JOIN `tags` ON `post_tags`.`tagid` = `tags`.`tagid`");
$posts = array();
while ($row = mysql_fetch_assoc($query))
{
    $posts[] = $row;
}

var_dump($posts);

谢谢!!!

4

3 回答 3

2

查询没问题。您只需要在循环中添加一些逻辑:

while ($row = mysql_fetch_assoc($query))
{
    if (isset($posts[$row['id']])) {
        $posts[$row['id']]['tags'][] = $row['tagname'];
    }
    else {
        $posts[$row['id']] = array(
            'title' => $row['title'],
            'tags' => $row['tagname'] === null ? null : array($row['tagname'])
        );
    }
}

如果您已经看到具有相同帖子 ID 的行,那么您想要从当前行获得的只是标签名称(因此将其添加到“标签”数组中)。如果这是第一次看到具有此帖子 ID 的行,只需将其添加到$posts,请小心将“标签”设置为其中一个null或具有一个元素的数组。

于 2012-04-10T21:40:03.357 回答
2

您无法从 mysql 数据库中获取多维数组。如果您希望以这种形式获得结果,则必须对结果进行自己的后期处理。可能是这样的?

$posts = array();
while ($row = mysql_fetch_assoc($query))
{
    if (!isset($posts[$row['id']])) {
        $posts[$row['id']] = array();
        $posts[$row['id']]['title'] = $row['title'];
        $posts[$row['id']]['tags'] = array();
    }
    if ($row['tagname'] != null) $posts[$row['id']]['tags'][] = $row['tagname'];
}
于 2012-04-10T21:43:26.607 回答
1

试试这个:

while ($row = mysql_fetch_assoc($query))
{
    if( !isset( $posts[$row["id"]] ) ) {
        $posts[ $row["id"] ] = array( "title" => $row["title"], "tags" => array() );
    }
    array_push( $posts[ $row["id"] ][ "tags" ], $row["tagname"] );
}

我无法调试它,所以如果您遇到任何错误,请告诉我

于 2012-04-10T21:41:03.097 回答