/** * Iterate over descendants and get them all. * * @param TreeNodeList $nodeList Node list. * @return TreeNodeList */ private function iterateDescendants(TreeNodeList $nodeList) { $result = new TreeNodeList(); foreach ($nodeList as $node) { $result->add($node); $result->merge($node->iterateDescendants($node->getChildren())); } return $result; }
/** * Recursive iteration over tree-like array. * * @param array $data Data array in the form @code array(array('$keyName'=>$key, '$parentKeyName'=>$parentKey)) @endcode. * @param TreeNode|TreeNodeList $parent Parent object. * @return TreeNodeList */ private static function iterate(array $data, $parent) { foreach ($data as $key => $value) { //Если родителем является TreeNodeList - значит мы на начальном шаге итерации и ключ - пустой, во всех других случаях - ключом является идентификатор узла родителя if ($parent instanceof TreeNodeList) { $parentKey = ''; } else { $parentKey = $parent->getID(); } if ($value[self::$parentKeyName] == $parentKey) { //добавляем узел к родителю $addedNode = $parent->add(new TreeNode($value[self::$keyName])); //удаляем из массива данных unset($data[$key]); //делаем рекурсивный вызов, передавая изменившийся набор данных, и родительский узел self::iterate($data, $addedNode); } } return $parent; }