0

タグが内側の foreach ループに正しい順序で表示されています。

それらをコンマで区切りたいのですが、方法がわかりません。

2 番目の foreach ループを使用せずにタグを表示するより良い方法はありますか?

$people = array();

while($row = mysqli_fetch_array($rs, MYSQLI_ASSOC)){
       if(!isset($people[$row["id"]])){
            $people[$row["id"]]["id"] = $row["id"];
            $people[$row["id"]]["tag"] = $row["tag"];
            $people[$row["id"]]["tags"] = array();
       }
     array_push($people[$row["id"]]["tags"],  array("id"=>$row["tags_id"],"tag_name"=>$row["tag"]));
}

foreach($people as $pid=>$p){

    echo "(#{$p['id']}) ";

     foreach($p["tags"] as $tid=>$t){
     echo "<a href='#'>{$t['tag_name']}</a> ";   
     }

       echo "<br><br>";
}
4

1 に答える 1

1

配列に要素を 1 つ追加するだけなので、array_push を使用する必要はありません。次の構文を使用して、関数を呼び出すオーバーヘッドを節約できます。

$people[ $row["id"] ]["tags"][] = array(...);

私の答えは、データベースから保存された変数の必要性に依存します。提供されたコードでは、ネストされた foreach ループでデータベースの id 値とタグ値のみを使用しています。この場合、新しいタグ配列で implode() を使用できるように、配列を単純化できます。私はあなたのデータベーススキーマを持っていないので、これをテストしていませんが、うまくいくと信じています.

<?php
$people = array();
$tags = array();

while( ($row = mysqli_fetch_array( $rs, MYSQLI_ASSOC)))
{
    if( !isset( $people[$row['id']]))
    {
        $people[ $row['id'] ] = array( 'id' => $row['id'], 'tag' => $row['tag']);
        $tags[ $row['id'] ] = array();
    }
    $tags[ $row['id'] ][] = $row['tag'];
}

foreach( $people as $pid => $p)
{
    echo "(#{$p['id']}) ";
    echo '<a href="#">' . implode( '</a><a href="#">', $tags[ $p['id'] ])  . '</a>';
    echo '<br /><br />';
}
于 2011-09-22T17:53:28.760 に答える