Оптимизация функции PHP - PullRequest
       5

Оптимизация функции PHP

0 голосов
/ 15 февраля 2012

Моя функция генерации языковой панели выглядит так. Это работает, но, похоже, это не оптимальный способ, и у этой функции есть куча дополнительных строк, которые можно удалить. Как бы вы минимизировали это?

public function generateLangs($url, $curlang, $langs) {
    $i = 0;
    $countlng = count($langs);
    foreach ($langs as $lang) {
        if (strstr($url, '?')) {
            if (strstr($url, 'lang')) {
                $newurl = preg_replace('&lang=(\w+)&', 'lang=' . $lang, $url);
            } else {
                $newurl = $url . '&lang=' . $lang;
            }
        }
        else {
            $newurl = $url . '?lang=' . $lang;                
        }
        $result = '<a ';
        if ($curlang == $lang) {
             $result .= 'class="active" ';
        }
        $result .= 'href="' . $newurl . '">' . $lang . '</a>' . "\n";
        if ($i != $countlng - 1)
            $result .= ' | ';
        echo $result;
        $i++;
    }
}

1 Ответ

0 голосов
/ 15 февраля 2012

Прежде всего вы можете сделать языковое значение параметром URL, используя простой заполнитель, такой как %s или %lang%:

$url = 'http://example.com/site/?lang=%lang%';
$newurl = str_replace('%lang%', $lang, $url);

Вы можете сделать это или инкапсулировать логику, чтобы заменить какой-либо параметр запроса URI на собственную функцию и использовать встроенные функции вместо этого, вместо этого сворачивая свои собственные (например, parse_url, parse_str, ...).

Аналогично тому, что относится и к вашему выводу, вы можете использовать существующий индекс (я думаю, на основе 0) и, следовательно, оптимизировать целое:

public function generateLangs($url, $currentLanguage, $languages)
{

    $urlPattern = preg_replace('~^(.*[?&]lang=)([a-z]+)((?:&.*)?)$~', '\1%lang%\3', $url, 1, $count);
    $count || $urlPattern .= '?lang=%lang%';
    unset($count);

    foreach ($languages as $i => $lang)
    {
        $newUrl = str_replace('%lang%', $lang, $urlPattern);
        printf("%s<a href=\"%s\"%s>%s</a>\n", $i ? ' | ' : '', $newUrl, 
                $curlang === $lang ? ' class="active"' : '', $lang);
    }
}

Ключевым моментом более или менее является то, что вы группируете код рядом друг с другом, который принадлежит друг другу. Это более или менее автоматически уменьшает сложность кода и, следовательно, часто его длину. Но позаботьтесь о том, чтобы длина не была столь важной, более важно, чтобы вы могли прочитать ее правильно.

...