使用PHP的usort排除标题开头的某些单词

时间:2011-08-29 21:06:25

标签: php string sorting

简单的问题是,在专辑标题的开头排除诸如'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']);
}

如上所述,这种方法非常好,它似乎并不是一种非常好的方法。有什么想法吗?

3 个答案:

答案 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