我正在尝试在特定文件夹中创建ARRAY
个文件和子文件夹。我在获取文件和子文件夹列表方面取得了成功,但当我尝试将这些数据保存在ARRAY
时,它只在LOOP
内显示预期结果。 LOOP
完成后return EMPTY
这是完整的代码
<?php
function dirToOptions($path = '../data/vid/', $level = 0) {
$items = scandir($path);
$vidCount = 0; $thumbCount = 0;
foreach($items as $item) {
// ignore items strating with a dot (= hidden or nav)
if (strpos($item, '.') === 0) {
continue;
}
$fullPath = $path . DIRECTORY_SEPARATOR . $item;
// add some whitespace to better mimic the file structure
$item = str_repeat(' ', $level * 3) . $item;
// file
if (is_file($fullPath)) {
$rrInt = (int)$level-1;
if($rrInt == 0){
$vid['videos'][] = array('name'=>$item, 'link'=>$fullPath);
echo "<a href='$fullPath'><i for='$rrInt'>$item</i></a><br />";
}elseif($rrInt == 1){
$thumb['thumbs'][] = array('name'=>$item, 'link'=>$fullPath);
echo "<a href='$fullPath'><i for='$rrInt'>$item</i></a><br />";
var_dump($thumb); //SHOW RESULT HERE
}
}
// dir
else if (is_dir($fullPath)) {
// immediatly close the optgroup to prevent (invalid) nested optgroups
echo "<b label='$level'>$item</b><br />";
// recursive call to self to add the subitems
dirToOptions($fullPath, $level + 1);
}
}
}
$array = array(); $vid = array(); $thumb = array();
echo '<div>';
dirToOptions();
echo '</div>';
var_dump($vid); // RETURN EMPTY
?>
感谢大家的支持,但最后我更喜欢使用
GLOBAL VARS
答案 0 :(得分:1)
见PHP - Variable scope。在SELECT MAX(BB.SEQNBR)
FROM TEST_STATUS BB
WHERE BB.USERID = B.USERID
and not exists (select 1
from TEST_STATUS cc
where ccUSERID = BB.USERID
AND cc.STATUS1 = 'CLE')
中定义的$vid
在函数内部不可用,并且内部定义的$vid = array();
在外部不可用。您可能希望在函数末尾$vid
:
return
然后分配回报并使用它:
return $vid;
但看起来您与$vid = dirToOptions();
var_dump($vid);
会遇到同样的问题,因此请将其更改为使用$thumb
数组:
$vid
答案 1 :(得分:0)
简单的答案是添加以下行:
global $vid;
到你的功能的开头。这会将$ vid的范围扩展到你的函数之外。
虽然,我会建议您按照其他说明操作,然后从函数返回数组。
答案 2 :(得分:-1)
函数内部和外部的变量是不同的变量,即使它们的名称相同。这就是所谓的变量范围。这样,您的函数在内部保持其所有状态,并且不会影响函数定义之外的任何内容(偶然)。这使得引入错误变得更加困难,因为您碰巧在函数内部使用相同的变量名称。
解决方案是在构建内部数组后从函数返回值:
function dirToOptions($path = '../data/vid/', $level = 0) {
$vid = array();
....
return $vid;
}
$vid = dirToOptions();
var_dump($vid);
这样,关于dirToOptions如何工作的所有内容都保持隔离,并且您只处理从函数返回的内容。该函数的接口和所做的事情保持干净,不受任何外部依赖关系的影响。
要处理代码的递归部分,请合并每个步骤中返回的值 - 或者通过引用传递参数。在方法签名中使用引用是明确的,并且不会盲目地从全局范围创建对变量的引用(如果需要,可以作为局部变量从不同的函数传递)。
function dirToOptions($path = '../data/vid/', $level = 0) {
$vid = array();
....
} else {
// merge this array and the one returned from the child directory
$vid = array_merge($vid, dirToOptions($fullPath, $level + 1));
}
return $vid;
}
$vid = dirToOptions();
..并作为参考:
function dirToOptions(&$vid, $path = '../data/vid/', $level = 0) {
$vid = array();
....
} else {
// pass the reference on further down the recursive calls
dirToOptions($vid, $fullPath, $level + 1);
}
return $vid;
}
dirToOptions($vid);