Intro Comment: Пожалуйста, задавайте только один вопрос за один раз. Вы получите лучшие ответы, чем. Кроме того, вы не сможете получить хороший совет по производительности, если не покажете нам показатели, которые вы уже сделали.
Из того, что я вижу по вашему коду, вы делаете два раза обработку строки, которую можете сохранить, помещая замену в определенные пробелы. Вы можете сначала развернуть его с вашим определением:
$emoticons = array(
' [HAPPY] ' => array(' :-) ', ' :) ', ' :o) '), //etc...
' [SAD] ' => array(' :-( ', ' :( ', ' :-| ')
);
foreach ($emoticons as $replace => $search)
{
$string = str_replace($search, $replace, $string);
}
Это сэкономит вам несколько долей микросекунды при каждом вызове вызова, что, в общем, даст вам лучшую производительность, которую вы, вероятно, не заметите. Это подводит меня к мысли, что вам, вероятно, следует написать это на C и скомпилировать.
Чуть ближе к C было бы использование регулярного выражения, скомпилированного один раз, а затем использованного повторно, что уже было предложено в другом ответе. Преимущество здесь в том, что у вас может быть самый быстрый способ сделать это с PHP, если вы выполняете одно и то же выражение несколько раз и , вы можете сгенерировать регулярное выражение заранее, поэтому вы можете сохранить его в формате, который Вам легче редактировать. Затем вы можете кешировать регулярное выражение на тот случай, если вам даже понадобится настроить производительность, которая вряд ли.
1. Как видите, я помещаю пробелы вокруг каждого смайлика в массиве, например, «:-)» вместо «:-)». По моему мнению, этот массив становится менее читаемым. Есть ли способ хранить смайлики без пробелов, но при этом сопоставлять $ string с пробелами вокруг них? (и так же эффективно, как код сейчас?)
Да, это возможно, но не более эффективно в том смысле, что вам потребуется дальнейшая обработка данных конфигурации в данных замены. Не знаю, о какой эффективности вы действительно говорите, но я полагаю, что позже, поэтому ответ возможен, но не подходит для вашего особого варианта использования. Обычно я бы предпочел что-то, что было бы легче отредактировать, так что, если говорить о скорости обработки, вам будет эффективнее справиться с этим, потому что скорость обработки может быть значительно сокращена путем распределения обработки по нескольким компьютерам.
2. Или, может быть, есть способ поместить смайлики в одну переменную и взорваться в пространстве, чтобы проверить соответствие $ string? Что-то вроде
$emoticons = array( '[HAPPY]' => ">:] :-) :) :o) :] :3 :c) :> =] 8) =) :} :^)", '[SAD]' => ":'-( :'( :'-) :')" //etc...
Конечно, это возможно, но вы сталкиваетесь с теми же проблемами, что и в 1.
3. Str_replace - самый эффективный способ сделать это?
Хорошо, сейчас с предложенным вами кодом это единственный способ, о котором вы спрашиваете. Поскольку у вас нет альтернативы, о которой вы нам рассказываете, она, по крайней мере, работает для вас, что на данный момент является наиболее эффективным способом сделать это для вас. Так что сейчас да.