1. ホーム
  2. php

[解決済み] PHPでファイルシステムのパス文字列を結合するには?

2023-06-06 22:32:32

質問

PHP には、パス文字列をインテリジェントに結合するための組み込み関数がありますか?この関数は abc/de//fg/x.php を引数にとると abc/de/fg/x.php を返すべきであり、同じ結果を得るには abc/defg/x.php をその関数の引数として指定します。

そうでない場合、利用可能なクラスはあるのでしょうか?また、パスを分割したり、パスの一部を削除したりするのにも有効かもしれません。もし何か書かれたのであれば、ここでコードを共有していただけませんか?

常に / を使ってもいいのですが、私はLinux専用にコーディングしています。

Pythonでは os.path.join があり、これは素晴らしい。

どのように解決するのですか?

<ブロッククオート

これは人気のある質問のようで、コメント欄は機能提案やバグ報告で埋め尽くされています...。このコードでできることは、2つの文字列をスラッシュで結合し、その間にスラッシュを重複させないことだけです。それだけです。それ以上でも以下でもありません。ハードディスク上の実際のパスを評価するわけでもなく、最初のスラッシュを実際に保持するわけでもありません (必要に応じてスラッシュを追加してください。少なくとも、このコードが常に文字列を返すことは確かです)。 のない のない文字列を返すことを確認できます)。

join('/', array(trim("abc/de/", '/'), trim("/fg/x.php", '/')));

最終的な結果は常に、最初と最後にスラッシュがなく、内部にダブルスラッシュがないパスになります。これを利用して自由に関数を作ってください。

編集 上記のスニペットのための柔軟な関数ラッパーを紹介します。配列や個別の引数として、必要なだけのパスのスニペットを渡すことができます。

function joinPaths() {
    $args = func_get_args();
    $paths = array();
    foreach ($args as $arg) {
        $paths = array_merge($paths, (array)$arg);
    }

    $paths = array_map(create_function('$p', 'return trim($p, "/");'), $paths);
    $paths = array_filter($paths);
    return join('/', $paths);
}

echo joinPaths(array('my/path', 'is', '/an/array'));
//or
echo joinPaths('my/paths/', '/are/', 'a/r/g/u/m/e/n/t/s/');

:o)