我有一个如下数组。这来自中央数据库,我无法事先知道实际数组将包含什么。我想比较键上的子数组,这就是为什么要删除所有子数组中不存在的键。
Array (
[0] => Array
(
[a] =>
[b] => 8
[c] => 1
[d] => taille-8
[e] =>
[k] => taill
)
[1] => Array
(
[a] =>
[b] => 7
[c] => 2
[d] => taille-7
[f] =>
[k] => tafefef
)
[2] => Array
(
[a] => ce
[b] => 34
[c] => 2
[d] => taille-34
[g] => dee
[k] => tacefef
) );
我想删除所有子数组中未重复的键。在上面的示例中,它们是“ e”,“ f”和“ g”。这需要动态发生。
Array (
[0] => Array
(
[a] =>
[b] => 8
[c] => 1
[d] => taille-8
[k] => taill
)
[1] => Array
(
[a] =>
[b] => 7
[c] => 2
[d] => taille-7
[k] => tafefef
)
[2] => Array
(
[a] => ce
[b] => 34
[c] => 2
[d] => taille-34
[k] => tacefef
) );
任何建议都值得赞赏。
答案 0 :(得分:1)
您可以使用参数解包。如果您的数组存储在$a
中,则应该可以进行以下操作:
// create an array with only the keys that are common to all subarrays
$new = array_intersect_key(...$a);
// prune original array
foreach ($a as &$arr) {
$arr = array_intersect_key($new, $arr);
}
答案 1 :(得分:0)
您可以拼接数组并循环其余部分。
在循环中,我用每次迭代中相同的内容覆盖$ new。
最后应该是整个数组中匹配的东西。
然后,我们需要使用new和作为模板来删除数组中的其他项,因此我们再次循环并再次相交,但是这次覆盖$ arr。
$arr =[['a' => 1, 'b' => 2, 'c' => 3],
['a' => 1, 'c' => 3],
['c' => 3]];
$new = $arr[0];
foreach($arr as $sub){
$new = array_intersect_key($new, $sub);
}
foreach($arr as &$sub){
$sub =array_intersect_key($sub, $new);
}
unset($sub);
Var_dump($arr);
输出
array(3) {
[0]=>
array(1) {
["c"]=>
int(3)
}
[1]=>
array(1) {
["c"]=>
int(3)
}
[2]=>
&array(1) {
["c"]=>
int(3)
}
}