автоматическое отображение имени файла в каталоге и автоматическое заполнение его как значения

StackOverflow https://stackoverflow.com/questions/2036955

  •  19-09-2019
  •  | 
  •  

Вопрос

Я хочу что-то (окончательное) вроде этого:

<?php
//named as config.php
$fn[0]["long"] = "file name";   $fn[0]["short"] = "file-name.txt";  
$fn[1]["long"] = "file name 1"; $fn[1]["short"] = "file-name_1.txt";
?>

Чего я хочу?:

1. $fn[0], $fn[1], etc.., as auto increasing
2. "file-name.txt", "file-name_1.txt", etc.., as file name from a directory, i want it auto insert.
3. "file name", "file name 1", etc.., is auto split from "file-name.txt", "file-name_1.txt", etc..,

и config.php, указанный выше, необходим в другом файле, например.

<? //named as form.php
include "config.php";
for($tint = 0;isset($text_index[$tint]);$tint++)
{
if($allok === TRUE && $tint === $index) echo("<option VALUE=\"" . $text_index[$tint]["short"] . "\" SELECTED>" . $text_index[$tint]["long"] . "</option>\n");
else echo("<option VALUE=\"" . $text_index[$tint]["short"] . "\">" . $text_index[$tint]["long"] . "</option>\n");
} ?>

поэтому я пытаюсь найти и вставить php-код и надеюсь, что он вообще справится:например

<?php
$path = ".";
$dh = opendir($path);
//$i=0; 
$i= 1;
while (($file = readdir($dh)) !== false) {
if($file != "." && $file != "..") {
echo "\$fn[$i]['short'] = '$file'; $fn[$i]['long'] = '$file(splited)';<br />"; // Test 
       $i++;
}
}
closedir($dh);
?>

но я ошибаюсь, результат не похож на то, что я хочу, например.

$fn[0]['short'] = 'file-name.txt'; ['long'] = 'file-name.txt'; //<--not splitted
$fn[1]['short'] = 'file-name_1.txt'; ['long'] = 'file-name_1.txt'; //<--not splitted

потому что я мало знаком с PHP, поэтому не знаю, как еще улучшить код, есть какие-нибудь хорошие советы от вас, ребята, которые могли бы мне помочь, пожалуйста

Это было полезно?

Решение

Новый ответ после того, как ОП отредактировал свой вопрос

Из вашего отредактированного вопроса я понимаю, что вы хотите динамически заполнять SelectBox элемент на веб-странице HTML с файлами, найденными в определенном каталоге для option value.Значения должны быть разделены тире, подчеркиванием и числом, чтобы обеспечить option name, например

Directory with Files    >    SelectBox Options
filename1.txt           >    value: filename1.txt, text: Filename 1
file_name2.txt          >    value: filename1.txt, text: File Name 2
file-name3.txt          >    value: filename1.txt, text: File Name 3

Основываясь на коде, который я дал в другом ответе, вы можете добиться этого с помощью DirectoryIterator так:

$config = array();
$dir    = new DirectoryIterator('.');
foreach($dir as $item) {
    if($item->isFile()) {
        $fileName = $item->getFilename();
        // turn dashes and underscores to spaces
        $longFileName = str_replace(array('-', '_'), ' ', $fileName);
        // prefix numbers with space
        $longFileName = preg_replace('/(\d+)/', ' $1', $fileName);
        // add to array
        $config[] = array('short' => $filename,
                          'long'  => $longFilename);
    }
} 

Однако, поскольку имена файлов в каталоге уникальны, вы также можете использовать их как массив:

$config[$filename] => $longFilename;

при построении массива конфигурации.Короткое имя файла сформирует ключ массива, а затем вы сможете создать поле выбора следующим образом:

foreach($config as $short => $long)
{
    printf( '<option value="%s">%s</option>' , $short, $long);
}

Альтернативно, используйте итератор, чтобы просто создать массив имен файлов и выполнить преобразование в длинные имена файлов при создании параметров поля выбора, например.в foreach петля выше.Фактически, вы можете построить весь SelectBox прямо из итератора вместо того, чтобы сначала создавать массив, например.

$dir = new DirectoryIterator('.');
foreach($dir as $item) {
    if($item->isFile()) {
        $fileName = $item->getFilename();
        $longFileName = str_replace(array('-', '_'), ' ', $fileName);
        $longFileName = preg_replace('/(\d+)/', ' $1', $fileName);
        printf( '<option value="%s">%s</option>' , $fileName, $longFileName);
    }
} 

Надеюсь, это то, что вы ищете.Я настоятельно рекомендую взглянуть на главу под названием Справочник по языку в руководстве по PHP если у вас нет или очень мало опыта работы с PHP.Также есть бесплатная онлайн-книга по адресу http://www.tuxradar.com/practicalphp

Другие советы

Используйте это как условие if, чтобы избежать появления «..» в результате.

if($file != "." && $file != "..")

Изменять

if($file != "." ) {

к

if($file != "." and $file !== "..") {

и вы получите желаемое поведение.

Если вы прочитаете все файлы из среды Linux, вы всегда получите .и ..как файлы, которые представляют текущий каталог (.) и родительский каталог (..).В вашем коде вы игнорируете только «.», но вы также хотите игнорировать «..».

Редактировать:Если вы хотите распечатать то, что вы написали, измените код во внутреннем цикле на следующий:

if($file != "." ) {
  echo "\$fn[\$i]['long'] = '$file'<br />"; // Test
    $i++;
}

Если вы хотите заполнить массив с именем $fn:

if($file != "." ) {
  $fn[]['long'] = $file;
}

(Вы можете удалить $i, потому что php автоматически увеличивает массивы).Убедитесь, что вы инициализировали $fn перед циклом while:$fn = массив();

Обратите внимание на следующие функции:

  • шарик - Находить пути соответствие шаблону
  • скандир — Список файлов и каталоги внутри указанного пути
  • DirectoryIterator — предоставляет простой интерфейс для просмотра содержимого каталогов файловой системы.

Итак, с помощью DirectoryIterator вы просто сделаете:

$dir = new DirectoryIterator('.');
foreach($dir as $item) {
    if($item->isFile()) {
        echo $file;
    }
} 

Обратите внимание, что каждый $item в $dir является SplFileInfo и обеспечивает доступ к ряду других полезных функций, например. isFile().

Выполнение рекурсивного обхода каталогов одинаково просто.Просто используйте РекурсивныйКаталогИтератор с РекурсивныйИтераторИтератор и делай:

$dir = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('.'));
foreach($dir as $item) {
    echo $file;
}


ПРИМЕЧАНИЕ Боюсь, я не понимаю, что должна означать следующая строка из вашего вопроса:

echo "$fn[$i]['long'] = '$file'<br />"; // Test

Но с помощью функций и примера кода, приведенных выше, вы сможете делать все, что захотите, с файлами внутри каталогов.

У меня случилось то же самое.Я только что использовал array_shift (), чтобы обрезать верхнюю часть массива, проверьте документацию. http://ca.php.net/manual/en/function.array-shift.php

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top