私はすべてのディレクトリとサブディレクトリを配列内の私のFTPサーバーから取得する再帰関数を作ろうとしています。PHPのFTP再帰的なディレクトリリスト
私はウェブ上で見つけた多くの機能を試しました。
public function getAllSubDirFiles() {
$dir = array(".");
$a = count($dir);
$i = 0;
$depth = 20;
$b = 0;
while (($a != $b) && ($i < $depth)) {
$i++;
$a = count($dir);
foreach ($dir as $d) {
$ftp_dir = $d . "/";
$newdir = ftp_nlist($this->connectionId, $ftp_dir);
foreach ($newdir as $key => $x) {
if ((strpos($x, ".")) || (strpos($x, ".") === 0)) {
unset($newdir[$key]);
} elseif (!in_array($x, $dir)) {
$dir[] = $x;
}
}
}
$b = count($dir);
}
return $dir ;
}
この機能の問題は、ディレクトリに "。"が付いていないことです。その名前で、ルートディレクトリにあるすべてのファイルもディレクトリとみなされます。だから、私は関数を調整してこれを得ました:
public function getAllSubDirFiles($ip, $id, $pw) {
$dir = array(".");
$a = count($dir);
$i = 0;
$depth = 20;
$b =0;
while (($a != $b) && ($i < $depth)) {
$i++;
$a = count($dir);
foreach ($dir as $d) {
$ftp_dir = $d . "/";
$newdir = ftp_nlist($this->connectionId, $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 = count($dir);
}
return $dir ;
}
これはかなりうまくいくが、私が望む結果を与える。それはとても遅いので使用できません。
また、私はftp_rawlist
で作業を試みましたが、それは恐ろしく遅いという同じ欠点があります。
public function getAllSubDirFiles() {
$dir = array(".");
$a = count($dir);
$i = 0;
$depth = 20;
$b = 0;
while (($a != $b) && ($i < $depth)) {
$i++;
$a = count($dir);
foreach ($dir as $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];
} else {
$fileName = $fileName . ' ' . $newdir[$key][$a];
}
$a++;
}
if ($firstChar != 'd') {
unset($newdir[$key]);
} elseif (!in_array($fileName, $dir)) {
$dir[] = $fileName;
}
}
}
$b = count($dir);
}
return $dir;
}
public function getFtp_rawlist($dir) {
$newArr = array();
$arr = ftp_rawlist($this->connectionId, $dir);
foreach ($arr as $value) {
$stringArr = explode(" ", $value);
$newArr[] = array_values(array_filter($stringArr));
}
return $newArr;
}
私はここ数日間、この問題に悩まされています。私は絶望的です。いずれかの提案がある場合はお知らせください
:
は、のような単純な再帰を使用してください。 この関数をこの** $ newdir = $ this-> getFtp_rawlist( '/'。$ ftp_dir); **で呼び出し、同じ接続を使用していますが、この関数を毎回呼び出す必要がありますそこにはサブディレクトリがあります –
私はすでにそれを試みましたが、悲惨に失敗しました。あなたは簡単な例を知っていますか? –
ありがとう!私はそれが動作するようにすることができると思います。 –