首先创建一堆数组的正确方法是什么,然后循环遍历它们?

时间:2015-11-08 03:35:49

标签: php mysql arrays

我正在构建一个简单的网站,让我的工作人员可以使用Jquery可拖动脚本轻松地将员工姓名与他们的宝贝图片相匹配。

我有两张桌子(USERS和ENTRIES)。有一个名为PEOPLE的第3个表,但它对这个问题并不重要。

在条目中," 0"的用户ID有正确的顺序(即personid 1应该是第4个.adidid 2应该是第3个,等等。再次,personid来自另一个名为PEOPLE的表,这对于这个问题不重要。)

+----------+---------+--------------+
| userid   |firstname| lastname
+----------+---------+--------------+
| 1        | Bob     |   Wilson     |
| 2        | Charlie |   Jackson    |
| 3        | Jim     |   Smith      |
| 4        | Doug    |   Jones      |
+----------+---------+--------------+

+----------+---------+--------------+
| userid   | personid| ordering 
+----------+---------+--------------+
| 0        | 1       |   4          |
| 0        | 2       |   3          |
| 0        | 3       |   1          |
| 0        | 4       |   2          |
| 1        | 1       |   2          |
| 1        | 2       |   4          |
| 1        | 3       |   1          |
| 1        | 4       |   3          |
| 2        | 1       |   1          |
| 2        | 2       |   3          |
| 2        | 3       |   4          |
| 2        | 4       |   2          |
+----------+---------+--------------+

我实际上可能有100个用户在条目表中有条目。每个用户将有100个人员订购。我想要做的是,以最有效,最合理的方式循环所有条目,并将每个条目与CORRECT答案(即用户ID 0)进行比较。

所以我的想法可能是获取数组中的所有条目,然后将userid 1的数组与userid 0的数组进行比较。然后将userid2的数组与userid 0的数组进行比较。依此类推。

我只是想比较每个后续用户有多少正确答案。所以在我的示例表中,userid 1有一个正确的答案(Personid 3与排序1匹配),userid 2有两个正确答案(personid 2匹配订购3,personid 4匹配订购2)。

我第一次这样做......

$sql = "SELECT * FROM entries";
            $getpeople = mysqli_query($connection, $sql);
            if (!$getpeople) {
            die("Database query failed: " . mysqli_error($connection));
            } else {
                while ($row = mysqli_fetch_array($getpeople)) {
                    $entriesarray[$row['userid']][$row['personid']]=$row['ordering'];
                }
            }

这会给我一些包含所有用户条目的数组。

然后我做了这个测试......

$result_array = array_intersect_assoc($entriesarray[1], $entriesarray[0]);
print_r($result_array);
echo "COUNTRIGHT=".count($result_array);

这基本上是通过给我'#34; 1"的国度来做我想要的。它会看到数组中有多少用户ID与用户ID 0的数组中的值AND键匹配(同样,正确的答案数组)。

但是现在我很难知道如何在一个好的循环中有效地做到这一点,而不是一个接一个地去做。同样,我可能有100个用户循环。我在质疑我上面的初始mySQL查询是否正确或应该采用不同的方式。

最终,我想列出所有用户的姓名,姓氏和他们正确的号码。并按他们正确的数字命令他们DESC。从本质上讲,它是一个看起来像......的排行榜。

Jim Smith 2
Charlie Wilson 1
and so on (but on a much greater scale where the person in first place will probably have around 80 or 90 correct).

因为我想在"排行榜"上显示名字,我知道我需要在这里的某个地方加入来从USERS表中获取该信息,所以它让我的小脑更加复杂: )

我希望这对某人有意义。如果有人能指出我正确的方向,那将是太棒了。我失去理智,在一天结束时可能相当简单。

谢谢!

2 个答案:

答案 0 :(得分:0)

通过左边加入用户0并计算每个人的订购匹配数,下面的查询将为您提供每个用户的正确条目计数

select t1.userid, count(t2.*)
from entries t1
left join entries t2 on t2.userid = 0 
    and t2.personid = t1.personid
    and t2.ordering = t1.ordering
group by t1.userid

如果您需要用户表中的名称,可以加入

select u.*, count(t2.*)
from entries t1
join users u on u.userid = t1.userid
left join entries t2 on t2.userid = 0 
    and t2.personid = t1.personid
    and t2.ordering = t1.ordering
group by u.userid

答案 1 :(得分:0)

你走在正确的轨道上。在循环中比较$entriesarray中的所有用户并不会比您已经完成的复杂得多。

首先,将用户0从$entriesarray转移,以获得匹配的正确设置。然后你可以迭代其余的条目数组,计算正确的匹配,如此...

$correctSet = $entriesarray[0];
unset($entriesarray[0]); // we don't want to check this against itself
$leaderBoard = []; // initialize an empty leaderboard array
foreach($entriesarray as $userId => $entries) {
    $correctMatches = count(array_intersect_assoc($entries, $correctSet));
    $leaderBoard[$userId] = $correctMatches;
}

就在SQL中这样做,也可以通过对user_id 0进行JOIN,如上所述(所以我不打扰重复)。用户信息也可以单独获取并由user_id查找,因为您已在此方法中的$leaderboard数组中获得了该信息。