使用另一个不包含所有列的二维数组过滤二维数组中的关联行

问题描述 投票:0回答:2

我正在使用

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'。

php arrays multidimensional-array filtering array-intersect
2个回答
3
投票

您可以改用

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

演示:https://3v4l.org/4Qhmr


0
投票

如果验证数组中的列是“开发人员事先知道的”(就像在 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 在检查键是否存在时速度非常快。

© www.soinside.com 2019 - 2024. All rights reserved.