2011-09-11 44 views
1

通过这个难倒数组的第一个值:帮助获得在PHP

我有一个返回的文件夹在给定的目录中的数组的函数。当我遍历数组时,我可以看到所有的项目。但是,如果我尝试打印的第一个项目,我什么也没有:

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打印“。”。任何人都可以解释吗?

回答

1

array_filter manual

在迭代将它们传递给回调函数的输入阵列中的每个值。如果回调函数返回true,则来自输入的当前值将返回到结果数组中。 数组键保存

所以,scandir($dir)让你与.数组在关键0,因此,如果您以后筛选出.,会出现在结果没有在关键0

如果您想知道结果数组的第一个键是什么,请尝试使用array_keys函数。

编辑:实际上,salathe的建议使用array_values比从array_keys获得密钥要好。

1

你可以打印文件夹,看看是否有一些关键你可以得到第一个文件夹,而不是选择索引零?看起来lke $文件夹[0]将工作,除非条目存储在一组不同的索引/键中。

尝试做一个

print_r($folders) 

,看看它输出你的第一个文件夹,如预期与你正在寻找相应的索引的所有其他文件夹。

+0

@ sigmyers-果然,print_r的透露我的指数开始[2],因为过滤器的... – Yarin

3

manual中所述:当使用array_filter()时,数组密钥被保留

的键从呼叫保留到scandir()其中将包括...目录,这意味着你的过滤阵列将在2个或更多(无论关键是第一个目录)开始。

一个简单的解决方法是将整个东西包装在array_values()中以获得从0开始并且递增1的结果数组。

return array_values(array_filter(...)); 

如果你不真正关心的钥匙,然后基本阵列功能可以使用像keycurrent

+0

,@米哈尔,@ Jon-感谢所有为伟大的答案 - Jakub只是打败你们 – Yarin

+0

殴打我自己的答案。 :-) – salathe

1

array_filter保留数组键,所以如果前两个元素已被删除,那么“新第一个”元素的索引为2。要转换成一个数组进行索引从0开始,使用array_values

return array_values(array_filter(scandir($dir), function ($item) use ($dir) { 
    ... 
1

正如其他人所说,array_filter保留在阵列中的钥匙。由于最初该项目'.'具有关键0,过滤后的数组结束具有关键0(你可以验证这一点与print_r($folders)任何项目所以这行:

$first_folder = $folders[0]; 

最终产生E_NOTICE说有数组中没有关键0(具有通知开启会立即提醒您注意问题的原因,我强烈推荐),并给予$first_foldernull

要获得的第一个值滤波阵列,无论键,使用reset

$first_folder = reset($folders); 
if($first_folder === false) { 
    echo 'No folders!'; 
} 
else { 
    echo 'First folder: '.$first_folder; 
}