📘

Laravelで拡張子なしのファイル名のセット(重複なし)を取得する方法のメモ

2021/07/07に公開

はじめに

Laravelのstorageディレクトリ内で、「同じファイル名だけど拡張子が違う」ものがありました。こんな感じです。

  • output_20210703072428.csv
  • output_20210703072428.ctl
  • output_20210703073006.csv
  • output_20210703073006.ctl
  • output_20210703073017.csv
  • output_20210703073017.ctl

ここから「拡張子なしのファイル名」だけを「重複なし」で取得したかったです。こんな感じです。

output_20210703072428
output_20210703073006
output_20210703073017

手を動かしながらやり方を調べました。

前提

  • Macでtreeコマンドを使用しています(動作確認用に。なければlsとかで代用可)
    brewでインストールできます
$ brew install tree

やってみたこと

Laravelのプロジェクトを作成

$ composer create-project laravel/laravel get-file-name-set

確認用のファイルを作成

storage/app/public/ 内に、同じファイル名だけど拡張子が違うファイルをいくつか作成しました。作成後の状態は以下の通りです。

$ cd storage/app/public/
$ head *
==> output_20210703072428.csv <==
1,apple,100
2,banana,150
3,cherry,200
==> output_20210703072428.ctl <==
38
==> output_20210703073006.csv <==
3,apple,100
2,banana,150
1,cherry,200
==> output_20210703073006.ctl <==
38
==> output_20210703073017.csv <==
3,apple,100
1,banana,150
2,cherry,200
==> output_20210703073017.ctl <==
38

処理を記述

web.phpに処理を記述しました

<?php

use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\File;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    return view('welcome');
});

Route::get('/list', function () {
    $path = storage_path( 'app/public' );

    $fileNames = array();

    $files = File::files( $path );

    // See: https://www.php.net/manual/ja/function.pathinfo.php
    foreach( $files as $file ){
        $fileNames[] = pathinfo( $file->getFilename(), PATHINFO_FILENAME );
    }
    // See: https://www.php.net/manual/ja/function.array-unique.php
    foreach( array_unique( $fileNames ) as $fileName ){
        echo( $fileName . "\n" );
    }
});

補足

   $fileNames[] = pathinfo( $file->getFilename(), PATHINFO_FILENAME );

pathinfoの第2引数に PATHINFO_FILENAME を指定すると、拡張子なしのファイル名を取得できます

   foreach( array_unique( $fileNames ) as $fileName ){
       echo( $fileName . "\n" );
   }

array_uniqueで重複を除いた配列を取得できます。(注意:キーの添字は保持されます)

動作確認

ファイルの状態を確認します。

$ cd storage/app/public/
$ tree
.
├── output_20210703072428.csv
├── output_20210703072428.ctl
├── output_20210703073006.csv
├── output_20210703073006.ctl
├── output_20210703073017.csv
└── output_20210703073017.ctl
0 directories, 6 files

HTTPリクエストを行って、拡張子なしのファイル名が重複無しで取得することを確認します。

$ curl http://localhost:8000/list
output_20210703072428
output_20210703073006
output_20210703073017

確認できました。

Discussion