2

私が望むのは、mysql 結果列の新しい値ごとに新しい順不同リストを作成することです。

私のクエリは次のようになり、データ配列に投げています:

$connection = dbconnect();

$getusers = "SELECT users.usr_id, users.usr_firstname, users.usr_lastname, user_groups.group_name FROM users INNER JOIN user_groups ON users.usr_group = user_groups.group_id ORDER BY group_name ASC, users.usr_firstname ASC, users.usr_lastname ASC";
$result = mysql_query($getusers);

$data_array = array();
while($data = mysql_fetch_array($result)){
    $data_array[] = $data;
}

次に、そのデータを表示して、新しい各 user_group が順序なしリストになり、同じグループを持つ各行がその順序なしリストのリスト項目として表示されるようにする必要があります。

この質問 ( PHP/MySQL Query Results )と非常によく似ていますが、適切な場所で ul を閉じるのに問題があります。出力用のコードは次のとおりですが、li は実際には ul の子ではないため、間違っていることはわかっています。

$previousgroup = "";
foreach($data_array as $users){
    if($users['group_name'] != $previousgroup){
        echo "<ul class=\"group\">" . $users['group_name'] . "</ul>";
    }
    else{
        echo "<li id=\"m" . $users['usr_id'] . "\"><h4>" . $users['usr_firstname'] . " " . $users['usr_lastname'] . ", " . $users['cred_name'] . "</h4></li>";
    }
}

これを行うより効率的な方法はありますか?ご協力いただきありがとうございます。

4

2 に答える 2

1

while ループを次のように変更できます。

$data_array = array();
while($data = mysql_fetch_array($result)){
    $data_array[$data['group_name']][] = $data;
}

そして、データを含む他の配列のインデックスとして group_name を含む配列を取得します。リストを作成するには、次のようにします。

<ul>
  <?php
  foreach ($data_array as $temp_key => $temp_array)
  {
    ?>
    <li>
      <?php echo $temp_key; ?>
      <ul>
        <?php
        foreach ($temp_array as $datum)
        {
          echo ("<li>" . $datum['usr_firstname'] . "</li>";
        }
        ?>
      </ul>
    </li>
    <?php
  }
  ?>
</ul>

それがあなたのために働くことを願っています

于 2012-06-18T16:42:02.723 に答える
1
if($users['group_name'] != $previousgroup){
    echo "</ul><ul class=\"group\"><li>" . $users['group_name'] . "</li>";
}
echo "<li id=\"m" . $users['usr_id'] . "\"><h4>" . $users['usr_firstname'] . " " . $users['usr_lastname'] . ", " . $users['cred_name'] . "</h4></li>";

<ul>ループ内のコードは次のようになります。ループの外側からa を開いたり閉じたりする必要があります。

echo '<ul>';
foreach () { // here is the loop }
echo '</ul>';

これは、少なくとも、印刷しながら「汚い」方法で実行しています。

私が行う方法は、最初に group_name で、次にユーザー ID でインデックス付けされた 2D 配列を構築することです。これは、データを表示するために 2 回目のループが必要になるため、データで 2 つのパスを作成することを意味しますが、一般的に言えば、違いを感じることはありません。

于 2012-06-18T16:32:24.497 に答える