質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

2回答

4087閲覧

PHPでLinuxディレクトリーを読み込んで表示する順番を降順にしたい

solanana

総合スコア8

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2015/12/04 12:13

編集2022/01/12 10:55

下記のPHPプログラムについて質問です
WEBサーバで指定したディレクトリーとディレクトリー内のファイルを読み込んで
WEBページに表示させるディレクトリーツリーを勉強中でが、phpは初心者です。
表示させるディレクトリーは 20151204 20151203 など複数の日付となっており
ディレクトリ内のファイルは時間です。
下記のプログラムを実行すると、ディレクトリーの順番がバラバラとなり困っています。
ディレクトリー内のファイルは降順で表示されています。
ディレクトリーを読み込む際、配列に入れてソートする必要があると思いますが
どの部分をどのようにすればいいか教えていただけないでしょうか?
よろしくお願いいたします。

<?php $path = "img/imags/"; function createDir($path = '.') { if ($handle = opendir($path)) { echo "\n<ul>\n"; $queue = array(); while (false !== ($file = readdir($handle))) { if (is_dir($path.$file) && $file != '.' && $file !='..') { printSubDir($file, $path, $queue); } else if ($file != '.' && $file !='..') { $queue[] = $file; } } rsort($queue); printQueue($queue, $path); echo "</ul>\n"; } } function printQueue($queue, $path) { foreach ($queue as $file) { printFile($file, $path); } } function printFile($file, $path) { echo "<li><a href=\"".$path.$file."\">$file</a></li>\n"; } function printSubDir($dir, $path) { echo "<li><span class=\"dir\">$dir</span>"; createDir($path.$dir."/"); echo "</li>\n"; } createDir($path); ?>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/12/04 12:18

投稿した後で、表示くらいは確認しましょう。非常に読みにくいです。
guest

回答2

0

ごめんなさいディレクトリだったんですね。

投稿2015/12/04 15:16

編集2015/12/04 16:02
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

PHPマニュアル:scandir

昇順にも降順にも引数一撃で出来るので一発解決ですね!
PHPはビルトイン関数、特に配列やテキスト操作が強力なので探してみて下さい。

注意:...のパスがゴミですので、無視するようにしてください。

PHP

1<?php 2$path = "./hoge/"; 3$files = array_filter( 4 scandir($path, SCANDIR_SORT_DESCENDING), 5 function($file){ 6 return !in_array($file, ['.', '..']); 7 } 8);

更に要求ベースまで掘り下げてみましょう。
PHPは初期の段階ではHomePageプリプロセッサという名称から始まった程、
HTMLとの親和性が高い事が特徴です。

好き嫌いははっきり別れますが、
個人的には下記のようなテンプレート的な書き方を好んで使ってます。
その場合、Stringの配列のまま出力箇所まで持っていくと良いです。

PHP

1<?php 2// 配列を準備 3$path = 'hoge'; 4$files = ['20151204/112345.log', '20151203/102345.log']; 5?> 6<?php foreach($files as $file): ?> 7 <li><a href="<?= $path.'/'.$file ?>"><?= $file ?></a></li> 8<?php endforeach; ?>

最後にこの2つを使ってみます。

PHP

1<?php 2$path = "./hoge"; 3$dirs = array_filter( 4 scandir($path, SCANDIR_SORT_DESCENDING), 5 function($dir) use($path){ 6 if (in_array($dir, ['.', '..']) { 7 return false; 8 } 9 return is_dir($path.'/'.$dir); 10 } 11); 12$files = []; 13foreach ($dirs as $dir) { 14 $child_path = $path.'/'.$dir; 15 $items = scandir($child_path, SCANDIR_SORT_DESCENDING); 16 foreach ($items as $file) { 17 if (in_array($file, ['.', '..']) { 18 continue; 19 } 20 if (is_dir($child_path.'/'.$file) { 21 continue; 22 } 23 $files[] = $dir.'/'.$file; 24 } 25} 26?> 27 28<?php foreach($files as $file): ?> 29 <li><a href="<?= $path.'/'.$file ?>"><?= $file ?></a></li> 30<?php endforeach; ?>

ちょっとごつくなってしまいましたね。。。。
回答の一案とでも考えてください。

投稿2015/12/04 14:50

編集2015/12/04 16:29
miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miyabi-sun

2015/12/04 16:40

PHPは配列操作が多い言語ですが、 すぐにカッコだらけになって死ねるのでネストは控えましょう。 そして要件を最低限叶える所を目標としたので融通が効きませんし、 あえて最初のディレクトリ一覧と、ファイル一覧を取得する処理は別の切り口でやっているので一貫性もありません。 ここから更にいくらでも改善出来るかと思います。 各動作を1つずつ確かめながら読み進めてみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問