Как объединить различные условия ЕСЛИ в окончательный результат

Я создаю скрипт, который будет обрабатывать URL-адрес и изменять его в соответствии с различными условиями.

Я не уверен, как лучше всего это сделать; например, прямо сейчас в разделе «Партнер А», если категория отличается от «премиум», моя переменная final_url останется пустой. Думаю, я могу сделать условие, которое будет проверять, пусто ли оно, и в этом случае оно должно применить к нему значение $url3, но оно не кажется достаточно умным:

<?php

$url = "http://www.default.com"; // default URL

$url = "something"; // this part will come from a database

$id="something"; // some value to insert later into URL

// the following rules will be followed according to various parameters not defined in this sample code

if($partner == "A") { // Partner A rule:

    $url2 = str_replace('777', '999', $url); // Inital Change

    $url3 = str_replace('?location', '?id=' . $id . '&location', $url2); // Add id, anytime ?location shows up

    if($category == "premium") { // premium category rules:

        $re = "/(?<=TID%3D)\\d+/";  // String to Replace in URL (digits)
        $newtid = "4000"; // Default New TID

                if($special == "yes") { $newtid = "8000";} // special TID value

        $final_url = preg_replace($re, $newtid, $url3); // replace the TID

    }

};


if($partner == "B") { // Partner B rule:

$final_url = str_replace('status=1', 'config=' . $id . '&status=1', $url); //Add id, anytime status=1 exists in url
};

?>  

<p>Final URL: <?php echo $final_url; ?></p>

Кроме того, я не уверен, что вся структура оптимальна в целом.

ИЗМЕНИТЬ:

обновленный код:

if($category == 'A') {
    // A category rules:
    $url2 = str_replace('aaa', 'bbb', $url); // Global rule #1
    $url3 = str_replace('?url', '?id=' . $id . '&url', $url2); // Glbal rule #2
    $final_url = $url3; // Final URL unless following cases occur

    if($offer == 'Special') {
        //category is A and offer is special

        $re = "/(?<=TID%3D)\\d+/";  // replace rule for current case
        $tid = "123"; // Default New TID value for current case
        $final_url = preg_replace($re, $tid, $url3); // Final URL for this case unless following case occur

        if ($discount == '10') {
            // category is A, offer is special, and Discount is 10

            $re = "/(?<=TID%3D)\\d+/";  // replace rule for current case
            $tid = "999"; // Special TID value for current case
            $final_url = preg_replace($re, $itd, $url3); // Final URL for this case
        }
    }
} 

person rockyraw    schedule 02.01.2016    source источник
comment
Я голосую за то, чтобы закрыть этот вопрос как не относящийся к теме, поскольку он относится к codereview.stackexchange.com.   -  person James A Mohler    schedule 02.01.2016


Ответы (2)


Это должно упростить код:

if($category == 'A') {
    // A category rules:
    $final_url = str_replace(array('aaa', '?url'), array('bbb', '?id=' . $id . '&url'), $url);
    $re = "/(?<=TID%3D)\\d+/";  // replace rule for current case
    if($offer == 'Special') {
        //category is A and offer is special
        $tid = "123"; // Default New TID value for current case
        if ($discount == '10') {
            // category is A, offer is special, and Discount is 10
            $tid = "999"; // Special TID value for current case
        }
       $final_url = preg_replace($re, $tid, $url3);
    }
}

Ваше регулярное выражение такое же, поэтому вам не нужно определять его дважды. str_replace также может принимать несколько полей поиска и заменять значения.

person chris85    schedule 02.01.2016
comment
хорошо, я сделал обновление, не уверен, что есть способ сделать его короче. Спасибо. - person rockyraw; 02.01.2016
comment
обновленный ответ @rockyraw; untesed может быть какая-то синтаксическая ошибка там .. - person chris85; 02.01.2016

Одним из эффективных способов приблизиться к этому может быть оператор switch/case:

switch (TRUE) {

case ($partner == 'A') :
/* rules; */

if ($category == 'premium') {
/* rules; */
}

else {
/* rules; */
}

/* rules; */

break;

case ($partner == 'B') :
/* rules; */
break;
}

=====

Исходное предложение:

switch (TRUE) {

case (($partner == 'A') && ($category == 'premium')) :
/* rules; */
break;

case ($partner == 'A') :
/* rules; */
break;

case ($partner == 'B') :
/* rules; */
break;
}

=====

Измененное предложение:

switch (TRUE) {

case (($partner == 'A') && ($category == 'premium')) :
/* rules; */

case ($partner == 'A') :
/* rules; */
break;

case ($partner == 'B') :
/* rules; */
break;
}
person Rounin    schedule 02.01.2016
comment
разве нет действия по умолчанию, которое будет выполнено, если не будет выполнено ни одно условие? - person danidee; 02.01.2016
comment
Да, вы можете добавить один. Но это не обязательно. - person Rounin; 02.01.2016
comment
Будут ли правила ($partner == 'A') применяться к случаю case (($partner == 'A') && ($category == 'premium')), если только они не будут отменены другими правилами? например, под case (($partner == 'A') && ($category == 'premium')) могу ли я написать только строку $newtid = "8000";, и она будет работать так же, как исходный код? или я должен повторить все общие правила и в частном случае? - person rockyraw; 02.01.2016
comment
Вы можете написать только строку $newtid = "8000"; под case (($partner == 'A') && ($category == 'premium')), но если вы это сделаете, обязательно удалите break; непосредственно под ней, чтобы синтаксический анализатор PHP продолжал проверять следующий случай ( ($partner == 'A') ) и не t вырваться из структуры. - person Rounin; 02.01.2016
comment
странно, когда я снимаю break, код обрабатывает следующее условие, как если бы оно было истинным, даже если это не так... - person rockyraw; 02.01.2016
comment
Вы имеете в виду, когда $partner == 'B' парсер все еще следует правилам для $partner == 'A'? - person Rounin; 02.01.2016
comment
нет, я имею в виду, что когда $partner == 'A' НО category не является premium, скрипт по-прежнему применяет правила из премиум-категории. - person rockyraw; 02.01.2016
comment
Я взял большой жар за попытку используйте переключатель/кейс для этого. - person rockyraw; 02.01.2016
comment
можете ли вы добавить образец такого if/else внутри case без breal в свой ответ? - person rockyraw; 02.01.2016
comment
Я обновил сообщение выше, чтобы показать if/else внутри case. - person Rounin; 02.01.2016
comment
измененный и исходный код выглядят как один и тот же, это ошибка? - person rockyraw; 02.01.2016
comment
Единственным отличием является отсутствие break; сразу после первого case (см. мой комментарий, который начинается Вы можете написать только строку... выше). - person Rounin; 02.01.2016