【问题标题】:Using array_filter to filter multidimensional array with another array使用 array_filter 用另一个数组过滤多维数组
【发布时间】:2018-11-08 15:32:59
【问题描述】:

我有两个数组,第二个是多维的。我正在尝试返回第三个数组,其中 Array2 中的 service_id 与 Array1 中的值匹配。

Array1
(
    [0] => 158
    [1] => 162
)

Array2
(
    [localhost] => Array
        (
            [0] => Array
                (
                    [host_name] => localhost                        
                    [current_state] => 0                   
                    [service_id] => 158
                )

            [1] => Array
                (
                    [host_name] => localhost
                    [current_state] => 0                        
                    [service_id] => 159
                )
        )
    [192.168.0.43] => Array
        (
            [0] => Array
                (
                    [host_name] => 192.168.0.43                        
                    [current_state] => 0
                    [service_id] => 168
                )

            [1] => Array
                (
                    [host_name] => 192.168.0.43
                    [current_state] => 1
                    [service_id] => 162
                )
        )
)

所以 Array3 应该是:

Array3
(
    [localhost] => Array
        (
            [0] => Array
                (
                    [host_name] => localhost                        
                    [current_state] => 0                   
                    [service_id] => 158
                )

     [192.168.0.43] => Array
        (
            [0] => Array
                (
                    [host_name] => 192.168.0.43
                    [current_state] => 0                   
                    [service_id] => 162
                )
        )
)

这是我目前所拥有的,但它似乎没有过滤整个数组。

$Array3= array_filter($Array2, function ($value) use ($Array1) {
        return in_array(array_shift($value)['service_id'], $Array1);
});

我离这里很近吗,我错过了什么?

【问题讨论】:

    标签: php arrays


    【解决方案1】:

    我认为这是因为您想在第二个深度进行过滤,它需要遍历第一级然后过滤第二级(认为这是有道理的)。

    因此,此代码使用array_map() 循环遍历数组的主机级别(localhost192.168.0.43),然后在其中使用array_filter()。必须使用use() 将查找数组传递到函数的每一级

    $array3 = array_map(function($data) use ($Array1)
        { return array_filter($data, function($sub) use ($Array1)
            { return in_array($sub["service_id"], $Array1); });
    }, $Array2);
    
    print_r($array3);
    

    打印...

    Array
    (
        [localhost] => Array
            (
                [0] => Array
                    (
                        [host_name] => localhost
                        [current_state] => 0
                        [service_id] => 158
                    )
    
            )
    
        [192.168.0.43] => Array
            (
                [1] => Array
                    (
                        [host_name] => 192.168.0.43
                        [current_state] => 1
                        [service_id] => 162
                    )
    
            )
    
    )
    

    【讨论】:

      【解决方案2】:

      所以下面应该是你实现 $Array3 所需要的:

      $Array3 = array(array($Array2[0][0], $Array2[0][1], $Array1[0]), array($Array2[1][0],
      $Array2[1][1], $Array1[1]));
      

      但是,为了更动态地实现这一点,您需要使用类似的东西:

      $Array3 = array();
      
      for($i = 0; $i < $Array2[0].length; $i++){
      
      array_push($Array3, array($Array2[$i][0], $Array2[$i][1], $Array1[$i]));
      
      }
      
      var_dump($Array3) // For debug only.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-09
        • 2021-12-28
        • 2012-02-22
        • 1970-01-01
        • 2022-01-21
        • 2017-09-16
        • 2020-05-30
        • 2017-06-02
        相关资源
        最近更新 更多