如何使用in_array函数比较2个数组

时间:2017-09-03 20:14:19

标签: php arrays foreach

我有2个数组我需要以相同的顺序进行精确比较,我需要检查类subAsubB中的每个数组是否包含先决条件中的数组。

我的先决条件数组

Array
(
    [s1] => MAT
    [s2] => ENG
    [s3] => PHY
    [s4] => CHE
    [s5] => FRE
)

和我的班级数组

Array
(
    [subA] => MAT
    [subB] => ENG
)
Array
    (
     [subA] => ENG
     [subB] =>
    )
Array
    (
     [subA] => MAT
     [subB] => PHY
    )
Array
    (
     [subA] => CHE
     [subB] => 
    )
Array
    (
     [subA] => MAT
     [subB] => FRE
    )

我的代码

$prerequisite = array(
  's1' => 'MAT',
  's2' => 'ENG',
  's3' => 'PHY',
  's4' => 'CHE',
  's5' => 'FRE'
);

$confirmed = TRUE;

$i = 0;
foreach($prerequisite as $p )
{                     
  if( in_array( $prerequisite, $classes[$i] ) )
  {
    // The prerequisite has been met
  }
  else
  {
    // The prerequisite has not been met
    $confirmed = FALSE;
  }
  $i++;
}

if($confirmed == TRUE) { //run insert query here }

预期输出

如果满足所有先决条件,我需要返回TRUE, 需要它来找到例如:

  • 如果来自班级subAsubB的第一个数组与先决条件数组中的s1MAT匹配
  • 如果类subAsubB中的第二个数组与先决条件数组中的s2ENG匹配
  • 如果类subAsubB中的第三个数组与先决条件数组中的s3PHY匹配
  • 如果来自班级subAsubB的第四个数组与先决条件数组中的s4CHE匹配
  • 如果来自班级subAsubB的第五个数组与先决条件数组中的s5FRE匹配

问题

我总是得到FALSE并且无法运行插入查询

3 个答案:

答案 0 :(得分:1)

你没有使用$p,你提供了一个数组作为in_array()的针参数:with statement

如果用$p替换in_array指针,您将在$classes[$i]搜索单个值而不是整个数组。

你似乎也不需要整个街区,只需使用! (不)在条件而不是检查条件和使用else块。

if( ! in_array( $p, $classes[$i] ) )
{
    $confirmed = false;
}

答案 1 :(得分:1)

这个问题为PHP函数array_map()提供了一个漂亮的用例:

$prerequisite = array(
  's1' => 'MAT',
  's2' => 'ENG',
  's3' => 'PHY',
  's4' => 'CHE',
  's5' => 'FRE'
);

$classes = array(
    array(
        'subA' => 'MAT',
        'subB' => 'ENG',
    ),
    array(
        'subA' => 'ENG',
        'subB' => NULL,
    ),
    array(
        'subA' => 'MAT',
        'subB' => 'PHY',
    ),
    array(
        'subA' => 'CHEx',        // <---- doesn't match the prerequisite
        'subB' => NULL,
    ),
    array(
        'subA' => 'MAT',
        'subB' => 'FRE',
    ),
);

// array_filter() removes the matching classes
$missing = array_filter(
    array_map(
        function(array $class, $pre, $key) {
            // Return $key when the values of both 'subA' and 'subB'...
            // ... are different than the expected prerequisite
            return ($class['subA'] !== $pre && $class['subB'] !== $pre) ? $key : NULL;
        },
        $classes,
        $prerequisite,
        array_keys($prerequisite)
    )
);


// $missing associates the keys of $classes (numbers) to the keys of $prerequisite
// ... for classes that do not match their prerequisite
print_r($missing);

输出结果为:

Array
(
    [3] => s4
)

答案 2 :(得分:0)

  

这可能是以下内容的重复:Checking to see if one array's elements are in another array in PHP

您应该使用 array_intersect 来实现此方法......

我会回答,因为还有其他事情你还没有清除。

$prerequisite = array(
  's1' => 'MAT',
  's2' => 'ENG',
  's3' => 'PHY',
  's4' => 'CHE',
  's5' => 'FRE'
);

$classes1 = array(
    "subA" => "MAT",
    "subB" => "ENG"
);

$classes2 = array(
    "subA" => "ENG",
    "subB" => ""
);

if(!empty(array_intersect($prerequisite, $classes1))) { 
    //run insert query here
}

你遗漏了一些东西:

  • 您已使用$classes作为数字数组而非关联数据
  • 您在 foreach
  • 中错过了$p

正如您所看到的,我已经从您告诉我的查询中创建了数组。

您可以在here

上看到此问题