type; if( isset($this->_visitFnCache[$funcName]) ){ $visitDeeper = true; $node = $this->$funcName( $node, $visitDeeper ); if( $node ){ if( $visitDeeper && is_object($node) ){ $node->accept($this); } $funcName = $funcName . "Out"; if( isset($this->_visitFnCache[$funcName]) ){ $this->$funcName( $node ); } } }else{ $node->accept($this); } return $node; } public function visitArray( $nodes ){ $newNodes = array(); foreach($nodes as $node){ $evald = $this->visitObj($node); if( $evald ){ if( is_array($evald) ){ self::flatten($evald,$newNodes); }else{ $newNodes[] = $evald; } } } return $newNodes; } public function flatten( $arr, &$out ){ foreach($arr as $item){ if( !is_array($item) ){ $out[] = $item; continue; } foreach($item as $nestedItem){ if( is_array($nestedItem) ){ self::flatten( $nestedItem, $out); }else{ $out[] = $nestedItem; } } } return $out; } }