我会比较两个数组。 $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']
];
答案 0 :(得分:1)
圣诞快乐!
我不认为PHP有一个标准功能来解决这个问题(虽然我可能已经错过了你的一个)。有许多数组函数,但大多数函数不在嵌套数组上工作,或只执行特定任务。
但是自己编写一个函数通常很容易,如果可以的话,可以利用内置函数。
以下函数迭代$ tr中的每个项目。对于每个项目,它迭代$ dm的项目。然后使用array_diff
获取dm项中缺少的项目列表。如果该列表为空,则表示第一个数组中的所有项都包含在第二个数组中,第一个数组应该在结果中。
我注意到此函数还会在结果中返回['c', 'd']
,因为c
和d
都包含在$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;
}