在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关联的表
$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查询的每条记录打印一条。。。它不正确,因为它应该为每个成员打印一个