2010-04-19 16 views
41

मेरे पास वर्तमान में एक index.php फ़ाइल है जो मुझे एक ही निर्देशिका के अंदर फ़ाइलों की सूची आउटपुट करने की अनुमति देती है, आउटपुट नाम दिखाता है, तब मैंने फाइलमटाइम() फ़ंक्शन का उपयोग किया था जब फ़ाइल को संशोधित किया गया था। मेरी समस्या अब है, मैं नवीनतम संशोधित फ़ाइल दिखाने के लिए आउटपुट को कैसे क्रमबद्ध करूं?, मैं थोड़ी देर के लिए सोच रहा हूं कि यह कैसे करें। अगर मैं केवल mysql बातचीत के साथ कर रहा हूं तो कोई समस्या नहीं होगी। कृपया मुझे एक उदाहरण दिखाएं कि नवीनतम संशोधित एक से शुरू होने वाली फ़ाइलों की सूची को सॉर्ट और आउटपुट कैसे करें। यह मेरे पास अबPHP में तारीख तक फ़ाइलों को सॉर्ट करें

if ($handle = opendir('.')) { 
while (false !== ($file = readdir($handle))) { 
     if ($file != "." && $file != "..") { 
     $lastModified = date('F d Y, H:i:s',filemtime($file)); 
      if(strlen($file)-strpos($file,".swf")== 4){ 
      echo "<tr><td><input type=\"checkbox\" name=\"box[]\"></td><td><a href=\"$file\" target=\"_blank\">$file</a></td><td>$lastModified</td></tr>"; 
      } 
     } 
    } 
    closedir($handle); 
} 
है

उत्तर

19

आपको सॉर्ट और अंतिम बार संशोधित फ़ाइल खोजने के लिए एक सरणी में फ़ाइलों को डाल करने के लिए की जरूरत है।

$files = array(); 
if ($handle = opendir('.')) { 
    while (false !== ($file = readdir($handle))) { 
     if ($file != "." && $file != "..") { 
      $files[filemtime($file)] = $file; 
     } 
    } 
    closedir($handle); 

    // sort 
    ksort($files); 
    // find the last modification 
    $reallyLastModified = end($files); 

    foreach($files as $file) { 
     $lastModified = date('F d Y, H:i:s',filemtime($file)); 
     if(strlen($file)-strpos($file,".swf")== 4){ 
      if ($file == $reallyLastModified) { 
      // do stuff for the real last modified file 
      } 
      echo "<tr><td><input type=\"checkbox\" name=\"box[]\"></td><td><a href=\"$file\" target=\"_blank\">$file</a></td><td>$lastModified</td></tr>"; 
     } 
    } 
} 

परीक्षण नहीं किया गया है, लेकिन ऐसा करने का तरीका है।

+14

@ सोसोरी नोट करें कि जब आप एक ही समय के साथ फाइलें प्राप्त करते हैं, तो यह समाधान ठीक से काम नहीं करेगा, क्योंकि यह उस समय के लिए पिछले फ़ाइल नाम को ओवरराइट करेगा। – Gordon

+2

बिल्कुल गॉर्डन, मेरी इच्छा है कि बीयूएमपी टिप्पणियों के लिए और अधिक दृश्यमान होने का एक तरीका होगा क्योंकि मैंने गलत समय पर खुदाई करने में एक घंटे बिताया है .. जाहिर है, उपर्युक्त कोड के पीछे विचार सही है, लेकिन यह बग इसे बिल्कुल बेकार बनाता है । –

+0

कुंजी अद्वितीय बनाने के लिए कोड संपादित करें (बार-बार एक सेकंड जोड़कर)। कुछ चीजों में एक-दूसरे-अलग (लेकिन समान नहीं) mtimes होने पर यह चीजों को थोड़ा उलझन में डाल देगा, लेकिन इससे ज्यादातर मामलों में कोई फर्क नहीं पड़ता। –

137

के लिए है यह एक सरणी में एक .swf विस्तार के साथ/to/फ़ाइलें पथ में सभी फाइलों और फिर फ़ाइल के mtime द्वारा कि सरणी सॉर्ट होता है

$files = glob('path/to/files/*.swf'); 
usort($files, function($a, $b) { 
    return filemtime($a) < filemtime($b); 
}); 

उपरोक्त Lambda function का उपयोग करता है और PHP 5.3 की आवश्यकता होती है। 5.3 करने से पहले, आप क्या करेंगे

usort($files, create_function('$a,$b', 'return filemtime($a)<filemtime($b);')); 

आप एक गुमनाम समारोह का उपयोग नहीं करना चाहते, तो आप बस के रूप में अच्छी तरह से एक नियमित रूप से समारोह के रूप में कॉलबैक को परिभाषित करने और बजाय usort को समारोह नाम दे सकते हैं।

जिसके परिणामस्वरूप सरणी के साथ

, तो आप पर फ़ाइलें इस तरह पुनरावृति जाएगा:

foreach($files as $file){ 
    printf('<tr><td><input type="checkbox" name="box[]"></td> 
      <td><a href="%1$s" target="_blank">%1$s</a></td> 
      <td>%2$s</td></tr>', 
      $file, // or basename($file) for just the filename w\out path 
      date('F d Y, H:i:s', filemtime($file))); 
} 

नोट क्योंकि आप पहले से filemtime कहा जाता है जब फ़ाइलों छँटाई, वहाँ कोई अतिरिक्त कीमत जब यह foreach में फिर से कॉल है कि stat cache के कारण लूप।

+2

-1 आप अपने कोड का उपयोग नहीं करते और usort उस मामले में उपयोग करने के लिए सबसे खराब प्रकार कार्य है। लेकिन नरक, सभी आपके लिए वोट देते हैं क्योंकि यह फैंसी दिखता है। * - * – elias

+30

@elias कोई अपराध नहीं है, लेकिन मुझे आपके द्वारा दिए गए कारणों के लिए एक पूरी तरह से वैध उत्तर को कम करने के लिए यह हास्यास्पद लगता है। पठनीयता के बारे में बात करते हुए आपके कोड को मेरी तुलना में अधिक समय लगता है। मैं इसे स्पेगेटी कोड कहूंगा। और यदि आप PHP के बगट्रैकर के साथ शिकायत दर्ज करने के बजाय, ओह बहुत भयानक होने के बारे में नाखुश हैं। – Gordon

+0

माना जाता है कि यह प्रश्न पुराना है, मैं अभी 'usort() 'का उपयोग करने जा रहा हूं; प्रार्थना, 'usort() 'के साथ समस्या क्या है? (उपरोक्त @elias टिप्पणी से संबंधित।) –

8

एक उदाहरण RecursiveDirectoryIterator वर्ग का उपयोग करता है, यह फाइल सिस्टम से अधिक रिकर्सिवली पुनरावृत्ति करने के लिए एक सुविधाजनक तरीका है।

$output = array(); 
foreach(new RecursiveIteratorIterator( 
    new RecursiveDirectoryIterator('path', FilesystemIterator::SKIP_DOTS | FilesystemIterator::UNIX_PATHS)) as $value) {  
     if ($value->isFile()) { 
      $output[] = array($value->getMTime(), $value->getRealPath()); 
     } 
} 

usort ($output, function($a, $b) { 
    return $a[0] > $b[0]; 
}); 
+0

लोगों को इसे अन्य भाषाओं में प्रतिस्पर्धा करने के लिए PHP में ओओपी दृष्टिकोण अपनाने की आवश्यकता है। –

+1

@ राहेलखन क्यों? ओओपी का उपयोग करें जब यह समस्याओं को हल करता है, तो अधिक जटिल होने पर ओओपी का उपयोग न करें। ओओपी कुछ भी बेहतर नहीं करता है, न ही आपका कोड, न ही एक भाषा। यह केवल कुछ समस्याओं को और अधिक कुशलता से हल करने की अनुमति देता है (जो मुझे नहीं लगता कि यह मामला यहां है)। '> 'के लिए –

+0

+1; मुझे समझ में नहीं आया कि मेरे कोड के संबंध में अन्य उत्तरों क्यों विफल रहे, लेकिन आपका 'उत्तराधिकारी। ऑपरेटर की तुलना सही है ''' '' '' '' '' '' ''। – 1111161171159459134

0

मैं केवल कुछ कुछ अतिरिक्त लाइनों के साथ आपके सटीक प्रस्तावित कोड का उपयोग करता हूं। यह विचार @elias द्वारा प्रस्तावित एक जैसा है, लेकिन इस समाधान में कुंजी पर संघर्ष नहीं हो सकते हैं क्योंकि निर्देशिका में प्रत्येक फ़ाइल में एक अलग फ़ाइल नाम होता है और इसलिए इसे कुंजी में जोड़ना संघर्ष को हल करता है। कुंजी का पहला भाग डेटाटाइम स्ट्रिंग को इस तरह से स्वरूपित किया गया है कि मैं लेक्सिकोग्राफिक रूप से उनमें से दो की तुलना कर सकता हूं।

if ($handle = opendir('.')) { 
    $result = array(); 
    while (false !== ($file = readdir($handle))) { 
     if ($file != "." && $file != "..") { 
      $lastModified = date('F d Y, H:i:s',filemtime($file)); 
      if(strlen($file)-strpos($file,".swf")== 4){ 
       $result [date('Y-m-d H:i:s',filemtime($file)).$file] = 
        "<tr><td><input type=\"checkbox\" name=\"box[]\"></td><td><a href=\"$file\" target=\"_blank\">$file</a></td><td>$lastModified</td></tr>"; 
      } 
     } 
    } 
    closedir($handle); 
    krsort($result); 
    echo implode('', $result); 
} 
-1

$ फ़ाइलों = array_diff (scandir ($ dir, SCANDIR_SORT_DESCENDING), सरणी ('..',) '।'); print_r ($ फ़ाइलें);

संबंधित मुद्दे