Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在php数组中一次找到多个值_Php_Arrays - Fatal编程技术网

如何在php数组中一次找到多个值

如何在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

试着做一个井字游戏。所以如果有更好的方法我也想知道! 所以我有一个网格[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_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(..)
,这是完全一样的东西@当然是德克塞!这确实简化了事情。非常感谢。