【问题标题】:how to compare 2 arrays using in_array function如何使用 in_array 函数比较 2 个数组
【发布时间】:2017-09-03 20:14:19
【问题描述】:

我有 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 并且无法运行插入查询

【问题讨论】:

  • 你能把 $classes 数组放到你的代码里吗?
  • @Ikillnukes 我的类数组来自在此条件之前运行的查询,这就是为什么我在我的问题中发布类数组的输出

标签: php arrays foreach


【解决方案1】:

您没有使用$p,而是提供了一个数组作为in_array() 的指针参数:http://php.net/manual/en/function.in-array.php

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

您似乎也不需要整个块,只需使用 ! (not) on the condition 而不是检查条件并使用 else 块。

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

【讨论】:

    【解决方案2】:

    这个问题为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
    )
    

    【讨论】:

      【解决方案3】:

      这可能与以下内容重复: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 上看到此功能

      【讨论】:

        猜你喜欢
        • 2017-12-27
        • 1970-01-01
        • 2019-01-26
        • 1970-01-01
        • 1970-01-01
        • 2019-09-11
        • 2023-01-29
        • 2011-12-01
        • 1970-01-01
        相关资源
        最近更新 更多