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

时间:2016-12-25 07:42:12

标签: php arrays compare apriori

我会比较两个数组。 $db是第一个数组,$tr是第二个数组。 $tr$db进行比较。如果$tr中的值$db。然后$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']
    ];

2 个答案:

答案 0 :(得分:1)

圣诞快乐!

我不认为PHP有​​一个标准功能来解决这个问题(虽然我可能已经错过了你的一个)。有许多数组函数,但大多数函数不在嵌套数组上工作,或只执行特定任务。

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

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

我注意到此函数还会在结果中返回['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);

答案 1 :(得分:0)

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;
}