通过一个静态值和另一个二维数组中的一列来过滤一个二维阵列



我有两个数组,它们有一些常见的id值,但这些id键的键略有不同。

$comps = [
[
'c_id' => '123',
'status' => 'active'
],
[
'c_id' => '456',
'status' => 'destroyed'
],
[
'c_id' => '789',
'status' => 'active'
]
];
$rests = [
[
'r_id' => 123,
'extra' => 'some extra info for r_id 123'
],
[
'r_id' => 456,
'extra' => 'some extra info for r_id 456'
]
];

我在这里的目标是返回$rests数组中的所有条目,这些条目在$comps数组中具有相应的条目,它们具有匹配的ID值和status => active

如何才能做到这一点?

我过去见过并使用过array_uintersect(),但我似乎无法以所需的方式使用它。

您可以通过嵌套的foreach循环来实现这一点。

$matches = [];
foreach ($rests as $rest) {
foreach ($comps as $comp) {
if ($rest['r_id'] === $comp['c_id'] && $comp['status'] === 'active') {
$matches[] = $rest;
}
}
}
print_r($matches);

输出

Array
(
[0] => Array
(
[r_id] => 123
[extra] => some extra info for r_id 123
)
)

这是具有两个规则的array_uintersect()实现。

这是一个不错的选择,因为PHP通过在后台使用排序算法来优化比较。

代码:(演示(

var_export(
array_uintersect(
$comps,
$rests,
fn($a, $b) =>
[$a['c_id'] ?? $a['r_id'], ($a['status'] ?? 'active') === 'active']
<=>
[$b['c_id'] ?? $b['r_id'], ($b['status'] ?? 'active') === 'active']
)
);

使用过时的PHP:(演示(

var_export(
array_uintersect(
$comps,
$rests,
function($a, $b) {
return [$a['c_id'] ?? $a['r_id'], ($a['status'] ?? 'active') === 'active']
<=>
[$b['c_id'] ?? $b['r_id'], ($b['status'] ?? 'active') === 'active'];
}
)
);

我不认为预先过滤$comps数组是可耻的。(演示(

var_export(
array_uintersect(
array_filter($comps, function($row) { return $row['status'] === 'active'; }),
$rests,
function($a, $b) {
return ($a['c_id'] ?? $a['r_id'])
<=>
($b['c_id'] ?? $b['r_id']);
}
)
);

如果对强力嵌套循环方法感兴趣,那么通过有条件地中断和继续来避免进行无用的循环。我的意思是,仔细想想,如果给定的comps数组可以提前取消资格,为什么还要在rest数组上循环呢。此外,在进行id匹配并将数据推入结果数组之后,停止内部循环。(演示(

$result = [];
foreach ($comps as $comp) {
if ($comp['status'] !== 'active') {
continue;
}
foreach ($rests as $rest) {
if ($rest['r_id'] == $comp['c_id']) {
$result[] = $rest;
break;
}
}
}
var_export($result);

最新更新