проблем с readdir и glob

alirius

Registered
Здравейте,
проблема ми е следния , трябва да накарам php да чете от директория и всяка нейна под директория за .xml файлове пробвах следното.

Код:
function readDirs($path) {
    $dirHandle = opendir($path);
    while ($item = readdir($dirHandle)) {
        $newPath = $path . DIRE . $item;
        if (is_dir($newPath) && $item != '.' && $item != '..') {
            //$newPaths = $newPath . "/";
            return $newPath;
            readDirs($newPath);
        }
    }
   // return readDir();
}

function read_files($allf) {
    return readDirs("books");

    $allf = readDirs();
    echo "<table style='width:100%' border=1> <tr>"
    . "<th> Author </th> <th> Book </th> <th> Date Updated </th></tr>";
    foreach (glob("{$allf}*.xml") as $filename) {
        $xml_file = file_get_contents($filename, FILE_TEXT);
        $xml = simplexml_load_string($xml_file);
        $bookname = (string) $xml->name;
        $bookauthor = (string) $xml->author;
        $bookdate = date("F d Y H:i:s.", filemtime($filename));
        echo ' <tr><th> ' . $bookauthor . " </th>";
        echo '<th>' . $bookname . '</th>';
        echo '<th>' . $bookdate . '</th> </tr>';
    }
}
Малко помощ :)
 
Тук има няколко примерa - http://stackoverflow.com/questions/1860393/recursive-file-search-php
Там ползват jpg за разширение, ти просто ще го смениш с xml.

В php имаш вграден клас за рекурсивна обработка на директории - http://php.net/manual/bg/class.recursivedirectoryiterator.php

A иначе приемрна грешка в твоя код е, че правиш return преди readDirs, т.е. второто не се вика никога:

return $newPath;
readDirs($newPath);
 
Според мен по-лесно е без рекурсивния итератор:

PHP:
<?php
    function listDirContents($path) {
        $path = realpath($path);
	    $files = array();
	    try {
		    $scanner = new DirectoryIterator($path);
		    foreach($scanner as $node) {
				$fpath = $path."/".$node->getFilename();
				if($node->isDir() && !$node->isDot()) { //Листва всички директории без . и ..
					$files = array_merge($files, listDirContents($fpath)); //Рекурсивно ги добавя към масива
				} else if(!$node->isDot() && pathinfo($fpath,PATHINFO_EXTENSION)=='xml') { //Ако файла е XML, правиш каквото правиш, аз ползвам SimpleXMLElement за обработка. $fpath съдържа пътя до файла
				}
			}
			return $files;
		} catch (Exception $e) {
			//Exception handling
		}
	}
 

Горе