May I suggest this array_intersect_key_recursive implementation ?
function array_intersect_key_recursive(array $targetArray, array ...$comparedArrays): array
{
$targetArrayIntersected = array_intersect_key($targetArray, ...$comparedArrays);
foreach (array_keys($targetArrayIntersected) as $key) {
if (true === is_array($targetArray[$key])
// all compared arrays have key with non-empty array as value
&& true === array_reduce(
$comparedArrays,
function (bool $isArrayPreviousSingleComparedArray, array $singleComparedArray) use ($key) {
return (true === $isArrayPreviousSingleComparedArray
&& true === is_array($singleComparedArray[$key])
&& false === empty($singleComparedArray[$key])
);
},
true)
)
{
// repeat recursively
$targetArrayIntersected[$key] = array_intersect_key_recursive(
$targetArray[$key],
...array_map(
function(array $singleComparedArray) use ($key): array {
return $singleComparedArray[$key];
},
$comparedArrays
)
);
}
}
return $targetArrayIntersected;
}