如何在php数组中一次找到多个值
试着做一个井字游戏。所以如果有更好的方法我也想知道! 所以我有一个网格[0,8],用户的位置存储在一个数组中。伟大的 接下来我想看看这些列是否匹配。假设第一行是(0,1,2)。 我的问题是,如果用户有一个类似于如何在php数组中一次找到多个值,php,arrays,Php,Arrays,试着做一个井字游戏。所以如果有更好的方法我也想知道! 所以我有一个网格[0,8],用户的位置存储在一个数组中。伟大的 接下来我想看看这些列是否匹配。假设第一行是(0,1,2)。 我的问题是,如果用户有一个类似于数组(1,5,6,0,2)的数组,那么他就赢了。我怎样才能有效地匹配它? 我曾想过做类似的事情,但看起来效率不高: $user= array(1,5,6,0,2); in_array(0,$user) && in_array(1,$user) && in_a
数组(1,5,6,0,2)
的数组,那么他就赢了。我怎样才能有效地匹配它?
我曾想过做类似的事情,但看起来效率不高:
$user= array(1,5,6,0,2);
in_array(0,$user) && in_array(1,$user) && in_array(2,$user)
我也考虑了switch case,但仍然面临如何一次找到多个值的问题。我不会声称这是最有效的方法,但与
&&
链接和多个in_array()
调用相比,它大大减少了操作数量
我们要做的是保留一个可能的赢组合的二维数组:行、列、对角线,作为子数组。然后,在该2D数组上的foreach
循环中,根据与的行组合测试用户的当前数组状态。如果用户的数组中存在整个获胜组合,array\u intersect()
的结果将是3,您可以使用count()
进行测试
因为一场比赛就足以获胜,所以你可以在第一场比赛中打破循环宣布胜利
$combinations = array(
// Rows
array(0,1,2),
array(3,4,5),
array(6,7,8),
// Columns
array(0,3,6),
array(1,4,7),
array(2,5,8),
// Diagonals
array(0,4,8),
array(2,4,6),
);
// Loop over the array of winners and test array_intersect()
// If 3 values intersect, the full win combination was matched
foreach ($combinations as $combination) {
if (count(array_intersect($combination, $user)) == 3) {
// User wins! Take whatever action necessary...
// Exit the loop
break;
}
}
下面是一个演示,其中,$user
的三套中有两套是赢家:
有生成获胜组合的算法方法,而不是对它们进行硬编码,但是只有八种可能的组合,所以这并不难,这里的要点是使用
array_intersect()
查找用户当前位置的子集。我同意,有这么少的可能组合可以获胜,解决方案可以保持非常简单。我会使用array_diff来完成它
function has_won($user) {
// returns false if the user has not won, otherwise
// returns the first winning combination found.
$wins = [[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[0,4,8],[2,4,6]];
foreach ($wins as $win) {
if (!array_diff($win, $user)) return $win;
// array_diff returns the values in the first argument
// not present in any subsequent arguments. So if its
// result is empty, the user has winning combination.
}
return false;
}
您可以使用将表示行的数组
[0,1,2]
与用户的数组进行比较,并验证交叉点的输出是否具有count()==3
,这意味着所有3个都匹配。在庞大的PHP集合中,有许多可以以某种方式满足您的需求。您是否计划保留一个可能的值列表,这些值构成一行(简单),或者您希望通过算法(稍微难一点)确定这些值?这可能很有趣:对于tic-tac-toe,我会选择使用二维矩阵a.k.a.数组,填充三个可能的值0(未占用空间)、1(x)和-1(o),然后计算行、列和对角线的总和。Tictatcoe相当简单,因为只有8种方法可以赢得3个水平、3个垂直、2个对角线)。只需查看8个“获胜”数组中是否有一个是$user
数组的子集。谢谢大家。我喜欢所有的答案,非常有趣。我认为这是简洁的,实际上相当棒。给未来的读者注意:在这个上下文中直接使用empty()
将需要PHP5.5。对于5.4及以下版本,这将是一个解析错误,因为array_diff()
的结果不是一个变量。array_diff()
首先需要存储在变量中,然后再传递给empty()
。5.5可以对表达式的结果进行运算。@MichaelBerkowski优秀点;非常感谢。我应该在回答中提到这一点。首先为什么要在这里使用empty
,尤其是当它需要所有这些警告时?只要写!数组_diff(..)
,这是完全一样的东西@当然是德克塞!这确实简化了事情。非常感谢。