PHP 比较或搜索两个不同数组的数组

PHP comparing or searching a array of two different arrays

我会比较这两个数组。 $db 是第一个数组,$tr 是第二个数组。 $tr$db 进行比较。如果 $db 中的值 $tr。然后 $result 包含 $tr 的值:

第一个数组是$db

$db = [
        ['a','d'],
        ['a','e','f'],
        ['g'],
        ['b','e','d'],
        ['a','d','c','e'],
        ['d','g'],
        ['c','a','h','e','f','h'],
        ['g','e','h'],
        ['d','f','b','h','g']
    ];

第二个数组是$tr

$tr = [
        ['a','b'],
        ['a','c'], //in
        ['a','d'], //in
        ['b','c'],
        ['b','d'], //in
        ['c','d'],
    ];

如果 $db$tr 比它产生

将得到这样的结果 $result

$result = [
        ['a','c'],
        ['a','d'],
        ['b','d']
    ];

圣诞快乐!

我认为 PHP 没有解决此问题的标准函数(尽管我可能错过了适合您的函数)。有大量的数组函数,但它们中的大多数不适用于嵌套数组,或者仅执行特定任务。

但是自己编写函数通常很容易,如果可以的话,利用内置函数。

下面的函数遍历 $tr 中的每个项目。对于每个项目,它迭代 $dm 的项目。然后它使用 array_diff 获取 dm 项目中缺少的项目列表。如果该列表为空,则意味着第一个数组中的所有项目都包含在第二个数组中,并且第一个数组应该在结果中。

我在结果中也注意到这个函数 returns ['c', 'd'],因为 cd 都包含在 $dm 的数组之一中.所以也许你错过了那个,或者我没有正确理解规格。无论如何,这至少应该让你开始:

<?php

$db = [
        ['a','d'],
        ['a','e','f'],
        ['g'],
        ['b','e','d'],
        ['a','d','c','e'],
        ['d','g'],
        ['c','a','h','e','f','h'],
        ['g','e','h'],
        ['d','f','b','h','g']
    ];

$tr = [
        ['a','b'],
        ['a','c'], //in
        ['a','d'], //in
        ['b','c'],
        ['b','d'], //in
        ['c','d'],
    ];


function nested_array_intersect($source, $comparewith) {
  $result = array();

  foreach ($source as $sItem) {

    foreach ($comparewith as $cwItem) {

      $missingItems = array_diff($sItem, $cwItem);

      if (count($missingItems) === 0) {

        $result[] = $sItem;
        break;

      }
    }
  }
  return $result;
}

$result = nested_array_intersect($tr, $db);

print_r($result);
function compare($db, $tr)
{
    $result = [];

    foreach ($db as $val) {
        $dbformat[] = implode("", $val);
    }

    foreach ($tr as $val) {
        $pattern = "";
        foreach($val as $one) {
            $pattern .= $one.".*?";
        }
        foreach ($dbformat as $value) {
            $countMatch = preg_match("/".$pattern."/", $value);
            if($countMatch) {
                $result[] = $val;
                break;
            }
        }
    }

    return $result;
}