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 を持つ行が既にある場合は、現在の行から必要なのはタグ名だけです (これを「tags」配列に追加します)。この投稿 ID を持つ行が初めて表示される場合は、単に に追加するだけです。 $posts「タグ」をnullまたは 1 つの要素を持つ配列に設定するように少し注意してください。

于 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 に答える