ch05 — パス操作とディレクトリ走査
スライドで見るこの章を AI と学ぶ
演習問題の詳細
この章の演習問題の内容を読めます。実際に手元で解くには教材リポジトリを clone してください。
ドリル 01 — `pathinfo` でパスを分解する
問題
以下のパス文字列を pathinfo で分解し、4 つの要素 (dirname / basename / filename / extension) を コロン + 半角スペース 区切りで 1 行ずつ出力してください。
$path = '/var/www/logs/access.2026-05-19.log';期待される出力:
dirname: /var/www/logs
basename: access.2026-05-19.log
filename: access.2026-05-19
extension: log
ヒント
$info = pathinfo($path);
echo "dirname: {$info['dirname']}\n";
echo "basename: {$info['basename']}\n";
echo "filename: {$info['filename']}\n";
echo "extension: {$info['extension']}\n";| キー | 中身 |
|---|---|
dirname |
ディレクトリ部分 (/var/www/logs) |
basename |
ファイル名 (拡張子付き) (access.2026-05-19.log) |
filename |
ファイル名 (拡張子なし) (access.2026-05-19) |
extension |
拡張子 (log — 先頭の . は付かない) |
つまづいたら
extensionが.log(先頭にドット) になる →pathinfoのextensionは.抜き で返す。自分で.を付けないことfilenameがaccess(途中まで) になる →pathinfoは 「最後の.より前」 をfilenameとする。仕様通りなのでこれが正解
🧪 ブラウザで試す
スライドのコードを写経して ▶ 実行、自分で書いて 📝 採点 で答え合わせ。初回のみ PHP ランタイム読込で数秒かかります。
PHP ランタイム未読込
ドリル 02 — `scandir` でディレクトリ一覧
問題
__DIR__ . '/tests/data/sample' 配下のファイル名を、. と .. を除いた 上で 昇順 にソートして 1 行ずつ出力してください。
tests/data/sample/ の中身 (このリポジトリにコミット済み):
apple.txt
banana.txt
cherry.txt
期待される出力:
apple.txt
banana.txt
cherry.txt
ヒント
$dir = __DIR__ . '/tests/data/sample';
$files = array_values(array_diff(scandir($dir), ['.', '..']));
sort($files);
foreach ($files as $f) {
echo $f . "\n";
}scandir($dir)はディレクトリ内のエントリ名を配列で返す- 戻り値には 必ず
.(カレント)・..(親) が含まれる のでarray_diffで除く array_valuesで キーを 0 から振り直す (array_diffは元のキーを保つため、後段のsort不要な順序ズレを防ぐ)sort($files)で 明示的に昇順 (PHP / OS 環境差を消す)
つまづいたら
- 出力の先頭に
...が混ざる →array_diff(scandir($dir), ['.', '..'])でカレント・親エントリを除く - 順序がバラバラ
→
sort($files)を明示的に呼ぶ。scandirのデフォルトは昇順だが、OS / ファイルシステム差で揺れることもある - 出力が 1 行に詰まる
→
echoの末尾に"\n"を付けるのを忘れている
🧪 ブラウザで試す
スライドのコードを写経して ▶ 実行、自分で書いて 📝 採点 で答え合わせ。初回のみ PHP ランタイム読込で数秒かかります。
PHP ランタイム未読込
演習問題(2問)
サイト内で問題文・雛形・解答例を確認できます。実際に手元で解くには教材リポジトリを clone してください。
完了にすると進捗に反映されます