我在思考如何比较以下数组的适当逻辑:
$a = [
"ip" => [
"1.2.3.4",
"4.3.2.1",
],
"domain" => [
"example.com",
"another.domain",
],
];
$b = [
[
"id"=> 136589,
"metaname" => "ip",
"metavalue" => "1.2.3.4",
],
[
"id"=> 136590,
"metaname" => "domain",
"metavalue" => "example.com",
],
];
我需要循环遍历 $a 来查找在 $b 中不存在的键('ip')值('1.2.3.4')组合。在数组 $a 中,我需要捕获 IP '4.3.2.1' 和域名 'another.domain'。 $b 是否可能具有不同键的匹配值?
一个好的例子是 IP 地址。可能与 IP 相关的元名称值为 'ip'、'ip.dst' 和 'ip.src'。回到示例数据 - 即使 'ip' 匹配,如果元名称不匹配,则应跳过。
foreach ($a as $metaName => $metaValues)
{
foreach ($metaValues as $metaValue)
{
foreach ($b as $row)
{
if (in_array($metaName, $row) && in_array($metaValue, $row))
{
# this pair exists, move on to next $metaName-$metaValue pair
break;
}
# this is where i am now, making small progress
# more trial and error going on
}
}
}
在我的示例代码中,我需要帮助的地方是注释处。我尝试了各种不同的检查和循环来捕获适当的数据,但都无济于事...
in_array($metaValue, $row)
array_keys($row, $metaValue)
if
语句等,但这并没有帮助。如果我的描述没有清楚表达,也许下面的表格可以帮助一下。
+ A ---------------------+----+ B ------------------+ Comment ------------------------+
| ip, 1.2.3.4 | == | ip, 1.2.3.4 | Skip, no more checks |
+------------------------+----+---------------------+---------------------------------+
| ip, 4.3.2.1 | != | ip, 1.2.3.4 | Keep checking |
| | != | domain, example.com | No more B to compare, I want A! |
+------------------------+----+---------------------+---------------------------------+
| domain, example.com | != | ip, 1.2.3.4 | Keep checking |
| | == | domain, example.com | Skip, no more checks |
+------------------------+----+---------------------+---------------------------------+
| domain, another.domain | != | ip, 1.2.3.4 | Keep checking |
| | != | domain, example.com | No more B to compare, I want A! |
+------------------------+----+---------------------+---------------------------------+