I have an array like this and I simply need to recurse over it and find a matching "menu" item to remove: array(3) { ["dart"]=> array(10) { [0]=> object(menuItem)#4 (9) { ["menu"]=> string(7) "My DART" ["name"]=> string(7) "My DART" ["title"]=> string(39) "Data Analasys & Reliability Tracker" ["employee_only"]=> bool(false) ["page"]=> NULL ["children"]=> NULL ["parent"]=> NULL ["current"]=> bool(false) ["array_key"]=> string(4) "dart" } [1]=> object(menuItem)#5 (9) { ["menu"]=> string(5) "Login" ["name"]=> string(5) "Login" ["title"]=> string(5) "Login" ["employee_only"]=> bool(false) ["page"]=> string(9) "login.php" ["children"]=> NULL ["parent"]=> NULL ["current"]=> bool(false) ["array_key"]=> string(4) "dart" } [2]=> object(menuItem)#6 (9) { ["menu"]=> string(13) "Lost Password" ["name"]=> string(13) "Lost Password" ["title"]=> string(13) "Lost Password" ["employee_only"]=> bool(false) ["page"]=> string(12) "forgotpw.php" ["children"]=> NULL ["parent"]=> NULL ["current"]=> bool(false) ["array_key"]=> string(4) "dart" } ... I'm trying to remove ["menu"] == 'Login' from the array, but despite "finding" the element, it never removes. isn't that what the & reference stuff is for? menuItem::removeMenuItems($navArray['dart'], array('Login', 'Lost Password')); public static final function removeMenuItems(&$menuItems, $removeArray) { foreach($menuItems as $value) { if (is_array($value->children)) menuItem::removeMenuItems(&$value->children, $removeArray); else { //echo "*** CHECKING ".$value->menu." against ".implode(',',$removeArray)." ***"; if (in_array($value->menu, $removeArray)) { //echo "*** REMOVING ".$value->menu." ***"; unset($value); } } } }