false ] ); } function defaultView() { $inputPath = APP_PATH_ROOT . DS . 'schema/ant-url_action/default_db.in7_dziennik_koresp/test-druk/IN7_DZIENNIK_KORESP.dita'; // TODO: it is not correct dita file - has tags RelatedFeature $inputBody = file_get_contents($inputPath); DBG::nicePrint(htmlspecialchars($inputBody), "input"); DBG::nicePrint(null, "memory_get_usage: " . round(memory_get_usage() / 1024) . " KB"); $inputXmlArray = XML::readXmlFileToArray($inputPath); // tag // tag => [ 0 => tagName, 1 => attributes, 2 => childrens ] // tagName string // attributes => [ name => value ] // childrens => [ childTag, ... ] // childTag => tag | string DBG::nicePrint($inputXmlArray, "inputXmlArray"); DBG::nicePrint(null, "memory_get_usage: " . round(memory_get_usage() / 1024) . " KB"); { // find all RelatedFeature recurse $rootTag = $inputXmlArray; $relTagsReader = new RelatedFeatureTagReader($rootTag); $allRelatedFeature = $relTagsReader->findRelatedFeatureRecurse($rootTag); DBG::nicePrint($allRelatedFeature, "allRelatedFeature"); DBG::nicePrint(null, "memory_get_usage: " . round(memory_get_usage() / 1024) . " KB"); $ogcSelectFields = $relTagsReader->findRelatedFeatureRecurse($rootTag); DBG::nicePrint($allRelatedFeature, "allRelatedFeature"); DBG::nicePrint(null, "memory_get_usage: " . round(memory_get_usage() / 1024) . " KB"); } DBG::nicePrint(null, "memory_get_usage: " . round(memory_get_usage() / 1024) . " KB"); die('.EOF'); } } class RelatedFeatureTagReader { function __construct() { $this->_parsedTags = []; } function findRelatedFeatureRecurse($tag, $parentTagId = 0, $parsedTags = []) { if (!is_array($tag)) return $parsedTags; // string DBG::nicePrint([ 'tag' => $tag[0], 'attrs' => $tag[1], '$parsedTags' => $parsedTags ], "findRelatedFeatureRecurse({$tag[0]})"); if (empty($tag)) return []; if ('RelatedFeature' === $tag[0]) { $parsedTags[] = [ 'tag' => $tag[0], 'attrs' => $tag[1], 'parentTagId' => $parentTagId ]; $parentTagId = count($parsedTags) - 1; } else if (!empty($tag[1]['xpath'])) $parsedTags[] = [ 'tag' => $tag[0], 'attrs' => $tag[1], 'parentTagId' => $parentTagId ]; if (empty($tag[2])) return $parsedTags; return array_reduce($tag[2], function ($ret, $childTag) use ($parentTagId) { return $this->findRelatedFeatureRecurse($childTag, $parentTagId, $ret); }, $parsedTags); } }