2011-09-11 76 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; 
}