./ 同一ディレクトリ

にある全てのファイル(テキストファイル)の中身を、
ブラウザからアクセスした時、テキストで表示するphpのコードを教えて下さい。

※ 但し、 表示順はファイルの更新時間順で表示してください。

この場合、自分自身(php)も表示されるとか、そういう事は気にしなくて結構です。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2022/05/09 18:44:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a-kuma3 No.2

回答回数4974ベストアンサー獲得回数2154

ポイント50pt

「./ 同一ディレクトリ」がよく分からないのですが、php スクリプトが置いてあるディレクトリと同じ階層にあるファイルの中身を出力するのだ、と解釈しました。


<pre>
<?php

// 対象ディレクトリ
$s = $_SERVER['SCRIPT_FILENAME'];
$dir = dirname($s);


// 同じ階層にあるファイルの、フルパスと更新日時を獲得
$dir_h = opendir($dir);

$list = array();
$i = 0;
while (false !== ($e = readdir($dir_h))) {
    $f = $dir . "/" . $e;
    if (is_file($f))    {
        $list[$i][0] = $f;
        $list[$i][1] = filemtime($f);
        ++$i;
    }
}

closedir( $dir_h );

// 更新日の新しい順に並べ替え
function sort_func($a, $b) {
    return $b[1] - $a[1];
}

usort($list, "sort_func");

// ファイルの内容を出力
foreach ($list as $e) {
    $path = $e[0];
    $mtime = $e[1];
    echo "----------------\n";
    echo $path . "\n";
    echo date("Y/m/d H:i:s", $mtime) . "\n";
    echo "--\n";
    echo htmlspecialchars(file_get_contents($path));
}


?>
</pre>

上記のスクリプトが置いてあるディレクトリにあるファイルを、そのスクリプトも含めて、以下の繰り返しで出力します。

  1. 16個の "-"
  2. ファイルのフルパス
  3. ファイルの更新日時
  4. 2個の "-"
  5. ファイルの内容

「ブラウザからアクセスしたときに」と質問の文面にあるので、以下をやってます。

  • pre タグで括る
  • HTML のエスケープ

HTML のエスケープが要らないということであれば、最後の方の htmlspecialchars() を外してください。

手抜きで、html や body などのタグを省いちゃってますが、これでも普通のブラウザには表示できます。


php スクリプトが置いてあるディレクトリは、スクリプトが CGI として動作できる設定になっている、という大前提があります。


対象としているディレクトリの位置が違う、ということであれば、先頭の方の $dir 変数の内容を気に入るところに変えてください。

ブラウザ経由での表示ということなので、スクリプトが表示できる位置になってるという前提があります。

その他の回答1件)

id:pogpi No.1

回答回数428ベストアンサー獲得回数59

ポイント50pt

dir(パス)で、辞書順にファイルのリストが取れるので、filemtime(パス)で取得した更新時間順にfile_get_contentsしてprintで、どうですか。

$files = dir("パス");

$filecnt = 0;

$kousnhdk = array();

$junidx = array();

$filepaths = array();

while (($filename = $files->read()) != FALSE) {

$kousnhdk[] = filemtime("パス" . $filename);

$junidx[] = $filecnt;

$filepaths[] = "パス" . $filename;

$filecnt = $filecnt + 1;

}

$i = 0;

while ($i < $filecnt) {

$j = $filecnt - 1;

while ($j > $i) {

if ($kousnhdk[$i] < $kousnhdk[$j]) {

$wk = $junidx[$j];

$junidx[$j] = $junidx[$i];

$junidx[$i] = $wk;

$wk = $kousnhdk[$j];

$kousnhdk[$j] = $kousnhdk[$i];

$kousnhdk[$i] = $wk;

}

$j = $j - 1;

}

$i = $i + 1;

}


$i = 0;

while ($i < $filecnt) {

print file_get_contents($filepaths[$junidx[$i]]);

$i = $i + 1;

}

id:TAK_TAK

そのコードをお願いします。

2022/05/08 08:48:34
id:a-kuma3 No.2

回答回数4974ベストアンサー獲得回数2154ここでベストアンサー

ポイント50pt

「./ 同一ディレクトリ」がよく分からないのですが、php スクリプトが置いてあるディレクトリと同じ階層にあるファイルの中身を出力するのだ、と解釈しました。


<pre>
<?php

// 対象ディレクトリ
$s = $_SERVER['SCRIPT_FILENAME'];
$dir = dirname($s);


// 同じ階層にあるファイルの、フルパスと更新日時を獲得
$dir_h = opendir($dir);

$list = array();
$i = 0;
while (false !== ($e = readdir($dir_h))) {
    $f = $dir . "/" . $e;
    if (is_file($f))    {
        $list[$i][0] = $f;
        $list[$i][1] = filemtime($f);
        ++$i;
    }
}

closedir( $dir_h );

// 更新日の新しい順に並べ替え
function sort_func($a, $b) {
    return $b[1] - $a[1];
}

usort($list, "sort_func");

// ファイルの内容を出力
foreach ($list as $e) {
    $path = $e[0];
    $mtime = $e[1];
    echo "----------------\n";
    echo $path . "\n";
    echo date("Y/m/d H:i:s", $mtime) . "\n";
    echo "--\n";
    echo htmlspecialchars(file_get_contents($path));
}


?>
</pre>

上記のスクリプトが置いてあるディレクトリにあるファイルを、そのスクリプトも含めて、以下の繰り返しで出力します。

  1. 16個の "-"
  2. ファイルのフルパス
  3. ファイルの更新日時
  4. 2個の "-"
  5. ファイルの内容

「ブラウザからアクセスしたときに」と質問の文面にあるので、以下をやってます。

  • pre タグで括る
  • HTML のエスケープ

HTML のエスケープが要らないということであれば、最後の方の htmlspecialchars() を外してください。

手抜きで、html や body などのタグを省いちゃってますが、これでも普通のブラウザには表示できます。


php スクリプトが置いてあるディレクトリは、スクリプトが CGI として動作できる設定になっている、という大前提があります。


対象としているディレクトリの位置が違う、ということであれば、先頭の方の $dir 変数の内容を気に入るところに変えてください。

ブラウザ経由での表示ということなので、スクリプトが表示できる位置になってるという前提があります。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません