在php数组中搜索元素

时间:2011-12-15 00:36:14

标签: php arrays search

我有

  • 名为“members”的用户表
  • 一个名为“rooms”的房间表
  • 将用户ID与房间“membersRooms”
  • 的ID相关联的表格

我应该编写一个循环,为每个具有所有房间的用户打印下拉列表,但是将“selected”属性添加到与用户关联的房间

这个循环出了什么问题?

$members = mysql_query("SELECT * FROM members ");
$rooms = mysql_query("SELECT * FROM rooms");

while($member = mysql_fetch_array($members)){ 
    echo("<select>");
    $roomsOfUser = mysql_query("SELECT roomID FROM membersRooms WHERE userID=".$member["id"]);
    $cuArray = mysql_fetch_array($roomsOfUser); 

    while($room = mysql_fetch_array($rooms)){
        if(in_array($room["id"],$cuArray,true))
            echo("<option selected='selected'>".$room["roomName"]."</option>");
        else
            echo("<option>".$class["roomName"]."</option>");
    }
    echo("</select>");
}

3 个答案:

答案 0 :(得分:2)

为了让您更轻松,您可以尝试在数据库中使用左右连接。这将显着降低您的服务器负载,并仍然允许您执行相同的功能。

我相信,如果我正确地阅读您的数据库结构,那么您需要的是:

 SELECT members.id as memberID, rooms.id as roomID, rooms.roomName, membersRooms.roomID as memberRoom
 FROM members
 LEFT JOIN membersRooms
 ON members.id = membersRooms.userID
 RIGHT JOIN rooms
 ON membersRooms.roomID = rooms.id

然后在PHP中,您应该能够跟踪您的memberID何时更改,以及何时更改,启动新选择。如果我没有完全搞砸那个SQL(我可能有),那么结果行应该类似于:

memberID    |   roomID  |  roomName  |  memberRoom
    1             1          foo             1
    1             2          bar             1
    2             1          foo             1
    2             2          bar             1

因此,在循环迭代中,您将使用roomID和roomName来构建您的选择,如果RoomID匹配memberRoom,那么您将选择该行。

答案 1 :(得分:0)

$ room查询而死了 同时运行一次

放置此$rooms = mysql_query("SELECT * FROM rooms");查询行 在第一次

答案 2 :(得分:0)

好的,所以你需要来自3个表的信息 - 成员,房间和成员房间。 member和membersRooms中的行按1:1排列,因此我们可以通过1个查询获得这两行。

此方法将最大限度地减少所需查询的数量 - 如果您发现自己在循环中查询数据库,请问自己是否有更好的方法。

$member_query = mysql_query("SELECT * FROM members LEFT JOIN membersRooms ON (members.id = membersRooms.userID)");

$room_query = mysql_query("SELECT * FROM rooms");
$rooms = array();
while ($room = mysql_fetch_assoc($room_query))
  $rooms[] = $room;

while ($member = mysql_fetch_assoc($member_query)) {
  echo '<select>';
  foreach($rooms as $room) {
    echo "<option value='{$room['roomID']}' ";
    if ($member['roomID'] == $room['id'])
      echo 'selected="selected"';
    echo ">{$room['roomName']}</option>";
  }
  echo '</select>';
}

值得注意的是,如果成员:房间是1:多关系,你不需要使用第三个表来加入它们 - 只需向会员添加roomId,你就没事了。