递归 php 数组失败
Recursive php array fails
我正在尝试创建一个递归函数,returns 所有文件都按它们所在的目录分组。我的文件结构是这样的
.
|-- Dir A
| +-- file 1
| +-- file 2
|-- Dir B
| +-- file 11
| +-- file 12
我希望生成的数组是
array[0][0] = Dir A
array[0][1] = file 1
array[0][2] = file 2
array[1][0] = Dir B
array[1][1] = file 11
array[1][2] = file 12
虽然我的 echo 显示它找到了所有这些,但最终的数组如下所示:
array[0][0] = Dir A
array[1][0] = Dir B
所以文件没有存储在数组中,或者可能被覆盖了,但我找不到错误。有人可以指出吗?我的功能如下。
function GetAllFiles($dir = '.', $fileArray = '', $idx = -1){
if ($fileArray == '') $fileArray = array();
if(is_dir($dir)) {
if($dh = opendir($dir)){
while($file = readdir($dh)) {
if($file != '.' && $file != '..'){
if(is_dir($dir . $file)){
$idx++;
echo 'A '.$idx . ' - ' .$dir . $file.'<br>';
$fileArray[$idx][] = $dir . $file;
GetAllFiles($dir . $file . '/', $fileArray, $idx);
}else{
echo 'B '.$idx. ' - ' .$dir . $file.'<br>';
$fileArray[$idx][] = $dir . $file;
}
}
}
}
closedir($dh);
}
return $fileArray;
}
echo 'B '.$idx. ' - ' .$dir . $file.'<br>';
array_push($[$idx],$dir.$file);
这在我做了一些修改后有效:
<?php
function GetAllFiles($dir) {
$fileTree = [];
if (is_dir($dir) && ($dh = opendir($dir))) {
while ($node = readdir($dh)) {
if (is_dir($dir . '/' . $node)) {
if(!in_array($node, ['.', '..'])) {
$fileTree[] = GetAllFiles($dir . '/' . $node);
array_unshift($fileTree[count($fileTree)-1], $node);
}
} else {
$fileTree[] = $node;
}
}
closedir($dh);
}
return $fileTree;
}
print_r(GetAllFiles('tree'));
鉴于该文件树:
tree
tree/file1
tree/file2
tree/folder1
tree/folder1/file11
tree/folder1/file12
tree/folder2
tree/folder2/file21
tree/folder2/file22
tree/folder2/folder23
tree/folder2/folder23/file231
tree/folder2/folder23/file233
tree/folder2/folder23/file232
它产生输出:
Array
(
[0] => file2
[1] => Array
(
[0] => folder1
[1] => file11
[2] => file12
)
[2] => Array
(
[0] => folder2
[1] => Array
(
[0] => folder23
[1] => file231
[2] => file233
[3] => file232
)
[2] => file21
[3] => file22
)
[3] => file1
)
基本上是:
[0] => file2
[1][0] => folder1
[1][1] => file11
[1][2] => file12
[2][0] => folder2
[2][1][0] => folder23
[2][1][1] => file231
[2][1][2] => file233
[2][1][3] => file232
[2][2] => file21
[2][3] => file22
[3] => file1
我正在尝试创建一个递归函数,returns 所有文件都按它们所在的目录分组。我的文件结构是这样的
.
|-- Dir A
| +-- file 1
| +-- file 2
|-- Dir B
| +-- file 11
| +-- file 12
我希望生成的数组是
array[0][0] = Dir A
array[0][1] = file 1
array[0][2] = file 2
array[1][0] = Dir B
array[1][1] = file 11
array[1][2] = file 12
虽然我的 echo 显示它找到了所有这些,但最终的数组如下所示:
array[0][0] = Dir A
array[1][0] = Dir B
所以文件没有存储在数组中,或者可能被覆盖了,但我找不到错误。有人可以指出吗?我的功能如下。
function GetAllFiles($dir = '.', $fileArray = '', $idx = -1){
if ($fileArray == '') $fileArray = array();
if(is_dir($dir)) {
if($dh = opendir($dir)){
while($file = readdir($dh)) {
if($file != '.' && $file != '..'){
if(is_dir($dir . $file)){
$idx++;
echo 'A '.$idx . ' - ' .$dir . $file.'<br>';
$fileArray[$idx][] = $dir . $file;
GetAllFiles($dir . $file . '/', $fileArray, $idx);
}else{
echo 'B '.$idx. ' - ' .$dir . $file.'<br>';
$fileArray[$idx][] = $dir . $file;
}
}
}
}
closedir($dh);
}
return $fileArray;
}
echo 'B '.$idx. ' - ' .$dir . $file.'<br>';
array_push($[$idx],$dir.$file);
这在我做了一些修改后有效:
<?php
function GetAllFiles($dir) {
$fileTree = [];
if (is_dir($dir) && ($dh = opendir($dir))) {
while ($node = readdir($dh)) {
if (is_dir($dir . '/' . $node)) {
if(!in_array($node, ['.', '..'])) {
$fileTree[] = GetAllFiles($dir . '/' . $node);
array_unshift($fileTree[count($fileTree)-1], $node);
}
} else {
$fileTree[] = $node;
}
}
closedir($dh);
}
return $fileTree;
}
print_r(GetAllFiles('tree'));
鉴于该文件树:
tree
tree/file1
tree/file2
tree/folder1
tree/folder1/file11
tree/folder1/file12
tree/folder2
tree/folder2/file21
tree/folder2/file22
tree/folder2/folder23
tree/folder2/folder23/file231
tree/folder2/folder23/file233
tree/folder2/folder23/file232
它产生输出:
Array
(
[0] => file2
[1] => Array
(
[0] => folder1
[1] => file11
[2] => file12
)
[2] => Array
(
[0] => folder2
[1] => Array
(
[0] => folder23
[1] => file231
[2] => file233
[3] => file232
)
[2] => file21
[3] => file22
)
[3] => file1
)
基本上是:
[0] => file2
[1][0] => folder1
[1][1] => file11
[1][2] => file12
[2][0] => folder2
[2][1][0] => folder23
[2][1][1] => file231
[2][1][2] => file233
[2][1][3] => file232
[2][2] => file21
[2][3] => file22
[3] => file1