php - Php Array_filter 从数组数组中取消设置键值
问题描述
我想从我的嵌套数组数组中取消设置数组元素。
我想执行递归数组过滤器,但我不确定如何有效地做到这一点。
下面是原始数组。
[
[a] => 3
[b] => 0
[c] => [
[
[1] => aa
[2] => 1
[3] => [
[
[a1] => 6
[a2] => 5781
[a3] =>
[
[1] => 0
[2] => 19550
[3] => 5781
]
]
[
[a1] => 1
[a2] => 5781
[a3] =>[
[1] => 0
[2] => 19550
[3] => 5781
]
]
]
]
[
[1] => aa
[2] => 1
[3] => [
[
[a1] => 6
[a2] => 5781
[a3] =>
[
[1] => 0
[2] => 19550
[3] => 5781
]
]
[
[a1] => 1
[a2] => 5781
[a3] =>[
[1] => 0
[2] => 19550
[3] => 5781
]
]
]
]
]
]
预期数组
[
[a] => 3
[c] => [
[
[1] => aa
[3] => [
[
[a1] => 6
[a3] =>
[
[2] => 19550
[3] => 5781
]
]
[
[a1] => 1
[a3] =>[
[2] => 19550
[3] => 5781
]
]
]
]
[
[1] => aa
[3] => [
[
[a1] => 6
[a3] =>
[
[2] => 19550
[3] => 5781
]
]
[
[a1] => 1
[a3] =>[
[2] => 19550
[3] => 5781
]
]
]
]
]
]
正如您在每个嵌套数组中的预期数组中看到的那样,一些键值对已被删除。我需要根据键名过滤数组。那是我的键名是固定的,需要从里面的每个子数组中删除。
任何帮助将不胜感激。
解决方案
这是一个基于递归 foreach 的解决方案的示例,用于处理您提供的数据集的代码。
$sourceArray = array("a" => 3, "b" => 0, "c" => array("1" => "aa", "2" => 1, "3" => array("a1" => 6, "a2" => 5781, "a3" => array("1" => 0, "2" => 19550, "3" => 5781)), array( "a1" => 1, "a2" => 5781, "a3" =>array("1" => 0, "2" => 19550, "3" => 5781 ))), array( "1" => "aa", "2" => 1, "3" => array( array( "a1" => 6, "a2" => 5781, "a3" => array( "1" => 0, "2" => 19550,"3" => 5781))), array( "a1" => 1, "a2" => 5781, "a3" =>array( "1" => 0, "2" => 19550, "3" => 5781))));
print_r($sourceArray,1);
function removeKeys($keys, $sourceData) {
foreach ($sourceData as $key=>$val) {
if (in_array($key, $keys, true)) {
unset($sourceData[$key]);
} else if (is_array($val)) {
$sourceData[$key] = removeKeys($keys, $sourceData[$key]);
}
}
return $sourceData;
}
$keysToRemove = array("b","2","a2");
$newArray = removeKeys($keysToRemove, $sourceArray);
print_r($newArray);
尽管获取数据有点挑战,但实现起来很简单。我确实注意到此示例中的一个“错误”,即如果原始数组中的键为“0”,即使它不在 $keys 数组中,它仍会被删除。
但我假设这个例子足以回答你的问题,并且我所说的边缘情况不会发生(即,“0”不是数组中的键值。)如果你确实使用“0”作为键,你可以添加额外的逻辑来捕获这种情况,但它会稍微减慢函数的速度,所以我将把这个选择留给你。
(请注意,上面提到的错误现在已在代码中修复......请参阅下面的注释以获取原始海报的解决方案)
推荐阅读
- c++ - 构建在 VS 2013 中找不到 Platform Toolset = 'v141'
- sql - 在遗留的基于 java sql 的项目中集成 apache ignite 加入问题
- python - Python如何从另一个方法内部调用一个方法
- angular - 如何在 HighChart 中为 ColumnRange 图表的 xAixs 添加时间?
- css - css - 浏览器特定占位符颜色的元素颜色
- sql - 如何连接在第三个表中具有公共字段的两个表?
- javascript - 链接接缝是什么意思?
- html - 垂直对齐中间,用于响应式顶部导航,没有固定高度
- python - 确保用户输入是整数并且在特定范围内的问题
- java - 无法在 Spring Boot 中将 Flyway 迁移与 postgresSQL 连接起来