被这一个难倒:
我有一个函数返回给定目录中的文件夹数组。当我遍历数组时,我可以看到所有项目。但是,如果我尝试打印第一个项目,我什么也得不到:
function get_folders($dir) {
return array_filter(scandir($dir), function ($item) use ($dir) {
return (is_dir($dir.'/'.$item) && $item != "." && $item != "..") ;
});
}
$folders = get_folders(".");
$first_folder = $folders[0];
echo $first_folder; // returns blank.
有趣的是,如果我不过滤掉“。”和“..”,然后$first_folder
打印“。”。谁能解释一下呢?
答案 0 :(得分:3)
正如manual中所述:使用array_filter()
时保留数组键。
密钥将从scandir()
的调用中保留,其中包含.
和..
目录,这意味着您的过滤后的数组将从2或更多开始(无论密钥是什么,第一个目录)。
一个简单的解决方法是将整个事物包装在array_values()
中,以使得结果数组具有从0
开始并递增1的键。
return array_values(array_filter(...));
答案 1 :(得分:1)
你可以打印文件夹并查看是否有一些键可以获得第一个文件夹而不是选择零索引?似乎lke $ folders [0]可以工作,除非条目存储了一组不同的索引/键。
尝试做
print_r($folders)
查看它是否按预期输出您要查找的相应索引的第一个文件夹和所有其他文件夹。
答案 2 :(得分:1)
迭代输入数组中的每个值,并将它们传递给回调函数。如果回调函数返回true,则输入中的当前值将返回到结果数组中。 保留数组键。
因此,scandir($dir)
会在密钥.
为您提供一个0
的数组,因此,如果您稍后过滤.
,则密钥{{1}在结果中。
如果您想知道结果数组的第一个键是什么,请尝试使用0
函数。
编辑:实际上,salathe建议使用array_keys
在你的情况下比从array_values
获取密钥更好。
答案 3 :(得分:1)
array_filter
保留数组键,因此如果前两个元素已被删除,则“new first”元素的索引为2.要将其转换为从0开始索引的数组,请使用{{1 }}:
array_values
答案 4 :(得分:1)
正如其他人所说,array_filter
保留了数组中的键。鉴于最初项'.'
具有键0
,过滤后的数组最终不具有键0
的任何项(您可以使用{{1}验证此项这一行:
print_r($folders)
最终生成一个$first_folder = $folders[0];
,表示阵列中没有键E_NOTICE
(打开通知会立即提醒您问题的原因,我强烈推荐它)并给予{ {1}}值0
。
要获取已过滤数组的第一个值,无论使用哪个键,都要使用reset
:
$first_folder