Opendir函数为我提供了多个数组,而不仅仅是一个数组

时间:2012-02-18 12:09:31

标签: php arrays rest opendir

致敬,代码长老,

我正在寻求掌握PHP的法术,现在需要你帮助杀死一个强大的野兽。

我正在使用PHP创建REST API。其中一个函数是GET,它返回dir中的png列表。但是它不是返回一个数组,而是返回多个数组(每次迭代一个?)。

我想:

["1.png","2.png","3.png"]

但我得到了:

["1.png"]["1.png","2.png"]["1.png","2.png","3.png"]

我表现出可耻和羞辱的可怜功能:

function getPics() {
$pic_array = Array(); 
$handle =    opendir('/srv/dir/pics'); 
while (false !== ($file = readdir($handle))) { 
    if ($file!= "." && $file!= ".." &&!is_dir($file)) { 
    $namearr = explode('.',$file); 
    if ($namearr[count($namearr)-1] == 'png') $pic_array[] = $file; 
    } 
echo json_encode($pic_array);
} 
closedir($handle);
}

2 个答案:

答案 0 :(得分:1)

你应该做一些适当的缩进,这将是非常明确的错误。您将echo json_encode() 放入循环中。这是一个更正版本:

function getPics()
{
    $pic_array = Array(); 
    $handle = opendir('/srv/dir/pics'); 
    while ( false !== ($file = readdir($handle)) )
    {
        if ( $file=="." || $file==".." || is_dir($file) ) continue; 
        $namearr = explode('.',$file);
        if ($namearr[count($namearr)-1] == 'png') $pic_array[] = $file; 
    } 
    echo json_encode($pic_array);
    closedir($handle);
}

请注意,这种检查扩展失败的方法有一个小缺陷,因为名为“png”(没有扩展名)的文件将匹配。有几种方法可以解决这个问题,例如:使用pathinfo()分析文件名。

PS。也不是这个:

if ( $file=="." || $file==".." || is_dir($file) ) continue; 

可以写成

if ( is_dir($file) ) continue; 

答案 1 :(得分:0)

想想你的循环。每次循环时都会回显json_encode($ pic_array)。所以在第一个循环中你只有第一个文件,然后在第二个循环...两个文件被打印。等等等等