需要从数组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));