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

时间:2018-08-24 05:37:14

标签: php arrays associative-array

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

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

任何建议都值得赞赏。

2 个答案:

答案 0 :(得分:1)

您可以使用参数解包。如果您的数组存储在$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);
}

答案 1 :(得分:0)

您可以拼接数组并循环其余部分。
在循环中,我用每次迭代中相同的内容覆盖$ new。
最后应该是整个数组中匹配的东西。

然后,我们需要使用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