0

我想要这样的东西(最终):

<?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知之甚少,所以我不知道如何进一步改进代码,你们有什么好的技巧可以帮助我,拜托

4

5 回答 5

1

将此用作 if 条件以避免“..”出现在结果中。

if($file != "." && $file != "..")
于 2010-01-10T12:21:19.927 回答
1

改变

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 会自动递增数组)。确保在 while 循环之前初始化 $fn: $fn = array();

于 2010-01-10T12:23:35.247 回答
1

看看以下功能:

  • glob — 查找匹配模式的路径名
  • scandir - 列出指定路径内的文件和目录
  • DirectoryIterator — 提供一个简单的界面来查看文件系统目录的内容

因此,使用 DirectoryIterator 您只需执行以下操作:

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

注意 $dir 中的每个 $item 是一个SplFileInfo实例并提供对许多有用的其他函数的访问,例如isFile()

进行递归目录遍历同样容易。只需将RecursiveDirectoryIteratorRecursiveIteratorIterator一起使用并执行以下操作:

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


注意恐怕我不明白您问题中的以下行应该是什么意思:

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

但是使用上面给出的函数和示例代码,您应该能够对目录中的文件做任何您想做的事情。

于 2010-01-10T13:41:08.600 回答
1

OP编辑他的问题后的新答案

从您编辑的问题中,我了解到您希望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也有免费的在线书籍

于 2010-01-10T19:06:01.600 回答
0

我也发生过同样的事情。我刚刚使用 array_shift() 修剪了数组的顶部,查看文档。http://ca.php.net/manual/en/function.array-shift.php

于 2010-01-10T12:23:53.700 回答