我只需要动态地从数组中提取某些键。
Ex:
$array = [
"a" => true,
"b" => false,
"c" => [
0 => [
"a" => "x",
"b" => [
"x" => "Y"
]
],
1 => [
"a" => "x",
"b" => [
"x" => "Y"
]
],
]
];
然后,我需要提取以下可以更改的数组:
$newArray = [
"b" => false,
"c" => [
0 => [
"b" => [
"x" => "Y"
]
],
1 => [
"b" => [
"x" => "Y"
]
],
]
];
使用以下递归函数可能很容易:
<?php
$array = [
"a" => true,
"b" => false,
"c" => [
0 => [
"a" => "x",
"b" => [
"x" => "Y"
]
],
1 => [
"a" => "x",
"b" => [
"x" => "Y"
]
],
]
];
$cleaned_array = unset_by_key($array,"a");
$extracted_array = arrayRecursiveDiff ($array, $cleaned_array);
print_r($cleaned_array);
print_r($extracted_array);
function unset_by_key ($arr,$nkey) {
unset($arr[$nkey]);
foreach ($arr as $key=>$val) {
if (is_array($val)) {
$arr[$key] = unset_by_key($val,$nkey);
}
}
return $arr;
}
// THX TO: https://stackoverflow.com/questions/3876435/recursive-array-diff
function arrayRecursiveDiff($aArray1, $aArray2) {
$aReturn = array();
foreach ($aArray1 as $mKey => $mValue) {
if (array_key_exists($mKey, $aArray2)) {
if (is_array($mValue)) {
$aRecursiveDiff = arrayRecursiveDiff($mValue, $aArray2[$mKey]);
if (count($aRecursiveDiff)) { $aReturn[$mKey] = $aRecursiveDiff; }
} else {
if ($mValue != $aArray2[$mKey]) {
$aReturn[$mKey] = $mValue;
}
}
} else {
$aReturn[$mKey] = $mValue;
}
}
return $aReturn;
}
?>
不需要递归函数,如果您只想通过第一级键选择深度,则可以只使用array_intersect_key
:
$arr = [
'a' => true,
'b' => false,
'c' => [
[
'a' => 'x',
'b' => [
'x' => 'Y'
]
],
[
'a' => 'x',
'b' => [
'x' => 'Y'
]
],
]
];
function getKeys(array $arr, array $keys) {
return array_intersect_key($arr, array_fill_keys($keys, null));
}
$result = getKeys($arr, ['b', 'c']);
print_r($result);
希望有所帮助,