快速和簡單的解決方案
你可以做你的生活更輕鬆,並使用DirectoryIterator
來檢查目錄。
echo '<select name="vids" size="4">';
foreach(new DirectoryIterator('/path/to/videos') as $file) {
if($file->isFile() === TRUE && $file->getBasename() !== '.DS_Store') {
printf("<option>%s</option>\n", htmlentities($file->getBasename()));
}
}
echo '</select>';
改進:去耦目錄過濾從選擇框大廈
如果要分離從foreach
環路濾波邏輯,你也可以繼承一個FilterIterator
以膠囊劑,其邏輯爲它的accept()
方法。然後DirectoryIterator
必須被包裝到FilterIterator
中。主要的一點是當然的可重用性:
class MyFilter extends FilterIterator
{
public function accept()
{
return $this->current()->isFile() === TRUE &&
$this->current()->getBasename() !== '.DS_Store';
}
}
$iterator = new MyFilter(new DirectoryIterator('/path/to/videos'));
當您在過濾迭代器使用foreach
,它會自動觸發accept()
。如果accept()
返回FALSE
,則當前元素將在迭代過濾出。
您創建這樣的選擇框,然後:
echo '<select name="vids" size="4">';
foreach($iterator as $file) {
printf("<option>%s</option>\n", htmlentities($file->getBasename()));
}
echo '</select>';
替代繼承FilterIterator
如果你是懶得寫一個單獨的FilterIterator
或認爲這只是不值得的一個特定的情況或者已經有驗證器在某處並且不想複製它們的代碼,但仍然想要分離Filtering和SelectBox的創建,您還可以使用此自定義FilterChainIterator
並添加回調:
$iterator = new FilterChainIterator(new DirectoryIterator('/path/to/videos'));
$iterator->addCallback(function($file) {
return $file->isFile() === TRUE &&
$file->getBasename() !== '.DS_Store';});
SelectBox的創建過程與上面顯示的相同。
改進:使選擇框創建可重用的
另外,如果你想使選擇框創建可重用的,爲什麼不爲它創建一個助手。下面是使用DOM創建實際HTML的非常簡單的一個。您通過任何迭代器,當你調用它的render()
方法或字符串上下文中使用它,它會爲你創建的HTML:
class SelectBox
{
protected $iterator;
public function __construct(Iterator $iterator)
{
$this->iterator = $iterator;
}
public function render()
{
$dom = new DOMDocument;
$dom->formatOutput = TRUE;
$dom->loadXml('<select name="vids"/>');
$dom->documentElement->appendChild(new DOMElement('option', 'Pick One'));
foreach($this->iterator as $option) {
$dom->documentElement->appendChild(
new DOMElement('option', $option));
}
return $dom->saveXml($dom->documentElement);
}
public function __toString()
{
return $this->render();
}
}
,然後打印一個選擇框從一個Iterator很簡單,只要
echo new SelectBox(new MyFilter(new DirectoryIterator('/path/to/videos')));
這是非常靈活的,因爲有一切的迭代器。例如
echo new SelectBox(new ArrayIterator(array('foo', 'bar', 'baz')));
會給整齊地格式化
<select>
<option>Pick One</option>
<option>foo</option>
<option>bar</option>
<option>baz</option>
</select>
爲什麼相同(===)運算符'$文件 - > ISFILE()=== TRUE'?我可以想象,只是'$ file-> isFile()'會起同樣的作用。 – 2012-12-13 22:42:24
對於DirectoryIterator爲+1 – 2013-02-20 13:28:02