PHP多维数组与一维数组相交
需要从数组A中删除数组B上不存在键“service_code”值的数组。在本例中,数组B上只存在“SAF”。您尝试了多种数组_intersect函数,但没有成功。我相信一定有一种我不知道的方法来完成这个任务,而不是做一个循环。如有必要,我还可以通过移除数组_键来反转数组B 阵列APHP多维数组与一维数组相交,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,需要从数组A中删除数组B上不存在键“service_code”值的数组。在本例中,数组B上只存在“SAF”。您尝试了多种数组_intersect函数,但没有成功。我相信一定有一种我不知道的方法来完成这个任务,而不是做一个循环。如有必要,我还可以通过移除数组_键来反转数组B 阵列A Array ( [1] => Array ( [id] => 2 [service_name] => Carpet Cleani
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\u filter
:
$filtered = array_filter(
$array1,
function($v) use ($array2) {
return in_array($v['service_code'], $array2);
}
);
您的解决方案是
array\u filter
:
$filtered = array_filter(
$array1,
function($v) use ($array2) {
return in_array($v['service_code'], $array2);
}
);
在一天结束时,您将执行循环,无论这些数据结构如何,即使“循环”隐藏在函数调用中,如
array\u filter()
我的第一个建议是,如果可能的话,更改数组B,这样就不需要迭代它来查看数组中是否存在值。数据结构,如:
[
'SAF' => 1,
'SA' => 1,
...
]
通过在数组上执行array\u 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,则需要在array\u filter
操作中迭代数组b(这是调用in\u array()
函数时发生的情况):
$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\u flip()
当你用一次O(m)点击来迭代和翻转数组B时,操作复杂性将提高到O(m+n)。这仍然比
in_Array()
解决方案有很大的改进。在一天结束时,你将执行循环,无论这些数据结构如何,即使“循环”隐藏在函数调用中,如array\u filter()
我的第一个建议是,如果可能的话,更改数组B,这样就不需要迭代它来查看数组中是否存在值。数据结构,如:
[
'SAF' => 1,
'SA' => 1,
...
]
通过在数组上执行array\u 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,则需要在array\u filter
操作中迭代数组b(这是调用in\u array()
函数时发生的情况):
$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\u flip()
当你用一次O(m)点击来迭代和翻转数组B时,操作复杂度将提高到O(m+n)。这仍然比
in_Array()
解决方案有很大的改进。因为服务代码
在数组a中是唯一的,你可以使用数组列
使用服务代码
来重新索引数组a
$array_a = array_column($array_a, null, 'service_code');
然后翻转数组B,使其值成为键
$array_b = array_flip($array_b);
然后您可以使用array\u intersect\u key
获得结果
$result = array_intersect_key($array_a, $array_b);
或者,如果您愿意,也可以使用“一条龙”语句:
$result = array_intersect_key(
array_column($array_a, null, 'service_code'), array_flip($array_b));
因为
service\u code
在数组A中是唯一的,所以可以使用array\u column
使用service\u code
重新索引数组A
$array_a = array_column($array_a, null, 'service_code');
然后翻转数组B,使其值成为键
$array_b = array_flip($array_b);
然后您可以使用array\u intersect\u key
获得结果
$result = array_intersect_key($array_a, $array_b);
或者,如果您愿意,也可以使用“一条龙”语句:
$result = array_intersect_key(
array_column($array_a, null, 'service_code'), array_flip($array_b));
service\u code
在数组A中是唯一的,还是多个条目可以具有相同的一个?是的,service\u code在数组A中是唯一的AIsservice\u code
在数组A中是唯一的,还是多个条目可以具有相同的一个?是的,service\u code在数组A中是唯一的解决方案,但操作复杂度超过了需要。此解决方案有效,但是操作复杂度比必要的要高。这不会生成所需的输出,其中包含成功相交的整个内部数组元素。抱歉,我误读了代码。这个解决方案会起作用,但从复杂性的角度来看不是很理想。每个内部函数调用将是O(n),外部函数调用将是O(n+m)ibelievet,它不会生成所需的输出,其中包含成功相交的整个内部数组元素。抱歉,我误读了代码。这个解决方案会起作用,但从复杂性的角度来看不是很理想。每个内部函数调用将是O(n),外部函数调用将是O(n+m)ibelieve使用第一个解决方案,得到错误@mike brant'缺少{closure}()'nevermind@mike brant的参数2,我现在从函数中删除第二个参数。函数($item)使用第一个解决方案,得到错误@mike brant'缺少{closure}()'nevermind@mike brant的参数2,我从函数中删除了第二个参数现在可以工作了。功能($项)使用