我有以下数组:
Array
(
[0] =Array(
[date] =2016-09-16
[data] = Array(
[0] =Array
(
[ID] =1945
[Debit] =CREDIT
[timestamp] =1474025139
[LastName] =test1
[FirstName] =test1
)
[1] =Array
(
[ID] =1946
[Debit] =CREDIT
[timestamp] =1474025140
[LastName] =test2
[FirstName] =test2
)
[2] =Array
(
[ID] =1947
[Debit] =CREDIT
[timestamp] =1474025130
[LastName] =test3
[FirstName] =test3
)
)
[start_date] =2016-09-16
[end_date] =2016-09-16
[show_fee] =0
)
[1] =Array
(
[date] =2016-09-15
[data] = Array
(
[0] =Array
(
[ID] =1955
[Debit] =CREDIT
[timestamp] =1474025159
[LastName] =test11
[FirstName] =test11
)
[1] =Array
(
[ID] =1956
[Debit] =CREDIT
[timestamp] =1474025150
[LastName] =test22
[FirstName] =test22
)
[2] =Array
(
[ID] =1957
[Debit] =CREDIT
[timestamp] =1474025150
[LastName] =test33
[FirstName] =test33
)
)
[start_date] =2016-09-16
[end_date] =2016-09-16
[show_fee] =0
)
)
现在我想用特定的键从上面的数组中筛选一个数组。例如,我想要时间戳和id。我们可以假设id/timestampd将是关键,反之亦然。
我尝试了array_column,但没有成功。
要确定需要的输出是什么并不容易。
一般原则可能使用以下规则适用的假设:
- 输出层次结构必须与输入层次结构相同
id
和timestamp
键控值是它们出现的子数组中唯一保持的值- 任何其他子数组(即搜索到的关键字不存在的地方(都不会改变
基于这些规则,这里有一个通用的解决方案,适用于任何结构(尤其是无论搜索关键字出现的深度级别如何(:
function select($input) {
$keys = ['ID', 'timestamp'];
return is_array($input)
? (array_keys($intersect = array_intersect_key($input, array_flip($keys))) == $keys
? $intersect
: array_map('select', $input)
)
: $input;
}
$output = select($input);
(测试的(功能使用以下方法:
- 对于给定的
$input
,如果它不是数组,则按原样返回 - 否则在CCD_ 4中查找搜索到的密钥
- 如果它们都存在(这是一个任意的选择,可能会被"如果它们中至少有一个存在"所取代(,则只返回它们
- 否则,返回通过递归调用函数为其每个项映射的
$input