автоматически отображать имя файла в каталоге и автоматически заполнять его как значение - PullRequest
0 голосов
/ 10 января 2010

Я хочу что-то (окончательное), как это:

<?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, поэтому я не знаю, как улучшить код, есть какие-то хорошие советы, которые вы, ребята, могли бы мне помочь, пожалуйста

Ответы [ 5 ]

1 голос
/ 10 января 2010

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

Из вашего отредактированного вопроса я понимаю, что вы хотите динамически заполнить элемент 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);
}

В качестве альтернативы, используйте Iterator, чтобы просто создать массив имен файлов и выполнить преобразование в длинные имена файлов при создании опций Selectbox, например, в цикле 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

1 голос
/ 10 января 2010

Посмотрите на следующие функции:

  • glob - Найти путей , соответствующих шаблону
  • scandir - Список файлов каталогов и внутри указанного пути
  • DirectoryIterator - предоставляет простой интерфейс для просмотра содержимого каталогов файловой системы

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

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

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

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

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


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

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

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

1 голос
/ 10 января 2010

Изменение

if($file != "." ) {

до

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

и вы получите поведение, которое хотите.

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

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

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

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

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

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

1 голос
/ 10 января 2010

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

if($file != "." && $file != "..")
0 голосов
/ 10 января 2010

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

...