📘
Laravelで拡張子なしのファイル名のセット(重複なし)を取得する方法のメモ
はじめに
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