2009-09-06 4 views
8

के साथ फ़ाइलों को सॉर्ट करना मैं lighttpd के लिए PHP5 स्क्रिप्ट सूचीबद्ध निर्देशिका बना रहा हूं। किसी दिए गए निर्देशिका में, मैं प्रत्यक्ष उप-निर्देशिकाओं और फ़ाइलों (सूचनाओं के साथ) सूचीबद्ध करने में सक्षम होना चाहता हूं।DirectoryIterator

एक त्वरित खोज के बाद, DirectoryIterator मेरे दोस्त हो रहा है:

foreach (new DirectoryIterator('.') as $file) 
{ 
    echo $file->getFilename() . '<br />'; 
} 

लेकिन मैं फ़ाइल नाम, तिथि, माइम-प्रकार से फ़ाइलों को क्रमबद्ध करने में सक्षम होना चाहते हैं ... आदि

यह कैसे करें (ArrayObject/ArrayIterator के साथ?)?

धन्यवाद

+1

उत्कृष्ट प्रश्न, बस मैं जो खोज रहा था। –

उत्तर

2

फिलिप डब्ल्यू यहाँ एक अच्छा उदाहरण पोस्ट: http://php.oregonstate.edu/manual/en/directoryiterator.isfile.php

function cmpSPLFileInfo($splFileInfo1, $splFileInfo2) 
{ 
    return strcmp($splFileInfo1->getFileName(), $splFileInfo2->getFileName()); 
} 

class DirList extends RecursiveDirectoryIterator 
{ 
    private $dirArray; 

    public function __construct($p) 
    { 
     parent::__construct($p); 
     $this->dirArray = new ArrayObject(); 
     foreach($this as $item) 
     { 
      $this->dirArray->append($item); 
     } 
     $this->dirArray->uasort("cmpSPLFileInfo"); 
    } 

    public function getIterator() 
    { 
     return $this->dirArray->getIterator(); 
    } 

} 
+1

मुझे जिस समस्या का सामना करना पड़ रहा है वह यह है कि ऐसा लगता है कि यह सब ठीक तरह से हल हो रहा है, लेकिन संख्यात्मक कुंजी वही रहती है। ऐसा लगता है कि मूल क्रम में एक foreach फिर से शुरू होता है, भले ही एक print_r सही क्रम में सबकुछ प्रिंट करता है। – enobrev

+0

* foreach * हमेशा सरणी के क्रम का पालन करता है, यह संख्यात्मक कुंजी द्वारा क्रमबद्ध नहीं है। – AndreKR

+0

कुंजी को रीसेट करने के लिए ** uasort() ** से ** usort() ** से उपरोक्त कोड बदलें। – ryanwinchester

4

समाधान से ऊपर मेरे लिए काम नहीं किया। यहां बताया गया है कि मैं सुझाव देता हूं:

class SortableDirectoryIterator implements IteratorAggregate 
{ 

    private $_storage; 

    public function __construct($path) 
    { 
    $this->_storage = new ArrayObject(); 

    $files = new DirectoryIterator($path); 
    foreach ($files as $file) { 
     $this->_storage->offsetSet($file->getFilename(), $file->getFileInfo()); 
    } 
    $this->_storage->uksort(
     function ($a, $b) { 
      return strcmp($a, $b); 
     } 
    ); 
    } 

    public function getIterator() 
    { 
    return $this->_storage->getIterator(); 
    } 

}