7

これがどれほど簡単かはわかりませんが、特定のフォルダーのファイルを表示するスクリプトを使用していますが、ファイルをアルファベット順に表示したいのですが、これを行うのは難しいでしょうか? 私が使用しているコードは次のとおりです。

if ($handle = opendir($mainframe->getCfg( 'absolute_path' ) ."/images/store/")) {
        while (false !== ($file = readdir($handle))) {
            if ($file != "." && $file != "..")  {
                if (($file != "index.html")&&($file != "index.php")&&($file != "Thumbs.db")) {
                $strExt = end(explode(".", $file));
                    if ($strExt == 'jpg') {
                        $Link = 'index.php?option=com_shop&task=deleteFile&file[]='.$file;
                        $thelist .= '<tr class="row0"><td nowrap="nowrap"><a href="'.$Link.'">'.$file.'</a></td>'."\n";
                        $thelist .= '<td align="center" class="order"><a href="'.$Link.'" title="delete"><img src="/administrator/images/publish_x.png" width="16" height="16" alt="delete"></a></td></tr>'."\n";
                    }

                }
            }
        }
        closedir($handle); 
    }   
    echo $thelist;

:)

4

5 に答える 5

15

を使用する代わりに、デフォルトでアルファベット順にソートする( documentationreaddir ) を使用できます。scandir

の戻り値はscandir文字列ではなく配列であるため、最終的なnull戻り値をチェックするのではなく、配列を反復処理するようにコードを少し調整する必要があります。また、scandirファイル ハンドルの代わりにディレクトリ パスを含む文字列を入力として受け取ると、新しいバージョンは次のようになります。

foreach(scandir($mainframe->getCfg( 'absolute_path' ) ."/images/store/") as $file) {
  // rest of the loop could remain unchanged
}
于 2009-07-08T01:12:59.167 に答える
4

そのコードはかなり乱雑に見えます。ディレクトリ トラバース ロジックをプレゼンテーションと分離できます。より簡潔なバージョン (私の意見では):

<?php

// Head of page
$it = new DirectoryIterator($mainframe->getCfg('absolute_path') . '/images/store/'));

foreach ($it as $file) {
    if (preg_match('#\.jpe?g$#', $file->getFilename()))
        $files[] = $file->getFilename();
}
sort($files);

// Further down
foreach ($files as $file)
    // display links to delete file.
?>

ハンドルを開いたり閉じたりすることを気にする必要さえありません。ファイル名を正規表現でチェックしているため、展開チェックや条件チェックは必要ありません。

于 2009-07-08T01:46:08.240 に答える
2

私はGlob が好きです。簡単にソート可能な配列を返すため、ディレクトリの読み取りが簡単になります。

<?php
$files = glob("*.txt");
sort($files);
foreach ($files as $filename) {
    echo "$filename size " . filesize($filename) . "\n";
}
?>
于 2009-07-08T05:26:11.960 に答える
1

Joomla1.5 を使用している場合は、代わりに定義済みの定数JPATH_BASEを使用する必要があります。

$mainframe->getCfg( 'absolute_path' )

これが配布する Joomla 拡張機能である場合は、PHP5 のみであるため、 scandir()を使用しないでください。

最善の方法は、Joomla API を使用することです。さまざまなネットワークやプロトコルを介してこれを行うために階層化されたディレクトリおよびファイル アクセス用のクラスがあります。したがって、ファイル システムはたとえば FTP 経由である可能性があり、クラスは任意のネットワーク/プロトコルに拡張できます。

jimport( 'joomla.filesystem.folder' );
$files = JFolder::files(JPATH_BASE."/images/store/");
sort($files); 
foreach($files as $file) { 
   // do your filtering and other task
}

受け取るファイルをフィルター処理する JFolder::files() の 2 番目のパラメーターとして、正規表現を渡すこともできます。

また、/administrator/ のような URL リテラルは変更できるため、使用したくありません。次のような JURI メソッドを使用します。

じゅり::base();

表内の Joomla CSS クラスを確認したい場合は、次のようにします。

'<tr class="row0">'

使用する:

'<tr class="row'.($i&1).'">'

ここで、$iは反復回数です。これにより、0 と 1 が交互に繰り返されるシーケンスが得られます。

于 2009-07-08T07:19:14.650 に答える
1

PHP 組み込み関数がある場合は、常にそれを使用してください。より高速です。必要に応じて、フォルダーをトラバースする代わりに glob を使用します。

$folder_names = array(); $folder_names = glob( '*', GLOB_ONLYDIR + GLOB_MARK + GLOB_NOSORT );

  • 現在のディレクトリ内のすべてを返します。呼び出す前に chdir() を使用します GLOB_ONLYDIR を削除してファイルも含めます ( .はファイルのみになります) GLOB_MARK はフォルダー名にスラッシュを追加するためのものです 配列をソートしないように GLOB_NOSORT を削除します
于 2009-07-08T09:46:49.220 に答える