在PHP中,循环后数组为空
我试图在一个特定的文件夹中创建一个文件和子文件夹的数组。我成功地获得了文件和子文件夹的列表,但当我尝试将这些数据保存在数组中时,它只在循环中显示预期的结果。循环完成后,返回空 这是完整的代码在PHP中,循环后数组为空,php,arrays,foreach,Php,Arrays,Foreach,我试图在一个特定的文件夹中创建一个文件和子文件夹的数组。我成功地获得了文件和子文件夹的列表,但当我尝试将这些数据保存在数组中时,它只在循环中显示预期的结果。循环完成后,返回空 这是完整的代码 <?php function dirToOptions($path = '../data/vid/', $level = 0) { $items = scandir($path); $vidCount = 0; $thumbCount = 0; foreach($items a
<?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
?>
感谢大家的支持,但最后我更喜欢使用全局变量
看。用$vid=数组定义的$vid;函数内部不可用,内部定义的$vid在外部不可用。您可能希望在函数末尾返回它:
return $vid;
然后分配退货并使用它:
$vid = dirToOptions();
var_dump($vid);
但是看起来$thumb也会有同样的问题,所以将其更改为使用$vid数组:
函数内外的变量是不同的变量,即使它们的名称相同。这就是所谓的变量范围。这样,您的函数在内部保持其所有状态,并且不会意外地影响函数定义之外的任何内容。这使得引入bug变得更加困难,因为您在函数内部和外部使用了相同的变量名 解决方案是在函数内部构建数组后从函数返回值:
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);
简单的答案是添加一行:
global $vid;
到你的功能的开始。这将把$vid的范围扩展到您的功能之外
不过,我衷心建议您按照其他说明操作,并从函数中返回数组。嗯。。。什么是$vid?当然它是空的$vid=array它只是一个空变量。您认为内容应该如何到达数组?您没有使用递归调用的返回值。使用全局变量几乎从来都不是首选的解决方案,至少对于这样的东西,它可以很容易地以一种更便于移植和维护的方式编写。再次检查问题的引用部分[刚刚更新]。这不是完整的代码,您没有为$array分配任何内容。我正在分配dude,稍等一下,我现在要更新问题检查BuddyIt对我来说也很奇怪,怎么不起作用?请帮助Dude检查问题的引用部分[刚刚更新],因为使用global是不好的,因为这违背了您的函数的承诺,即它不会改变自身之外的任何内容。如果您确实想做类似的事情,可以通过传递一个变量作为引用来完成。为了将来的参考,我更新了我的答案,向您展示了如何通过引用和保留返回值来解决它。我感谢您的建议,但问题是它在我的情况下不起作用,我不知道为什么。可能是因为您没有考虑代码中的递归函数调用,我已经添加了一些例子。如果您最初编写了这段代码,那么您应该对它的流程有一个相当好的把握。
global $vid;