看看下面的代碼考慮:找出最常見的擴展在Array
$files = array('1.js', '1.css', '2.js', '2.css', '3.js', '3.png');
$extensions = array();
foreach ($files as $file)
{
$extension = strtolower(pathinfo($file, PATHINFO_EXTENSION));
if (empty($extensions[$extension]) === true)
{
$extensions[$extension] = 0;
}
++$extensions[$extension];
}
arsort($extensions); // array('js' => 3, 'css' => 2, 'png' => 1)
$common_extension = key($extensions); // js
的代碼似乎工作,因爲我希望它(我仍然需要檢查發生了什麼萬一有一場平局,但這與這個問題無關)。我在尋找一種更有效的(和緊湊的方式)重寫上面的代碼中的,到目前爲止,我已經得到了最接近的是:
$files = array('1.js', '1.css', '2.js', '2.css', '3.js', '3.png');
$extensions = array_count_values(array_map('strtolower', preg_replace('~^.*[.](.*)$~', '$1', $files)));
arsort($extensions, SORT_NUMERIC);
$common_extension = key($extensions);
但這遍歷數組的3倍,並且preg_replace()
不是防彈... 有任何想法嗎?
我會使用普通的字符串函數,而不是正則表達式,如果你關心它。缺點是你最終會多出幾行,因爲你不能將數組傳遞給這些字符串函數。 – 2011-05-02 01:35:59
您可以編寫自己的方法,其中包含'strtolower'和''pathinfo'片段以用於'array_map'調用。這將爲您節省一次迭代。如果你不想'array_count_values'再次運行數組,你必須再次指望你自己。 – Frank 2011-05-02 01:47:37