简单的问题是,在专辑标题的开头排除诸如'a'和'the'之类的单词的最佳方式是什么,以便按字母顺序更好地排序您的标题数组。我有一个有效的功能,但它似乎有点俗气,我想知道是否有更好的方法来做到这一点(我确定有),我没想到。
function cmp($a, $b) {
$excludes = array('a', 'the'); // Add excluded words here
foreach ($excludes as $word):
if (strtolower(substr($a['title'], 0, strlen($word) + 1)) == "{$word} ") $a['title'] = substr($a['title'], strlen($word) + 1);
if (strtolower(substr($b['title'], 0, strlen($word) + 1)) == "{$word} ") $b['title'] = substr($b['title'], strlen($word) + 1);
endforeach;
return strcasecmp($a['title'], $b['title']);
}
如上所述,这种方法非常好,它似乎并不是一种非常好的方法。有什么想法吗?
答案 0 :(得分:2)
您可以使用preg_replace
来简化代码:
function cmp($a, $b) {
static $excludes = '/^(an?|the)\s+/i'; // Add excluded words here
return strcasecmp(
preg_replace($excludes, '', $a['title']),
preg_replace($excludes, '', $b['title'])
);
}
答案 1 :(得分:0)
另一种方法是将循环展开到if / elseif块。 (这似乎更快恕我直言)
无论你提出哪种方法,一定要测试它们(在10,000张专辑中运行10次)并查看哪一种最快。然后用那个!
答案 2 :(得分:0)
在比较之前使用正则表达式应该有效:
// Adjust song title deleting "the" or "a" and trimming left spaces
function adjust( $title ) {
return preg_replace( "/^(the|a) */i", "");
}
function cmp($a, $b) {
return strcasecmp( adjust($a['title']), adjust($b['title']) );
}
这样,您可以在比较之前对字符串执行其他调整 在这里,您可以找到preg_replace doc,在这里可以找到regex infos