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']
,因为 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);
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;
}
我会比较这两个数组。 $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']
,因为 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);
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;
}