Правильное построение условий php

311
19 августа 2021, 16:20

Как правильно построить большие условия проверки?

Например код:

if ($test['status'] == 1) {
  if ($test['id'] == 2) {
    if ($test['user'] == 4) {
      if ($test['auth'] == true) {
        if ($test['map'] == 'russia') {
          if ($test['name'] == 'john') {
            $result = 1;
          } else {
            $result = 2;
          }
        } else {
          $result = 2;
        }
      } else {
        $result = 2;
      }
    } else {
      $result = 2;
    }
  } else {
    $result = 2;
  }
} else {
  $result = 0;
}

Выглядит не очень, читается плохо и если условий больше то код превращается в ёлку.

Как правильно формировать массивные условия проверки и для каждого присваивать некий результат, то есть избегать OR условий?

Answer 1
$check = [ 
         'status' => ['v' => 1,  'false' => 0],
         'id'     => ['v' => 2,  'false' => 2],             
         'user'   => ['v' => 4,  'false' => 2],
         'auth'   => ['v' => true,  'false' => 2],
         'map'    => ['v' => 'russia',  'false' => 2],
         'name'   => ['v' => 'john',    'false' => 2, 'true' => 1],
    ];
$doCheck = function($test) use ($check){
               foreach($check as $field => $opts){
                   if( $test[$field] !== $opts['v']) return $opts['false'];
               }
               return $opts['true'];
            };

можно еще вместо строковых ключей 'true/false' использовать сами занчения true/false или индексы 0\1, и в итоге массив будет вида 'name' => [2, 1, 'v' => 'jonh'] но это будет менее понятно и наглядно.

Answer 2

https://ideone.com/S2wqPb

<?php
function test($obj) {
  $checks = [
    ['status',   1,          0],
    ['id',       2,          2],
    ['user',     4,          3],
    ['auth',     true,       4],
    ['map',      'russia',   5],
    ['name',     'john',     6],
  ];
  foreach ($checks as $check) {
    if ($obj[$check[0]] != $check[1]) {
      return $check[2];
    }
  }
  return 1;
}
echo test([status => 1, id => 2, user => 7]);

Стоило бы сделать массив объектов или словарей вместо двумерного массива, но мне лень.

Answer 3

Как вариант

if ($test['status'] == 1) {
  if (
    $test['id'] == 2 &&
    $test['user'] == 4 &&
    $test['auth'] &&
    $test['map'] === 'russia' &&
    $test['name'] === 'john'
  ) {
    $result = 1;
  } else {
    $result = 2;
  }
} else {
  $result = 0;
}

Второй вариант

function getRes($test) {
  if ($test['status'] != 1) {
    return 0;
  }
  if (
    $test['id'] == 2 &&
    $test['user'] == 4 &&
    $test['auth'] &&
    $test['map'] === 'russia' &&
    $test['name'] === 'john'
  ) {
    return 1;
  }
  return 2
}
$result = getRes($test);
READ ALSO
Идея по выводу переменной из цикла

Идея по выводу переменной из цикла

Мой вопрос заключается в том, чтоб из цикла foreach вывести переменную marks в массив dataPoints в отметки здесь

180
Вызов метода при создании экземпляра класса

Вызов метода при создании экземпляра класса

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

86
Каждый элемент одного ключа массива соответствует каждому элементу других ключей массива

Каждый элемент одного ключа массива соответствует каждому элементу других ключей массива

уже второй день голову ломаю как решить данную проблемуПоиск к сожалению ничего не дает (может ищу неправильно)

131