• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PHP の2つの関数について)

PHPのstr_replace()とreaddir()の使い方についての質問

このQ&Aのポイント
  • PHPのstr_replace()関数を使ってバックスラッシュをスラッシュに変換する際、一部が変換されず元のパスが一部消える現象が発生しています。この原因について質問します。
  • PHPのreaddir()関数を使ってディレクトリ内の要素を読み込み、ファイルかディレクトリかを判別するコードですが、正しく動作しません。ディレクトリをファイルとして表示してしまう問題について質問します。
  • お手数ですが、上記の質問内容を解決する方法についてアドバイスいただける方がいらっしゃれば、ご教示いただけますと幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.1

(1) str_replace()の使い方の問題ではないです。 str_replace()する前の $direct を確認してみてください。 $direct ="C:\xampp\htdocs\PHP-practice\testDir"; echo "========== ".$direct."<BR>"; (2) id_dir()を使って、どこにある insideDir-1, insideDir-2, video1.mp4 がディレクトリかを調べようとされていますか? is_dir("insideDir-1") で調べられるのは(起動されるphpにとってのカレントディレクトリ)にある insideDir-1 ですよ。

papashiroSooke
質問者

お礼

早速にご回答を頂き、有難うございます。 質問(1)につきましては ご提案のように定義したパスの文字列をechoしたら、やはり同じように最初と最後の"\" が変換されず、文字も消えていました。 $direct ="C:\xampp\htdocs\PHP-practice\testDir"; echo "========== ".$direct."<BR>"; 結果:C: mpp\htdocs\PHP-practice estDir そこでおかしくなっていた2か所を"\\"に変えて次のようにしたら、期待通りに変換されました。 $direct ="C:\\xampp\htdocs\PHP-practice\\testDir"; echo "===== before ===== ".$direct."<BR>"; $direct = str_replace("\\", "/", $direct); echo "===== after ====== ".$direct."<BR>"; 結果は下のようになりました。  ===== before ===== C:\xampp\htdocs\PHP-practice\testDir ===== after ====== C:/xampp/htdocs/PHP-practice/testDir これはどう理解すればよいのでしょうか? 質問(2)の方ですが、"testDir" は、このプログラムと同じレベルの "C:\xampp\htdocs\PHP-practice\" に置いてあります。 wormhole さんが仰っていることは、is_dir() 関数で調べられるのはプログラムと同じレベルにある "testDir" がディレクトリーが否かだけであり、その中身については調べられないという事でしょうか?したがってそのディレクトリーからreaddir() で」抽出したディレクトリー名である "insideDir-1" や"insideDir-2" などについては調べないと。 そこで私は is_dir() を使う前に、その引数としてのディレクトリー名をフルパスにしてみました。これならPHPがどこで起動してもいけると思ったからです。 結果上手く行きました。以下に修正したコードを掲載します。 <?php function read_directory($direct){ $direct = str_replace("\\", "/", $direct); $handle = opendir($direct); $entry = readdir($handle); $entry = readdir($handle);// skip . & .. while($entry = readdir($handle)){ $fullentry = $direct."/".$entry; if( is_dir($fullentry)!== false ) { echo $fullentry." is a directory<BR>"; }else{ echo $fullentry." is a file<BR>"; } }// while closedir($handle); return; }// function // ================ main program ================ $dirname = "C:\\xampp\htdocs\PHP-practice\\testDir"; //echo $dirname."<BR>"; read_directory($dirname); ?> 結果は次の通りです。 C:/xampp/htdocs/PHP-practice/testDir/insideDir-1 is a directory C:/xampp/htdocs/PHP-practice/testDir/insideDir-2 is a directory C:/xampp/htdocs/PHP-practice/testDir/video1.mp4 is a file 今回は基本的なことを勘違いしていました。wormholeさんのご指摘で気が付きました。有難うございます。 質問(1)については、まだ疑問が残りますので、何かお考えがあればお聞かせください。

その他の回答 (1)

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.2

1. 回答No.1さまのいわれるように置換前の文字列の書き方に問題があるようです。 PHPのサイトの文字列のリファレンスです。 https://www.php.net/manual/ja/language.types.string.php 引用符と二重引用符を読んでいただければわかると思います。 また、PHPはパスの区切り文字はスラッシュでもバックスラッシュ(円マーク)でもいいように見てくれると思いますので、置換しなくても大丈夫だと思います。 試してみましたが、どちらでもディレクトリ内の一覧を取得して、同じ動作をしてくれました。 もしこの実行ファイルがC:\xampp\htdocs\PHP-practice\testDirにあるのでしたら__DIR__を代用できます。 2. この現象はわかりません。 同じディレクトリとファイルを作ってみましたがディレクトリはディレクトリとして判定されました。

papashiroSooke
質問者

お礼

早速のご回答、有難うございます。 ご提案頂いたサイトの記事を読み、自分のパスの指定には2重引用符が使われていて、その結果 C:の後の"\x" や "\t" がエスケープされていたことがわかりました。 とても参考になりました。

関連するQ&A