PHP - 过滤数组以从子数组中删除具有不相似键的值

PHP - Filtering an array to delete the values with non-similar keys from sub-arrays

我有一个如下所示的数组。这是来自一个集中式数据库,我无法事先知道实际数组将包含什么。我想比较键上的子数组,这就是为什么要删除不存在的键的所有子数组。

Array (
    [0] => Array
        (
            [a] => 
            [b] => 8
            [c] => 1
            [d] => taille-8
            [e] => 
            [k] => taill
        )

    [1] => Array
        (
            [a] => 
            [b] => 7
            [c] => 2
            [d] => taille-7
            [f] =>
            [k] => tafefef
        )

    [2] => Array
        (
            [a] => ce
            [b] => 34
            [c] => 2
            [d] => taille-34
            [g] => dee
            [k] => tacefef
        ) );

我想删除所有子数组中不重复的键。在上面的示例中,它们是 'e'、'f' 和 'g'。这需要动态发生。

Array (
    [0] => Array
        (
            [a] => 
            [b] => 8
            [c] => 1
            [d] => taille-8
            [k] => taill
        )

    [1] => Array
        (
            [a] => 
            [b] => 7
            [c] => 2
            [d] => taille-7
            [k] => tafefef
        )

    [2] => Array
        (
            [a] => ce
            [b] => 34
            [c] => 2
            [d] => taille-34
            [k] => tacefef            
        ) );

如有任何建议,我们将不胜感激。

你可以拼接数组,然后循环剩下的。
在循环中,我用每次迭代中相同的内容覆盖 $new。
结尾应该是整个数组中匹配的内容。

然后我们需要使用新的和作为模板删除数组中的其他项,所以我们再次循环并再次相交但这次覆盖$arr。

$arr =[['a' => 1, 'b' => 2, 'c' => 3],
       ['a' => 1, 'c' => 3],
       ['c' => 3]];

$new = $arr[0];

foreach($arr as $sub){
    $new = array_intersect_key($new, $sub);
}
foreach($arr as &$sub){
    $sub =array_intersect_key($sub, $new);
}
unset($sub);
Var_dump($arr);

输出

array(3) {
  [0]=>
  array(1) {
    ["c"]=>
    int(3)
  }
  [1]=>
  array(1) {
    ["c"]=>
    int(3)
  }
  [2]=>
  &array(1) {
    ["c"]=>
    int(3)
  }
}

https://3v4l.org/oM3M1l

您可以使用参数解包。如果您的数组存储在 $a 中,那么以下应该有效:

// create an array with only the keys that are common to all subarrays
$new = array_intersect_key(...$a);

// prune original array
foreach ($a as &$arr) {
    $arr = array_intersect_key($new, $arr);
}