I would really love to hear your critiques on:

• Code quality
• Code clarity
• More efficient alternative code

Code:

function array_mask(array $source, array$filter){
foreach ($source as$key => $value){ if (!isset($filter[$key])){ if (array_search($key, $filter) !== false){ continue; } unset($source[$key]); } else { if (is_array($source[$key])){$source[$key] = array_mask($source[$key],$filter[$key]); } } } return$source;
}

$source = array( 'page' => array( 'q' => 'alkflsdj', 'x' => 1, 9 => 'm' ), 'news' => 7 );$filter = array(
'page' => array(
9
),
'news'
);

$result = array_mask($source, $filter); var_dump($result);


Result:

array
'page' =>
array
9 => string 'm' (length=1)
'news' => int 7

-

You can use built-in functions instead. Like this for example:

function array_mask(array $source, array$filter)
{
$source = array_intersect_key($source, $filter); foreach ($source as $key =>$value)
if (is_array($value))$source[$key] = array_mask($source[$key],$filter[$key]); return$source;
}

$source = array( 'page' => array( 'q' => 'alkflsdj', 'x' => 1, 9 => 'm' ), 'news' => 7 );$filter = array(
'page' => array(
9 => ''
),
'news' => ''
);

var_dump (array_mask($source,$filter));

-
I had this idea, but for some reason she didn't like. Now like normal. –  Fedor Nov 14 '12 at 17:20

Looks good to me, but you can make a small optimization:

change this

        if (array_search($key,$filter) !== false){
continue;
}
unset($source[$key]);


to

        if (array_search($key,$filter) === false){
unset($source[$key]);
}

-
Just a suggestion, you might want to explain why you are suggesting the change. Doing so will greatly increase the value of this answer. –  Jeff Vanzella Nov 14 '12 at 17:01