嵌套数组的php数组_filter()
我正在尝试array_filter()删除空的嵌套数组,但只返回所有嵌套数组。我知道我用错了,但看到了类似的情况,就像我正在尝试的一样 以下是数据:嵌套数组的php数组_filter(),php,Php,我正在尝试array_filter()删除空的嵌套数组,但只返回所有嵌套数组。我知道我用错了,但看到了类似的情况,就像我正在尝试的一样 以下是数据: [ 'ticket_number' => 'sdfsdfsdf 2', 'strategy_id' => '5', 'journal_entries_strategy_conditions' => [ (int) 0 => [ 'strategies_condi
[
'ticket_number' => 'sdfsdfsdf 2',
'strategy_id' => '5',
'journal_entries_strategy_conditions' => [
(int) 0 => [
'strategies_condition_id' => ''
],
(int) 1 => [
'strategies_condition_id' => '1'
]
],
'timeframe' => '',
]
我想删除'strategies\u condition\u id'=>'
,但我得到的只是
[
(int) 0 => [
'strategies_condition_id' => ''
],
(int) 1 => [
'strategies_condition_id' => '1'
]
]
我想我用对了:
debug(
array_filter(
$data['journal_entries_strategy_conditions'],
function($value) { return !is_null($value) && $value !== ''; }
)
);
传递给筛选函数的
$value
也是一个关联数组
因此,您必须使用current()
检查“value of the value”,使筛选函数与键名无关,从而使此代码在需要时可移植。为了避免混淆,我将函数参数命名为$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"
}
}
因为它是一个嵌套数组,所以需要走更长的路线并使用array_列,然后用键的交集替换数组子数组
$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);
通过将其设置为一行,可以使其更不可读 您不需要为此自定义函数。
默认情况下,数组过滤器会删除“”和空值。由于过滤数组中有一个关联数组,所以它不是空的,这就是代码无法工作的原因 如果希望筛选数组中的指定键(假定键不存在)不为空,只需按如下方式传递该键值:
$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"
]
]
array:1 [
1 => array:1 [
"strategies_condition_id" => "1"
]
]
已跳过数组0
,因为它的strategies\u condition\u 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"
]
]
array:1 [
1 => array:1 [
"strategies_condition_id" => "1"
]
]
谢谢,但我正在查找带有
'strategies\u condition\u id'=>'
removed@KeithPower您的问题只是将该键传递给筛选函数。。我在你的指导下完成了PoC;)@Andreas我刚才假设数据
是$arr['journal\u entries\u strategy\u conditions']
,正如问题debug()
(编辑的答案)中提到的,但即使我们使用原始数组,如果我们确定键确实存在,我们也可以再次使用($key1,$key2…$keyN)
,如果不只是在回调中添加额外的检查的话。我只是举了一些例子,以便提问者可以选择和修改