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

OPが質問を編集した後の新しい回答

SelectBoxあなたの編集された質問から、特定のディレクトリにあるファイルをHTML Webページの要素に動的に入力したいことを理解してい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には無料のオンライン ブックもあります。

于 2010-01-10T19:06:01.600 に答える
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;
}

(php は配列を自動インクリメントするため、$i を削除できます)。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()などの他の多くの便利な関数へのアクセスを提供することに注意してください。

再帰的なディレクトリ トラバーサルも同様に簡単です。RecursiveIteratorIteratorRecursiveDirectoryIteratorを使用して、次のようにします。

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


: 残念ながら、あなたの質問の次の行が何を意味するのか理解できません。

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

しかし、上記の関数とサンプル コードを使用すると、ディレクトリ内のファイルに対してやりたいことをすべて実行できるはずです。

于 2010-01-10T13:41:08.600 に答える
0

私は同じことが起こったことがあります。array_shift() を使用して、配列の上部をトリミングしました ドキュメントを確認してください。http://ca.php.net/manual/en/function.array-shift.php

于 2010-01-10T12:23:53.700 に答える