سؤال

أحاول إرجاع الملفات في دليل محدد باستخدام بحثا متكررا. لقد حققت هذا بنجاح، ومع ذلك أريد أن أضيف بضعة أسطر من التعليمات البرمجية التي سيتيح لي تحديد امتدادات معينة أريد إرجاعها.

على سبيل المثال إرجاع ملفات .jpg فقط في الدليل.

هنا رمزي،

<?php
$it = new RecursiveDirectoryIterator("L:\folder\folder\folder");
foreach(new RecursiveIteratorIterator($it) as $file) {
echo $file . "<br/> \n";
}
?>

واسمحوا لي أن أعرف ما يمكنني إضافته إلى الرمز أعلاه لتحقيق ذلك، شكرا

هل كانت مفيدة؟

المحلول

<?php
$it = new RecursiveDirectoryIterator("L:\folder\folder\folder");
$display = Array ( 'jpeg', 'jpg' );
foreach(new RecursiveIteratorIterator($it) as $file)
{
    if (in_array(strtolower(array_pop(explode('.', $file))), $display))
        echo $file . "<br/> \n";
}
?>

نصائح أخرى

يجب عليك إنشاء عامل تصفية:

class JpegOnlyFilter extends RecursiveFilterIterator
{
    public function __construct($iterator)
    {
        parent::__construct($iterator);
    }

    public function accept()
    {
        return $this->current()->isFile() && preg_match("/\.jpe?g$/ui", $this->getFilename());
    }

    public function __toString()
    {
        return $this->current()->getFilename();
    }
}

$it = new RecursiveDirectoryIterator("L:\folder\folder\folder");
$it = new JpegOnlyFilter($it);
$it = new RecursiveIteratorIterator($it);

foreach ($it as $file)
    ...

جرب هذا، يستخدم مجموعة من أنواع الملفات المسموح بها واليكتر فقط من الملف إذا كان ملحق الملف موجود داخل الصفيف.

<?php
$it = new RecursiveDirectoryIterator("L:\folder\folder\folder");
$allowed=array("pdf","txt");
foreach(new RecursiveIteratorIterator($it) as $file) {
    if(in_array(substr($file, strrpos($file, '.') + 1),$allowed)) {
        echo $file . "<br/> \n";
    }
}
?>

قد تجد أيضا أنه يمكنك تمرير مجموعة من أنواع الملفات المسموح بها RecursiveDirectoryIterator فئة وفقط المرسل الملفات التي تطابق.

دع PHP القيام بهذه المهمة:

$directory = new RecursiveDirectoryIterator('path/to/directory/');
$iterator  = new RecursiveIteratorIterator($directory);
$regex     = new RegexIterator($iterator, '/\.jpe?g$/i', RecursiveRegexIterator::GET_MATCH);

echo '<pre>';
print_r($regex);

فيما يتعلق بأكبر الإجابة المختصرة: قمت بإنشاء هذا الرمز الذي يستخدم وظائف أقل، 3 فقط، isset(), array_flip(), explode() بدلا من 4 وظائف. لقد اختبرت الجواب الأكثر صوتا وكان أبطأ من الألغام. أقترح إعطاء الألغام جرب:

$it = new RecursiveDirectoryIterator("L:\folder\folder\folder");
foreach(new RecursiveIteratorIterator($it) as $file) {
    $FILE = array_flip(explode('.', $file));
    if (isset($FILE['php']) || isset($FILE['jpg'])) {
        echo  $file. "<br />";
    }
}

قد ترغب في التحقق من هذه الصفحة حول استخدام Glob () بحثا مشابها:

http://www.electrictrictoolbox.com/php-glob-find-files/

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top