PHP多维数组移除含空翻译值的子数组问题求助
解决PHP多维数组中移除
translation为空的子数组问题 我来帮你搞定这个问题!你当前的递归过滤函数只用到了array_filter()的默认行为——它只会移除值为「假」的元素(比如空字符串、null、0等),但没法精准过滤掉你需要的「translation为空的子数组」。咱们得给过滤逻辑加个自定义规则才行。
问题根源
原函数里的array_filter($input)没有指定过滤规则,默认只会移除空值元素,但你要过滤的是包含空translation字段的子数组,这需要明确的判断条件。
修改后的递归过滤函数
下面是调整后的代码,专门针对你的需求做了自定义过滤:
$arr = array( 16 => Array ( 0 => Array ( 'language' => 'de', 'translation' => 'blog/beer' ), 1 => Array ( 'language' => 'en', 'translation' => 'blog/some-slug-yeah' ), 2 => Array ( 'language' => 'es', 'translation' => '' ), 3 => Array ( 'language' => 'fr', 'translation' => 'blog/paris-big-city' ), 4 => Array ( 'language' => 'it', 'translation' => '' ), 5 => Array ( 'language' => 'nl', 'translation' => 'blog/nederlands-slug' ) ) // 更多数组元素... ); function array_filter_translations($input) { // 先递归处理所有嵌套的子数组 foreach ($input as &$value) { if (is_array($value)) { $value = array_filter_translations($value); } } unset($value); // 释放引用,避免后续操作出现意外问题 // 自定义过滤规则:只保留translation非空的语言子数组 return array_filter($input, function($item) { // 判断当前元素是否是带translation的语言条目 if (is_array($item) && isset($item['translation'])) { // 这里用trim是为了过滤掉纯空格的情况,不需要的话可以直接用$item['translation'] !== '' return trim($item['translation']) !== ''; } // 其他类型的元素(比如外层的分组数组)直接保留 return true; }); } // 执行过滤 $results = array_filter_translations($arr); // 查看结果 print_r($results);
关键说明
- 自定义过滤回调:通过
array_filter()的第二个参数,我们明确只移除translation为空(或纯空格)的语言子数组,其他元素正常保留。 - 递归处理嵌套:确保深层嵌套的符合条件的子数组也会被过滤。
- 引用释放:
foreach里的引用要及时 unset,避免后续操作污染数组。
运行这段代码后,你会发现ES和IT语言对应的空translation子数组已经被成功移除了。
内容的提问来源于stack exchange,提问作者user759235
相关产品推荐
相关产品推荐

