使用平面黑名单数组过滤二维数组的每一行

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

我有一个包含黑名单值的平面数组

Array ( [0] => 1 [1] => 2 )

我需要使用该黑名单从以下二维数组中删除元素。

Array (
    [0] => Array ( [id_1] => 3 [id_2] => 1 )
    [1] => Array ( [id_3] => 5 [id_4] => 3 )
) 

我想比较这些数组并获取一个包含二维关联数组中不存在的值的数组。

结果应该是

array(3)
array(5,3)

php arrays multidimensional-array filter blacklist
3个回答
3
投票
$array1 = array(1,2);

$array2 = array(
    array(
        'id_1' => 3,
        'id_2' => 1
    ),
    array(
        'id_3' => 5,
        'id_4' => 3,
    )
);

我不确定我是否理解这个问题,如果你想单独比较每个数组:

foreach($array2 as $subarray) {
    var_dump(array_diff($subarray, $array1));
}

返回:

array
  'id_1' => int 3
array
  'id_3' => int 5
  'id_4' => int 3

否则,如果您不想循环并展平数组(使用 array_values 的 php 文档注释中的 array_flatten 函数)

http://www.php.net/manual/en/function.array-values.php#97715

function array_flatten($a,$f=array()){
    if(!$a||!is_array($a))return '';
    foreach($a as $k=>$v){
        if(is_array($v))$f=array_flatten($v,$f);
        else $f[$k]=$v;
    }
    return $f;
}


var_dump(
    array_unique(
        array_diff(
            array_flatten($array2), $array1
        )
    )
);

返回:

array
  'id_1' => int 3
  'id_3' => int 5

“id_4”未显示,因为它没有唯一值。您可以使用

array_values()
删除密钥,或者通过从代码中删除
array_unique()
保留“id_4”。


2
投票

也许是这样的?

$array_a = array(1, 2);
$array_b = array(array(1, 3), array(3, 1));

$result = array();

foreach($array_b as $key => $sub_array_b){
    foreach($sub_array_b as $sub_key => $value){
        if(!in_array($value, $array_a) && !in_array($value, $result)) array_push($result, $value);        
    }
}

编辑:我在您编辑问题之前输入了此内容。您仍然可以修改上面的代码,以便为关联数组中的每个子数组创建一个不同的数组。


0
投票

对于过滤行数据的函数式方法,请使用

array_map()
迭代调用
array_diff()

$array1 = [1, 2];

$array2 = [
    ['id_1' => 3, 'id_2' => 1],
    ['id_3' => 5, 'id_4' => 3],
];

var_export(
    array_map(fn($row) => array_diff($row, $array1), $array2)
);

输出:

array (
  0 => 
  array (
    'id_1' => 3,
  ),
  1 => 
  array (
    'id_3' => 5,
    'id_4' => 3,
  ),
)
© www.soinside.com 2019 - 2024. All rights reserved.