【问题标题】:PHP - Filtering an array to delete the values with non-similar keys from sub-arraysPHP - 过滤数组以从子数组中删除具有不相似键的值
【发布时间】:2018-08-24 05:37:13
【问题描述】:

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

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

感谢任何建议。

【问题讨论】:

  • 如何创建第一个数组。如果您创建它,您可以忽略这些键,对吗?你试过吗?
  • @LahiruMadusanka 该数组来自一个定期更新的数据库。不在我的控制范围内,我也无法事先知道哪些键会在那里。

标签: php arrays associative-array


【解决方案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);
}

【讨论】:

    【解决方案2】:

    您可以拼接数组并循环其余部分。
    在循环中,我用每次迭代中相同的内容覆盖 $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

    【讨论】:

    • 感谢您的回答。我不想改变数组的实际结构。所以我的结果应该看起来像 $new =[ ['c' => 3], ['c' => 3], ['c' => 3]];
    • 在这种情况下,我认为我们需要循环两次查看更新的代码。
    • @sam11 没问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 2011-08-31
    • 2021-08-06
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多