Что не так с этим кодом цикла - PullRequest
1 голос
/ 06 февраля 2012

Итак, я написал код для создания SEO-дружественных URL.Эти функции сначала создают дружественный к слагу слаг, а затем, если слаг уже существует, это БД (в данном случае массив), затем они добавляют число с тире рядом с ним.если это также существует, то они просто +1 к номеру, а затем проверяют снова и снова ...

например.если я передам "заголовок URL" в функцию.Сначала он преобразует его в «title-url», и если «title-url» уже существует, то он добавит число, подобное «title-url-1», если он существует, то он будет +1 к числу, как «title-».url-2 ", а затем" title-url-3 "и так далее ...

это код:

// CONVERTS STRING TO URL SLUG
function str_to_slug($str){
    $str = strtolower(trim($str));
    $str = preg_replace('/[^a-z0-9-]/', '-', $str);
    $str = preg_replace('/-+/', "-", $str);
    return $str;
}

// RETURN SLUG URL
function slug($title){
    $ori_url = str_to_slug($title);
    if( does_slug_exists($ori_url) ){ 
       return loop_slug_number($ori_url, 1); 
    }
    else{ 
       return $ori_url; 
    }
}

// ADD NUMBER
function loop_slug_number($slug, $number){
    if( does_slug_exists($slug.'-'.$number) ){ 
        loop_slug_number($slug, $number++); 
        exit; 
    }
    else{ 
        return $slug.'-'.$number; 
    }
}

// CHECKS WHEATHER THE SLUG EXISTS IN THE DB
function does_slug_exists($slug){
    $array = array("title", "title-0", "title-1", "title-2");
    return (in_array($slug, $array)) ? true : false;
}

я думаю, что все должно работать нормально.но когда я повторяю слизень ("название");я получаю

Fatal error: Maximum function nesting level of '100' reached, aborting!

номер строки ошибки в функции do_slug_exists () в строке 'return'.

(массив только для примера, я буду использовать проверку db.)

также, если я заменю массив на:

$array = array("title", "title-0", "title-2", "title-3");

, тогда я верну title-1.

Где ошибка?

Ответы [ 3 ]

1 голос
/ 06 февраля 2012

Игнорируя любые комментарии о качестве кода, проблема здесь заключается в постинкрементной переменной $number. Вы можете заменить на:

return loop_slug_number($slug, ++$number);

Однако я предлагаю переписать всю функцию как цикл while, а не псевдорекурсивную функцию. Кроме того, похоже, что запрос БД выполняется при каждом вызове does_slug_exists(); Я предлагаю вам выполнить рефакторинг, чтобы сделать запрос один раз и сохранить возвращенный набор результатов. Посмотрите на этот пример .

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

Я не уверен насчет PHP, но в C вы должны вместо этого сделать ++number. Идея состоит в том, что число увеличивается после , функция вызывается, если вы делаете number++, и раньше, если вы делаете ++number.

.. радости увеличения / уменьшения операторов ...

0 голосов
/ 06 февраля 2012
// ADD NUMBER
function loop_slug_number($slug, $number){
    if( does_slug_exists($slug.'-'.$number) ){ loop_slug_number($slug, $number++); exit;     }else{ return $slug.'-'.$number; }
}

Это действительно ужасный код. Вместо цикла используйте цикл while. Начните число с 0 и while слаг существует, увеличьте число.

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