Ищу советы по оптимизации следующего куска кода. (Мне нужно избегать ЕСЛИ ПРОСТО) - PullRequest
0 голосов
/ 04 мая 2020

У меня есть JSON файл с около 30 подразделами. Каждый подраздел будет отличаться. Я хотел преобразовать данные внутри него в формат, который я хотел. Код работает отлично. Но я чувствую, что это не оптимизировано на 100%.

Client1Insurance, Client2Insurance, ClientFInsurance, FamilyInsurance, Client1Pension, Client2Pension, ClientFPension, FamilyPension.

Выше приведен пример того, как будет выглядеть JSON. Все вышеперечисленное - это массивы, в которых есть вложенные массивы. Примерно 30 таких массивов.

foreach ($json as $item) {
 if (strpos($crmMapKey, "Insurance")) {
     $returnArray[] = $this->handleInsurance($item);
 } elseif (strpos($crmMapKey, "Pension")) {
    $returnArray[] = $this->handlePension($item);
 } ... continues the comparison till the json ends
}

Мне нужен способ избежать этого длинного сравнения, если я не горжусь сравнениями. Кто-нибудь сможет предложить лучший способ сделать это?

Спасибо.

Ответы [ 2 ]

1 голос
/ 04 мая 2020

Если они названы так же, как показано в вашем коде, то, содержащее Insurance, вызовет handleInsurance, et c. затем просто получите термин и используйте его в вызове метода:

preg_match('/Insurance|Pension/', $crmMapKey, $match);
$returnArray[] = $this->{'handle'.$match[0]}($item);

Если нет, то вы можете использовать массив поиска:

$lookup = ['Insurance' => 'doSomething', 'Pension' => 'doAnotherThing'];
preg_match('/Insurance|Pension/', $crmMapKey, $match);
$returnArray[] = $this->{'handle'.$lookup[$match[0]]}($item);

Или использовать ключи в шаблоне, чтобы вы нужно только изменить массив:

preg_match('/'.implode('|', array_keys($lookup)).'/', $crmMapKey, $match);

switch, о котором я упоминал в комментарии, может быть не лучшим, но работает:

switch(true) {
    case strpos($crmMapKey, "Insurance") !== false;
        $returnArray[] = $this->handleInsurance($item);
        break;

    case strpos($crmMapKey, "Pension") !== false;
        $returnArray[] = $this->handlePension($item);
        break;

    //etc...
}
0 голосов
/ 04 мая 2020

Другим способом было бы вызывать функции на основе переменных.

foreach ($json as $item) {
    $returnArray[] = $crmMapKey($item);
}

function Client1Insurance($item) {
    // Do something in here.
    return $array;
}

function Client2Insurance($item) {
    // Do something in here.
    return $array;
}

Гораздо более элегантный способ выполнения вещей, которые я чувствую.

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