【PHP】ファイルパスからディレクトリ名とファイル名を取得する方法(pathinfo)

PHPで便利な関数を見つけたので紹介します。

ファイルなどを扱う場合とても役立つのが「pathinfo関数」です。

これはファイルパスの文字列をpathinfo関数に引数として渡してやると、ディレクトリパスやファイルパス、拡張子、ファイル名をそれぞれ分解した文字列の配列として返してくれる賢いやつです!

検証したPHPのバージョンは「7.2.12」になります。

 

使い方とサンプル

使い方として、下記サンプルを見てください。

<?php
$file_path ="/var/test/php/sample.php";
print_r(pathinfo($file_path));

$file_path ="/home/user/sample.csv";
print_r(pathinfo($file_path))
?>

/**
* 出力結果
*/
Array
(
    [dirname] => /var/test/php
    [basename] => sample.php
    [extension] => php
    [filename] => sample
)
Array
(
    [dirname] => /home/user
    [basename] => sample.csv
    [extension] => csv
    [filename] => sample
)

pathinfo関数の戻り値として、ディレクトリパスとファイル名が分かれた形で返ってきているのがわかるかと思います。とても便利ですね。

 

いろいろなパターンでpathinfo関数を試す

いろいろなイレギュラーパターンでpathinfo関数を試したいと思います。

空欄やNULLを渡すパターン

<?php
$file_path ="";
print_r(pathinfo($file_path));
$file_path =NULL;
print_r(pathinfo($file_path));
?>

/**
* 出力結果
*/
Array
(
    [basename] => 
    [filename] => 
)
Array
(
    [basename] => 
    [filename] => 
)

引数に空欄やNULLを渡した場合は、値は空ですがディレクトリパスとファイル名の要素を持った配列が取得できるようです。

ディレクトリパスのみのパターン

<?php
$file_path ="/var/test/php";
print_r(pathinfo($file_path));
$file_path ="/var/test/php/";
print_r(pathinfo($file_path));

/**
* 出力結果
*/
Array
(
    [dirname] => /var/test
    [basename] => php
    [filename] => php
)
Array
(
    [dirname] => /var/test
    [basename] => php
    [filename] => php
)

ディレクトリパスのみをpathinfo関数に渡してみました。

結果として、最後にスラッシュの有無に関わらず、末尾のディレクトリ名がファイルとみなされる仕様のようです。当然拡張子は無いため戻りの配列に拡張子の要素すらありません。

ファイル名のみのパターン

<?php
$file_path ="sample.php";
print_r(pathinfo($file_path));
?>

/**
* 出力結果
*/
Array
(
    [dirname] => .
    [basename] => sample.php
    [extension] => php
    [filename] => sample
)

ファイル名と拡張子はそのまま返ってきましたが、ディレクトリパスは現在ポイントしているパスである「.」が返ってきています。

拡張子のみのパターン

<?php
$file_path =".php";
print_r(pathinfo($file_path));

/**
* 出力結果
*/
Array
(
    [dirname] => .
    [basename] => .php
    [extension] => php
    [filename] => 
)

ディレクトリパスは先ほどと同じく「.」、そのほかは拡張子とベースネームが返ってきますがファイル名は空欄となります。

スラッシュ(/)のみのパターン

<?php
$file_path ="/";
print_r(pathinfo($file_path));
$file_path ="///";
print_r(pathinfo($file_path));
?>

/**
* 出力結果
*/
Array
(
    [dirname] => /
    [basename] => 
    [filename] => 
)
Array
(
    [dirname] => /
    [basename] => 
    [filename] => 
)

スラッシュのみの場合は、スラッシュの数に関わらず戻りもスラッシュしか返ってこないです。

適当な拡張子のファイルを指定した場合

<?php
$file_path ="/var/test/php/sample.test";
print_r(pathinfo($file_path));
?>

/**
* 出力結果
*/
Array
(
    [dirname] => /var/test/php
    [basename] => sample.test
    [extension] => test
    [filename] => sample
)

適当な拡張子として「sample.test」というファイル名を渡してみました。

結果として拡張子を「test」としてこちらの意図した形で判断してくれているようです。

ディレクトリパスやファイル名に複数ドット(.)が含まれる場合

<?php
//ファイル名に複数ドット(.)が含まれる場合
$file_path ="/var/test/php/sample.php.php";
print_r(pathinfo($file_path));
$file_path ="/var/test/php/php.sample.php";
print_r(pathinfo($file_path));

//ディレクトリパスに複数ドット(.)が含まれる場合
$file_path ="/var/test.sample./php.test/sample.php";
print_r(pathinfo($file_path));
?>

/**
* 出力結果
*/
//ファイル名に複数ドット(.)が含まれる場合
Array
(
    [dirname] => /var/test/php
    [basename] => sample.php.php
    [extension] => php
    [filename] => sample.php
)
Array
(
    [dirname] => /var/test/php
    [basename] => php.sample.php
    [extension] => php
    [filename] => php.sample
)
//ディレクトリパスに複数ドット(.)が含まれる場合
Array
(
    [dirname] => /var/test.sample./php.test
    [basename] => sample.php
    [extension] => php
    [filename] => sample
)

結果としてディレクトリパスやファイル名に複数ドット(.)が含まれていても、正常に値を返してくれます。ファイル名に複数ドットが含まれている場合は、最後のドットの後の文字列を拡張子として判断しているようです。

 

まとめ

今回、PHPの便利関数として「pathinfo関数」をご紹介しました。

引数としていろいろなパターンを試しましたが、ある程度許容範囲が広くとても使い勝手が良いものであることがわかりました。

これからPHPでファイルを操作する際は、どんどん使っていきたいと思います。^ ^ ノ



投稿日:2018-12-19    更新日:2019-06-24

[スポンサーリンク]

  
関連記事
勉強した内容を緩くメモする|JBの技術メモ
勉強した内容を緩くメモする|JBの技術メモ
勉強した内容を緩くメモする|JBの技術メモ
勉強した内容を緩くメモする|JBの技術メモ
勉強した内容を緩くメモする|JBの技術メモ
勉強した内容を緩くメモする|JBの技術メモ
サイト内検索
プロフィール

プロフィール

[Name : じゃぶじゃぶ(@jbjb_2019)]
都内で社内SEをしているおじさん。
仕事で得られる知識だけでは限界を感じ、 WEBの勉強がてらITブログを開始。
サーバからWEBサイトまでフルスクラッチで開発しました。
現在は勉強のモチベーションを保つために活用中。
興味があることを雑記的に書いていきます。

[スポンサーリンク]

[スポンサードリンク]