在php数组中搜索元素

在php数组中搜索元素,php,arrays,search,Php,Arrays,Search,我有 名为“members”的用户表 名为“rooms”的rooms表 将用户id与文件室“MembersRoom”的id关联的表 我应该编写一个循环,为每个用户打印一个包含所有房间的下拉列表,但将属性“selected”添加到与用户关联的房间中 这个循环有什么问题 $members = mysql_query("SELECT * FROM members "); $rooms = mysql_query("SELECT * FROM rooms"); while($member = my

我有

  • 名为“members”的用户表
  • 名为“rooms”的rooms表
  • 将用户id与文件室“MembersRoom”的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>");
}
$members=mysql\u查询(“从成员中选择*);
$rooms=mysql_查询(“从房间中选择*);
而($member=mysql_fetch_数组($members)){
回声(“”);
$roomsOfUser=mysql_query(“从membersRooms中选择roomID,其中userID=”.$member[“id]”);
$cuArray=mysql\u fetch\u数组($roomsOfUser);
而($room=mysql\u fetch\u数组($rooms)){
if(在数组中($room[“id”],$cuArray,true))
echo(“$room[“roomName”]。”);
其他的
echo(“$class[“roomName]”);
}
回声(“”);
}

为了让这对您来说更容易一些,您可以尝试在数据库中使用左连接和右连接。这将显著降低服务器负载,并且仍然允许您执行相同的功能

我相信,如果我正确地阅读了您的数据库结构,您将需要以下内容:

 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何时更改,以及何时更改,启动一个新的select。如果我没有完全弄糟SQL(我可能会弄糟),那么结果行应该如下所示:

memberID    |   roomID  |  roomName  |  memberRoom
    1             1          foo             1
    1             2          bar             1
    2             1          foo             1
    2             2          bar             1
所以,在循环迭代中,您将使用roomID和roomName来构建select,如果roomID与memberRoom匹配,那么您将选择该行

$rooms查询已停止 while偶尔运行一次

将此
$rooms=mysql_查询(“从房间中选择*)查询行

首先,while

确定,因此您需要来自3个表的信息—成员、房间和成员房间。members和MembersRoom中的行以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>';
}
$member\u query=mysql\u query(“从成员中选择*左加入membersRooms ON(members.id=membersRooms.userID)”;
$room\u query=mysql\u query(“从房间中选择*);
$rooms=array();
while($room=mysql\u fetch\u assoc($room\u query))
$rooms[]=$rooms;
while($member=mysql\u fetch\u assoc($member\u query)){
回声';
foreach($room作为$room){
回显“{$room['roomName']}”;
}
回声';
}

值得注意的是,如果members:rooms是一个1:many关系,您不需要使用第三个表来连接它们-只需向成员添加一个roomId,您就可以了。

将该选择放入while循环会让DBA大吃一惊。您确定这两个表的数据类型相同吗?您真的需要确保吗?它是否在没有为in_数组调用启用严格类型检查的情况下工作?尝试从in_数组调用中删除第三个“true”参数,看看它是否有效,然后。不,它不起作用。。。是的,它们都是int@DigitalPrecision,我需要每个用户的下拉列表。。我该怎么办?@Janky:你想在列表中看到什么?如果代码起作用,您将只能在下拉列表中看到链接到用户的房间名称。我希望看到每个用户的下拉列表,其中包含所有房间作为选项,但必须选择与用户关联的房间(第三个表中的房间),这将解决他的问题,这也会使他的脚本在加入时的效率大大降低+1。如果模式允许,立即直接从源代码获取所需的数据,而不是为循环的每次迭代发出查询。您编写了“来自成员和成员的行按1:1排列”,可能我没有很好地解释。。。一个成员可以关联到多个房间!这将为$member\u查询的每条记录打印一条。。。它不正确,因为它应该为每个成员打印一个