PHP: Как удалить элементы из одного ассоциативного массива, используя другой ассоциативный массив
У меня есть два массива, один из которых содержит все данные, а другой ассоциативный массив ключей, которые я хотел бы удалить.
$all_data = array(
'one' =>array(
'one_one'=>array(
'one_one_one'=>'value',
'one_one_two'=>'value',
),
'one_two'=> array(
'one_two_one'=>'value',
'one_two_two'=>'value',
)
),
'two' =>array(
'two_one'=>array(
'two_one_one' =>'value',
'two_one_two' =>'value',
),
'two_two'=>array(
'two_two_one'=>'value',
'two_two_two'=>'value',
)
)
);
$remove_elements = array(
'one' =>array(
'one_one',
'one_two'=> array(
'one_two_one',
)
),
'two'
);
Вывод, который я хотел бы, выглядел бы так.
$result = array(
'one' =>array(
'one_two'=> array(
'one_two_two'=>'value',
)
)
);
Я пробовал array_diff, но я получаю ошибку "Преобразование массива в строку", я предполагаю, что это потому, что они являются вложенными массивами.
Я создал функцию, но я не могу заставить ее работать.
function arrayRecursiveUnset($array_1, $array_2) {
foreach ($array_1 as $array_1_key => $array_1_value) {
if (array_key_exists($array_1_key, $array_2)) {
if (is_array($array_1_value)) {
$array_1[$array_1_key] = arrayRecursiveUnset($array_1_value, $array_2[$array_1_key]);
} else {
unset($array_1[$array_1_key]);
}
}
}
return $array_1;
}
1 ответ
Решение
Он не был тщательно протестирован, но, похоже, работает для того, для чего он мне нужен. надеюсь, это поможет кому-то.
function arrayRecursiveUnset($array_1, $array_2) {
foreach ($array_1 as $array_1_key => $array_1_value) {
if (array_key_exists($array_1_key, $array_2)) {
if (is_array($array_1_value)) {
$array_1[$array_1_key] = arrayRecursiveUnset($array_1_value, $array_2[$array_1_key]);
} else {
unset($array_1[$array_1_key]);
}
} else if (in_array($array_1_key, $array_2)){
unset($array_1[$array_1_key]);
}
}
return $array_1;
}
$result = arrayRecursiveUnset( $all_data , $remove_elements);