4 回答
TA贡献1936条经验 获得超6个赞
您$value传递给过滤函数的也是一个关联数组。
因此,您必须检查“值的值”,使用current()使过滤函数与键名无关,从而在需要时使此代码可移植。我将函数参数命名为$entry避免混淆:
$data= [
'ticket_number' => 'sdfsdfsdf 2',
'strategy_id' => '5',
'journal_entries_strategy_conditions' => [
(int) 0 => [
'strategies_condition_id' => ''
],
(int) 1 => [
'strategies_condition_id' => '1'
]
],
'timeframe' => '',
];
var_dump(
array_filter(
$data['journal_entries_strategy_conditions'],
function($entry) {
$value = current($entry);
return !is_null($value) && $value !== '';
}
)
);
结果是:
array(1) {
[1]=>
array(1) {
["strategies_condition_id"]=>
string(1) "1"
}
}
TA贡献1797条经验 获得超6个赞
因为它是一个嵌套数组,所以您需要走更长的路线并使用 array_column,然后用键的交集替换数组子数组。
$filtered = array_filter(array_column($arr['journal_entries_strategy_conditions'], 'strategies_condition_id'));
$arr['journal_entries_strategy_conditions'] = array_intersect_key($arr['journal_entries_strategy_conditions'], $filtered);
var_dump($arr);
通过将其设为单行,可以使其可读性更差。
并且您不需要为此使用自定义函数。
Array_filter 默认删除 '' 和 null 值。
TA贡献1779条经验 获得超6个赞
由于您在过滤数组中有一个关联数组,从技术上讲它不是空的,这就是您的代码不起作用的原因。
如果您希望过滤数组中的指定键(假设该键确实存在)不为空,只需传递该键值,如下所示:
$data = [
(int) 0 => [
'strategies_condition_id' => '',
'test' => '',
'asd' => 'asd'
],
(int) 1 => [
'strategies_condition_id' => '1'
]
];
$key = 'strategies_condition_id';
$result = array_filter($data, function($value) use ($key) {dump($value); return !is_null($value[$key]) && $value[$key] !== ''; });
输出:
array:1 [
1 => array:1 [
"strategies_condition_id" => "1"
]
]
数组0被跳过,因为它的strategies_condition_id键为空。
还有另一种简单的方法来检查过滤数组中是否有空值:
$data = [
(int) 0 => [
'strategies_condition_id' => '',
'test' => 'test'
],
(int) 1 => [
'strategies_condition_id' => '1'
],
(int) 2 => [
'strategies_condition_id' => '2',
'test' => ''
]
];
array_filter($data, function($value) { return !in_array('',$value); });
输出:
array:1 [
1 => array:1 [
"strategies_condition_id" => "1"
]
]
TA贡献1804条经验 获得超8个赞
array_filter()
在特定的第一级元素上使用单个元素即可完成这项工作。在函数的回调内部,不需要任何函数调用;只需访问目标关联子数组值并检查它是否为真。这与函数式编码一样简单。
代码:(演示)
$array['journal_entries_strategy_conditions'] = array_filter(
$array['journal_entries_strategy_conditions'],
fn($row) => $row['strategies_condition_id']
);
与经典循环等效的内容可以unset()
有条件地使用。(演示)
foreach ($array['journal_entries_strategy_conditions'] as $i => $row) {
if (!$row['strategies_condition_id']) {
unset($array['journal_entries_strategy_conditions'][$i]);
}
}
或者,如果您希望有一个重新索引的子数组,array_splice()
这会很有帮助。(演示)
foreach ($array['journal_entries_strategy_conditions'] as $i => $row) {
if (!$row['strategies_condition_id']) {
array_splice($array['journal_entries_strategy_conditions'], $i, 1);
}
}
- 4 回答
- 0 关注
- 147 浏览
添加回答
举报