我需要根据在同一列中不一致的子数组的值对多维数组中的行进行分组。
$array = [
147 => [4, 'req'],
199 => ['5', 'opt'],
212 => [2, 5, 'req']
];
需要将其拆分为这些数组。
阵列1:
[
147 => [4, 'req'],
212 => [2, 5, 'req'],
]
数组2:
[
199 => ['5', 'opt'],
]
我知道
array_filter()
,但无法弄清楚array_filter()
内部的函数可以给我想要的结果。
我试过了
$req = array_filter($my_array, function ($v, $k) {
return $v == 'req';
}, ARRAY_FILTER_USE_BOTH);
我也尝试过
function filter_my_array($my_array, $search_term) {
$new_array = array();
foreach ($my_array as $subarray) {
if (in_array($search_term, $subarray)) {
$new_array[] = $subarray;
}
}
return $new_array;
}
$req = filter_my_array($array, 'req');
这两种方法都不起作用。
您可以借助按必要值进行过滤来创建两个数组。您可以使用 array_filter 函数,但您应该在传递给 array_filter 函数的每个元素中找到必要的值。
例如,查找“req”值
$req = array_filter($my_array, function ($v) {
return in_array('req', $v);
});
例如,查找“opt”值
$opt = array_filter($my_array, function ($v) {
return in_array('opt', $v);
});
我使用 in_array 函数来查找值,因为每个元素都是一个具有不同数量元素的数组
这似乎对我有用:
function filter_my_array($my_array, $search_term) {
$required_array = [];
$filtered_array = [];
foreach ($my_array as $key => $subarray) {
$found_flag = false;
foreach ($subarray as $cur_subarray) {
if ($cur_subarray == $search_term) {
$found_flag = true;
break;
}
}
if ($found_flag == true) {
$required_array[$key] = $subarray;
} else {
$filtered_array[$key] = $subarray;
}
}
return [$required_array, $filtered_array];
}
要检索所需的数组和过滤后的数组,请按如下方式调用该函数:
list($required_array, $filtered_array) = filter_my_array($my_array, 'req');
其中 $my_array 保存示例中的数组。
虽然可以填充可变命名的分组数组,但这不是最佳实践。 演示
$array = [
147 => [4, 'req'],
199 => ['5', 'opt'],
212 => [2, 5, 'req']
];
foreach ($array as $key => $row) {
${$row[array_key_last($row)]}[$key] = $row;
}
var_export($req);
var_export($opt);
您的 IDE 将很难意识到当访问这些变量时,这些变量实际上存在。
反而加深数组结构,使用动态一级键进行分组会更专业。 演示
$result = [];
foreach ($array as $key => $row) {
$result[$row[array_key_last($row)]][$key] = $row;
}
var_export($result);
无论您喜欢哪种方式,您都不应该使用多个循环或多次调用迭代函数 (
array_filter()
)。