Php 查找在具有多个值的平面数组中完全表示的数组

Php 查找在具有多个值的平面数组中完全表示的数组,php,arrays,multidimensional-array,array-intersect,Php,Arrays,Multidimensional Array,Array Intersect,这是我第三次就这个话题发帖了。用户爸爸每次都帮我。由于SO网站没有用户信息系统——不幸的是——我在一篇帖子里问了一个问题。再说一遍 在用户Baba的帮助下,我们成功地创建了一个函数来检查一个数组是否包含另一个数组,但该函数会多次确定它并创建一个索引列表。该函数缺少的是,我需要知道的是,该函数在异常中不会像预期的那样返回-1。函数可能返回不相关的值,并且函数不一致。我们只需要检查哪些数组与主数组($leftArray)匹配,并返回这些数组的索引。如果没有任何匹配的数组,函数必须返回-1 请查看此代

这是我第三次就这个话题发帖了。用户爸爸每次都帮我。由于SO网站没有用户信息系统——不幸的是——我在一篇帖子里问了一个问题。再说一遍

在用户Baba的帮助下,我们成功地创建了一个函数来检查一个数组是否包含另一个数组,但该函数会多次确定它并创建一个索引列表。该函数缺少的是,我需要知道的是,该函数在异常中不会像预期的那样返回-1。函数可能返回不相关的值,并且函数不一致。我们只需要检查哪些数组与主数组($leftArray)匹配,并返回这些数组的索引。如果没有任何匹配的数组,函数必须返回-1

请查看此代码并帮助我:

<?php
$leftArray = array(7,6,14,15,8,0,1,4,5,9); 
//contains $GroupOfFour[6] and $GroupOfFour[1], and some excess
//numbers. Function should return array(6,1), If there is not a
//matching case the function should return -1.
//i've realised that the exception cases and the multiple
//grouping does not work.

$GroupOfFour = array (
                     array(3,2,7,6),
                     array(7,6,15,14),
                     array(15,14,11,10),
                     array(1,3,5,7),
                     array(5,7,13,15),
                     array(13,15,9,11),
                     array(0,1,4,5),
                     array(4,5,12,13),
                     array(12,13,8,9),
                     array(0,4,12,8),
                     array(1,5,13,9),
                     array(3,7,15,11),
                     array(2,6,14,10),
                     array(0,1,3,2),
                     array(4,5,7,6),
                     array(12,13,15,14),
                     array(8,9,11,10),
                     array(0,2,8,10),
                     array(0,1,8,9),
                     array(1,3,9,11),
                     array(3,2,11,10),
                     array(0,4,2,6),
                     array(4,12,6,14),
                     array(12,14,8,10)
                     );

function searchFourTerms($leftArray, $GroupOfFour) {
    global $GroupOfFour, $leftArray;
    $len4 = count($leftArray);
    $len4_carry = count($leftArray);
    $list4 = array();
    for($i4 = 0; $i4 < count($GroupOfFour); $i4 ++) {
        $intercept4 = array_intersect($GroupOfFour[$i4], $leftArray);
        $len4 = count($intercept4);
        if (count($intercept4) % 4 == 0) {
            $list4[$i4] = $len4;
        }
    }
    arsort($list4);
    if (empty($list4) || ($len4_carry<4))
        return - 1;
    return key($list4);
}

?>
键($list4)将只返回list4的当前索引。在你的情况下,它将返回18

试试这个,它对我有用。我没有返回key($list4),而是返回了一个匹配索引的数组

function searchFourTerms($la, $gof) {
$i3=0;
if(count($la)<4){
    return -1;
}
$list4 = array();
for($i4 = 0; $i4 < count($gof); $i4++) {
    $intercept4 = array_intersect($gof[$i4], $la);
    $len4 = count($intercept4);
    if(count($intercept4)==4) {
        $list4[$i3] = $i4;
        $i3++;
    }
}
if (empty($list4)){
    return - 1;
}
$list5= array();
$i7=0;
for($i4=0; $i4<count($list4); $i4++){
    $i6=0;
    for($i5=0; $i5<count($list4); $i5++){
        if($i4!=$i5){
            $i6+=count(array_intersect($gof[$i4], $gof[$i5]));
        }
    }
    if($i6<count($gof[$i4])){
        $list5[$i7]=$list4[$i4];
        $i7++;
    }
}
return $list5;
}

这就是返回多个键所需的全部内容

var_dump(searchFourTerms($leftArray, $GroupOfFour));
输出(所有组使用数组_切片拾取任意2个)

修改后的函数

function searchFourTerms($leftArray, $GroupOfFour) {
    $len4 = count($leftArray);
    $len4_carry = count($leftArray);
    $list4 = array();
    for($i4 = 0; $i4 < count($GroupOfFour); $i4 ++) {
        $intercept4 = array_intersect($GroupOfFour[$i4], $leftArray);
        $len4 = count($intercept4);
        if (count($intercept4) % 4 == 0) {
            $list4[$i4] = $len4;
        }
    }
    arsort($list4);
    if (empty($list4) || ($len4_carry < 4))
        return - 1;
    return array_keys($list4);
}
函数searchFourTerms($leftArray,$groupOffFour){
$len4=计数($leftArray);
$len4_进位=计数($leftArray);
$list4=array();
对于($i4=0;$i4
我已经重命名了输入变量并减少了MCVE中的数据量

您只需要执行迭代的
array\u intersect()
调用。如果未声明输出数组,则返回
-1

代码:()

输出:

array (
  0 => 1,
  1 => 6,
)

请添加到先前问题的链接,该问题不正确。。。它是1,6,14,18,20。。。检查你的selfBaba,等等,我会给你发一些例外的东西。是什么使
6,1
不同于
14,18,20
$leftArray=array(1,4,13,15);程序输出20。但是输出应该是-1。我在这里错了吗?是的,它确实起作用了。让我也问你一个简单的修改。如果一个组是不必要的,它不应该给出它的索引。例如,$leftArray=0,1,3,2,7,6,8,9有3个匹配案例。[13] ,[18]和[0]。但是[13]中的元素已经包含在[18]和[0]组中。因此[13]是没有必要的。我希望你能理解:)它是有效的。但我需要一个简单的修改。如果一个组的元素已经在另一个组中,则该组是不必要的。应该消除这一群体。我需要code.FYI上的行为,更新函数以排除不必要的组。这应该能回答你的问题。
function searchFourTerms($leftArray, $GroupOfFour) {
    $len4 = count($leftArray);
    $len4_carry = count($leftArray);
    $list4 = array();
    for($i4 = 0; $i4 < count($GroupOfFour); $i4 ++) {
        $intercept4 = array_intersect($GroupOfFour[$i4], $leftArray);
        $len4 = count($intercept4);
        if (count($intercept4) % 4 == 0) {
            $list4[$i4] = $len4;
        }
    }
    arsort($list4);
    if (empty($list4) || ($len4_carry < 4))
        return - 1;
    return array_keys($list4);
}
$haystack = [7, 6, 14, 15, 8, 0, 1, 4, 5, 9];
$needles = [
    [3, 2, 7, 6],
    [7, 6, 15, 14],
    [15,14,11,10],
    [1,3,5,7],
    [5,7,13,15],
    [13,15,9,11],
    [0,1,4,5],
    [4,5,12,13],
];

function getIndexOfMatchingArrays(array $needles, array $haystack) {
    if (!$haystack) {
        return -1;
    }
    foreach ($needles as $index => $needle) {
        if ($needle === array_intersect($needle, $haystack)) {
            $fullMatch[] = $index;
        }
    }
    return $fullMatch ?? -1;
}

var_export(
    getIndexOfMatchingArrays($needles, $haystack)
);
array (
  0 => 1,
  1 => 6,
)