我正在使用
array_intersect
来比较两个二维数组。
$myArray = array(
array(
'site_id' => 'S6407',
'tssr_id' => 'TSSRBOQ-200204-0145-59'
),
array(
'site_id' => 'S5910',
'tssr_id' => 'TSSRBOQ-200204-0145-8'
),
);
// $items_tssr is get from another variable
foreach ($items_tssr as $key => $value) {
$array_validate[] = array(
'site_id' => $value['site_id'],
'tssr_id' => $value['no_tssr_boq_site']
);
}
$result = array_map(
'unserialize',
array_intersect(
array_map('serialize', $myArray),
array_map('serialize', $array_validate)
)
);
// if there are same
if (array_key_exists(0, $result) {
echo 'process this';
} else {
echo 'dont process this';
}
我的问题是原来的
$myArray
包含的列比'site_id'和'tssr_id'更多。
$myArray_origin = array(
'site_id' => 'S6407',
'tssr_id' => 'TSSRBOQ-200204-0145-59'
'site_name' => 'Site S6407',
'id_site_doc'=> '127361,
'implementation_id' => 'imp4121',
'status' => "implementation_created",
"endstate" => false
),
...
如何在不丢弃一些值的情况下过滤
$myArray_origin
数组? $array_validate
仅包含 2 列数据:'site_id' 和 'tssr_id'。
array_filter
+ in_array
。这只会保留site_id
和tssr_id
出现在array_validate
自己的条目之一中的条目:
$result = array_filter($myArray, function (array $entry) use ($array_validate): bool {
return in_array([
'site_id' => $entry['site_id'],
'tssr_id' => $entry['tssr_id']
], $array_validate, true);
});
如果验证数组中的列是“开发人员事先知道的”(就像在 Jeto 的解决方案中一样),则可以使用本机函数 --
array_uintersect()
。 演示
var_export(
array_uintersect(
$array,
$validate,
fn($a, $b) =>
[$a['site_id'], $a['tssr_id']]
<=>
[$b['site_id'], $b['tssr_id']]
)
);
如果事先不知道列,则需要迭代函数调用。 演示
var_export(
array_filter(
$array,
function($row) use ($validate) {
foreach ($validate as $filter) {
if (!array_diff_assoc($filter, $row)) {
return true;
}
}
return false;
}
)
);
注意,如果要进行严格比较,请记住数据类型。 例如,
false
大致等于null
。
为了通过严格的比较获得最大的可靠性,需要更大的代码长度。 演示
var_export(
array_filter(
$array,
function($row) use ($validate) {
foreach ($validate as $filter) {
foreach ($filter as $k => $v) {
if (!key_exists($k, $row) || $row[$k] !== $v) {
return false;
}
}
}
return true;
}
)
);
在两个二维数组之间进行关联比较不会是一个高性能的操作。如果您发现自己处于这种情况,请尝试重构您的代码以对一个或两个有效负载进行基于键的比较。查找数组是优化过滤操作的好工具,因为 PHP 在检查键是否存在时速度非常快。