Использование usort для исключения определенных слов в начале заголовка - PullRequest
0 голосов
/ 30 августа 2011

Простой вопрос, каков наилучший способ исключить такие слова, как «а» и «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 ]

2 голосов
/ 30 августа 2011

вы можете использовать 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'])
    );
}
0 голосов
/ 30 августа 2011

Использование regex непосредственно перед сравнением должно работать:

// 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 и здесь вы найдете регулярное выражение информации

0 голосов
/ 30 августа 2011

Другой способ - развернуть цикл в блоки if / elseif. (что казалось бы быстрее ИМХО)

Какой бы метод вы ни предложили, обязательно протестируйте их (запустите их на 10 000 названий альбомов 10 раз) и посмотрите, какой из них самый быстрый. Тогда используйте это!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...