嵌套数组的php数组_filter()

嵌套数组的php数组_filter(),php,Php,我正在尝试array_filter()删除空的嵌套数组,但只返回所有嵌套数组。我知道我用错了,但看到了类似的情况,就像我正在尝试的一样 以下是数据: [ 'ticket_number' => 'sdfsdfsdf 2', 'strategy_id' => '5', 'journal_entries_strategy_conditions' => [ (int) 0 => [ 'strategies_condi

我正在尝试array_filter()删除空的嵌套数组,但只返回所有嵌套数组。我知道我用错了,但看到了类似的情况,就像我正在尝试的一样

以下是数据:

[
    '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)
,如果不只是在回调中添加额外的检查的话。我只是举了一些例子,以便提问者可以选择和修改