fero57 Posted May 29, 2013 Share Posted May 29, 2013 Hi Freaks I created a Joomla 1.5 install.xml using scandir. For easier orientation, folders are capitalized and blue ASSETS - index.html - CSS - - index.html - - popup.css - - default.css - JS - - index.html - - form.js CONTROLLERS MODELS TABLES VIEWS controller.php index.php reporter.php output of the first 14 lines: <filename>ASSETS</filename> <filename>ASSETS/CSS</filename> <filename>ASSETS/CSS/default.css</filename> <filename>ASSETS/CSS/incident_reporter_form.css</filename> <filename>ASSETS/CSS/index.html</filename> <filename>ASSETS/CSS/popup.css</filename> </filename> <filename>ASSETS/index.html</filename> <filename>ASSETS/JS</filename> <filename>ASSETS/JS/incident_reporter_form.js</filename> <filename>ASSETS/JS/index.html</filename> </filename> </filename> <filename>controller.php</filename> <filename>CONTROLLERS</filename> My script $allfiles = ''; function readFolders($dir ) { global $allfiles; $files = scandir($dir); foreach($files as $f) { if($f != '.' && $f != '..') { $allfiles .= '<filename>'.$dir.'/'.$f; if(is_dir($dir.'/'.$f)) { $allfiles .= "</filename>\n"; readFolders($dir.'/'.$f); } $allfiles .= "</filename>\n"; } } $fp = fopen('xml_scandir.txt', 'w') or die('cannot open file'); fwrite($fp, $allfiles); fclose($fp); } readFolders('com_reporter'); Question: Why do I have those extra closing tags </filename> that attach outside if(is_dir) ? I would understand if the output came with empty tags, eg <filename></filename> Thank you Fero Link to comment https://forums.phpfreaks.com/topic/278556-scandir-recursive-call-prints-an-extra-closing-tag-for-xml-install-file/ Share on other sites More sharing options...
fero57 Posted May 29, 2013 Author Share Posted May 29, 2013 I re-wrote the script and it worked. I also fixed the folder / filename tags. $allfiles = ''; function readFolders($dir ) { global $allfiles; $files = scandir($dir); foreach($files as $f) { if($f != '.' && $f != '..') { if(is_dir($dir.'/'.$f)) { $allfiles .= "<folder>".$dir.'/'.$f."</folder>\n"; readFolders($dir.'/'.$f); } else { $allfiles .= '<filename>'.$dir.'/'.$f."</filename>\n"; } } } $fp = fopen('xml_scandir.txt', 'w') or die('cannot open scandir.txt'); fwrite($fp, $allfiles); fclose($fp); } thanks for your time Fero Link to comment https://forums.phpfreaks.com/topic/278556-scandir-recursive-call-prints-an-extra-closing-tag-for-xml-install-file/#findComment-1432988 Share on other sites More sharing options...
fero57 Posted May 29, 2013 Author Share Posted May 29, 2013 ... but it is still a mystery for me why the original script outputs those extra closing tags when the loop goes from the deepest folder back ... and why only the closing tag, why not both, opening and closing, when I use $allfiles .= before and after if(is_dir) condition. Any ideas? Fero Link to comment https://forums.phpfreaks.com/topic/278556-scandir-recursive-call-prints-an-extra-closing-tag-for-xml-install-file/#findComment-1432990 Share on other sites More sharing options...
kicken Posted May 29, 2013 Share Posted May 29, 2013 Because of the way your function works with the recursion. Take some time to mentally step through it and you'll see. Lest assume you start it in a directory that has one sub-dir and then that dir has 1 file in it. Eg: . js/ whatever.js So when you start the code, on the first iteration the it will: $allfiles .= '<filename>'.$dir.'/'.$f; //Set $allfiles to <filename>./js if(is_dir($dir.'/'.$f)) //True { $allfiles .= "</filename>\n"; //set $allfiles to <filename>./js</filename> readFolders($dir.'/'.$f); //Start reading the new directory (see next block) } $allfiles .= "</filename>\n"; When it recurses into the next level, then it's first loop iteration will go like so: $allfiles .= '<filename>'.$dir.'/'.$f; //Set $allfiles to <filename>./js</filename><filename>./js/whatever.js if(is_dir($dir.'/'.$f)) //False { $allfiles .= "</filename>\n"; readFolders($dir.'/'.$f); } $allfiles .= "</filename>\n"; //Set $allfiles to <filename>./js</filename><filename>./js/whatever.js</filename> //Jump back up to previous level So now since it is done with that sub directory, it jumps back up to where it was in the previous function call, and continues. $allfiles .= '<filename>'.$dir.'/'.$f; if(is_dir($dir.'/'.$f)) { $allfiles .= "</filename>\n"; readFolders($dir.'/'.$f); //Jumps back to this point } $allfiles .= "</filename>\n"; //Continues to here and sets $allfiles to <filename>./js</filename><filename>./js/whatever.js</filename></filename> Link to comment https://forums.phpfreaks.com/topic/278556-scandir-recursive-call-prints-an-extra-closing-tag-for-xml-install-file/#findComment-1433020 Share on other sites More sharing options...
fero57 Posted May 30, 2013 Author Share Posted May 30, 2013 Hi Kicken Thank you for the answer. I was going through your explanation a couple of times. When I changed the tags, eg $allfiles .= '<filename>'.$dir.'/'.$f; $allfiles .= '<filename>'.$dir.'/'.$f; // first reading if(is_dir($dir.'/'.$f)) { $allfiles .= "</filename>\n"; readFolders($dir.'/'.$f); } $allfiles .= "</filename_AFTER>\n"; // third reading the output was </filename_AFTER> </filename_AFTER> not as I expected, i.e. first reading - skip if not is_dir - second reading <filename></filename_AFTER> <filename></filename_AFTER> I must be very slow on the uptake, I apologize. Thanks Fero Link to comment https://forums.phpfreaks.com/topic/278556-scandir-recursive-call-prints-an-extra-closing-tag-for-xml-install-file/#findComment-1433204 Share on other sites More sharing options...
DavidAM Posted June 1, 2013 Share Posted June 1, 2013 if(is_dir($dir.'/'.$f)) { $allfiles .= "</filename>\n"; readFolders($dir.'/'.$f); } $allfiles .= "</filename_AFTER>\n"; // third reading The last line shown here is executed just before exiting the (recursed) function and is ALSO executed as soon as the recursed call returns. There should probably be an ELSE just before it since you close that tag inside the IF Link to comment https://forums.phpfreaks.com/topic/278556-scandir-recursive-call-prints-an-extra-closing-tag-for-xml-install-file/#findComment-1433595 Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.