PHP多维数组与一维数组相交



需要从数组A中消除数组b上不存在的键'service_code'值。在本例中,只有'SAF'存在于数组b上。我相信一定有一种我不知道的方法来完成它,而不是做循环。如果有必要,我还可以通过删除array_keys来反转数组B。

数组

Array
(
    [1] => Array
        (
            [id] => 2
            [service_name] => Carpet Cleaning
            [type] => 
            [category_name] => Household
            [service_code] => SAF
            [category_code] => AA
        )
    [2] => Array
        (
            [id] => 3
            [service_name] => Floor Cleaning
            [type] => 
            [category_name] => Household
            [service_code] => MHSAF
            [category_code] => AA
        )
    [3] => Array
        (
            [id] => 4
            [service_name] => Lawn Service
            [type] => 
            [category_name] => Landscape
            [service_code] => GHF
            [category_code] => AA
        )
)
数组B

Array
(
    [0] => SAF
    [1] => SA
    [2] => MM
    [3] => METH
    [4] => OTPA
    [5] => OTP
    [6] => CBT
    [7] => SACA
    [8] => TRC
    [9] => REBT
)

预期结果

Array
(
    [1] => Array
        (
            [id] => 2
            [service_name] => Carpet Cleaning
            [type] => 
            [category_name] => Household
            [service_code] => SAF
            [category_code] => AA
        )
)

在一天结束的时候,无论使用这些数据结构如何,你都将进行循环,即使"循环"隐藏在像array_filter()这样的函数调用中。

我的第一个建议是改变数组B,如果可能的话,这样你就不需要迭代它来查看数组中的值是否存在。像

这样的数据结构:
[
  'SAF' => 1,
  'SA' => 1,
   ...
]

你可以很容易地在数组上执行array_flip()来实现这样的数据结构。

如果结构中的键包含您正在查找的值,则可以让您执行O(1)查找而不是O(n)查找来检查数组A中的服务代码。

你的代码可能看起来像:

$result = array_filter($array_a, function($item, $k) use ($array_b) {
    return array_key_exists($item['service_code'], $array_b);   
});

如果你不能改变数组b所描述的,你需要迭代数组b(这是当你调用in_array()函数时发生的)在array_filter操作:

$result = array_filter($array_a, function($item, $k) use ($array_b) {
    return in_array($item['service_code'], $array_b);  
});

第一个解决方案的运行时复杂度为O(n),其中n是数组a中的元素数。

第二个解决方案的运行时复杂度为O(n*m),其中m是数组B的元素数(n仍然是数组a的元素数)。

由于第二个解决方案执行得很差,您可以通过使用array_flip()

进行优化。
$service_code_keys = array_flip($array_b);
$result = array_filter(
    $array_a,
    function($item, $k) use ($service_code_keys) {
        return array_key_exists($item['service_code'], $service_code_keys); 
    }  
);

这将提高操作复杂性到O(m + n),因为你需要一次O(m)命中来迭代和翻转数组b,但这比in_array()解决方案有很大改进。

您的解决方案是array_filter:

$filtered = array_filter(
    $array1,
    function($v) use ($array2) {
        return in_array($v['service_code'], $array2);
    }
);

由于service_code在数组A中是唯一的,您可以使用service_code使用array_column来重新索引数组A。

$array_a = array_column($array_a, null, 'service_code');

然后翻转数组B,使其值成为键

$array_b = array_flip($array_b);

然后你可以使用array_intersect_key来得到你的结果。

$result = array_intersect_key($array_a, $array_b);

如果你喜欢,也可以在一个语句中包含所有内容:

$result = array_intersect_key(
    array_column($array_a, null, 'service_code'), array_flip($array_b));

相关内容

  • 没有找到相关文章

最新更新