PHP FTP 再帰ディレクトリリスト
<p>配列内の FTP サーバーからすべてのディレクトリとサブディレクトリを取得する再帰関数を作成しようとしています。 </p>
<p>オンラインで見つけた多くの機能を試しました。私にとって最も効果的なのはこれです: </p>
<pre class="brush:php;toolbar:false;">public function getAllSubDirFiles() {
$dir = 配列(".");
$a = カウント($dir);
$i = 0;
$深さ = 20;
$b = 0;
while (($a != $b) && ($i < $ Depth)) {
$i;
$a = カウント($dir);
foreach ($dir として $d) {
$ftp_dir = $d . "/";
$newdir = ftp_nlist($this->接続ID, $ftp_dir);
foreach ($newdir as $key => $x) {
if ((strpos($x, ".")) || (strpos($x, ".") === 0)) {
unset($newdir[$key]);
elseif (!in_array($x, $dir)) {
$dir[] = $x;
}
}
}
$b = カウント($dir);
}
$dir を返します。
}</pre>
<p>この関数の問題は、ディレクトリに「.」を含めることができないことです。ルート ディレクトリにあるすべてのファイルも、その名前のディレクトリとみなされます。そこで関数を微調整して、次のようにしました。 </p>
<pre class="brush:php;toolbar:false;">public function getAllSubDirFiles($ip, $id, $pw) {
$dir = 配列(".");
$a = カウント($dir);
$i = 0;
$深さ = 20;
$b =0;
while (($a != $b) && ($i < $ Depth)) {
$i;
$a = カウント($dir);
foreach ($dir として $d) {
$ftp_dir = $d . "/";
$newdir = ftp_nlist($this->接続ID, $ftp_dir);
foreach ($newdir as $key => $x) {
if (!is_dir('ftp://'.$id.':'.$pw.'@'.$ip.'/'.$x)) {
unset($newdir[$key]);
elseif (!in_array($x, $dir)) {
$dir[] = $x;
}
}
}
$b = カウント($dir);
}
$dir を返します。
}</pre>
<p>これは正常に動作しますが、期待どおりの結果が得られます。しかし、遅すぎて使えません。 </p>
<p><code>ftp_rawlist</code> も使用してみましたが、非常に遅いという同じ欠点がありました。 </p>
<pre class="brush:php;toolbar:false;">public function getAllSubDirFiles() {
$dir = 配列(".");
$a = カウント($dir);
$i = 0;
$深さ = 20;
$b = 0;
while (($a != $b) && ($i < $ Depth)) {
$i;
$a = カウント($dir);
foreach ($dir として $d) {
$ftp_dir = $d . "/";
$newdir = $this->getFtp_rawlist('/' . $ftp_dir);
foreach ($newdir as $key => $x) {
$firstChar = substr($newdir[$key][0], 0, 1);
$a = 8;
while ($a < count($newdir[$key])) {
if ($a == 8) {
$fileName = $ftp_dir . '/' . $newdir[$key][$a];
} それ以外 {
$fileName = $fileName . ' ' . $newdir[$key][$a];
}
$a ;
}
if ($firstChar != 'd') {
unset($newdir[$key]);
elseif (!in_array($fileName, $dir)) {
$dir[] = $ファイル名;
}
}
}
$b = カウント($dir);
}
$dir を返します。
}
パブリック関数 getFtp_rawlist($dir) {
$newArr = 配列();
$arr = ftp_rawlist($this->connectionId, $dir);
foreach ($arr as $value) {
$stringArr =explode(" ", $value);
$newArr[] = array_values(array_filter($stringArr));
}
$newArr を返します。
}</pre>
<p>ここ数日この問題に悩まされており、ますます絶望的になってきています。誰かが何か提案がある場合は、私に知らせてください</p>