-1

Доброго времени суток форумчани. Столкнулся с проблемой, помогите пожалуйста решить.
Вот код:

$action = null; //Тип данных по умолчанию
$type = null; //Тип данных по умолчанию
$variation = null; //Тип данных по умолчанию

$action = '$action'; //Тип данных: string, int или null $type = '$type'; //Тип данных: string, int или null $variation = 0; //Тип данных: string, int или null

if ($action) $action = "action:" . $action;

if ($type and $action) $type = "|type:" . $type; elseif ($type) $type = "type:" . $type;

if ($variation and ($type or $action)) $variation = "|variation:" . $variation; elseif ($variation) $variation = "variation:" . $variation;

Вывод: action:$action|type:$type0
Тут теряется слово |variation. Но если $variation равен null или любому значению отличительному от 0, то все Ок.


Пробовал в такой вариации:

if ($variation and ($type or $action))
    $variation = "|variation:" . $variation;
elseif ($variation)
    $variation = "variation:" . $variation;
elseif ($variation == 0)
    if (($type or $action))
        $variation = "|variation:" . $variation;
    else
        $variation = "variation:" . $variation;

Тут же другая проблема, если $action и $type не равны null, а $variation равен ему то: action:$action|type:$type|variation:. Отображается |variation:, но не должен.

Помогите решить проблему. Какое условие необходимо поставить что бы:

  1. Что бы указании всех трёх переменных было так action:$action|type:$type|variation:$variation (даже если одно из них принимает значения 0)
  2. При отсутствии одной из трёх сохранялась концепция, например: action:$action|variation:$variation, action:$action и т.д.

UPD. Проблема именно с логическими выражениями. У меня не получается правильно задать последнее из-за 0, if воспринимает его как bool(false) при выполнении. Но если я меняю условие в if, то он перестает реагировать на другой текст или ведет себя не корректно при отсутствии какого-то значения в $variation.

UPD2. Почему $value_2 не подходит по условию? Была мысль что переменная принимает тип boolean, но при выводе через var_dump его тип int. Вопрос, почему так?

if ($value_1)
    var_dump($value_1); //string(11) "Hello World"

if ($value_2) var_dump($value_2); //Не подходит по условию... else var_dump($value_2); //int(0)

if ($value_3) var_dump($value_3); //int(1)

if ($value_4) var_dump($value_4); //int(2)

Tymofii
  • 100
  • А что это за цирк? Если не секрет... Условия дебажит надо раз не попадает куда надо – InDevX Feb 26 '23 at 19:44
  • @InDevX, эту строку я передаю на другой сервер, но так как не всегда сразу 3 значения передаются, а количество символов в строке ограничено, я решил таким образом сократить их. Так сказать, убрать не используемые. – Tymofii Feb 26 '23 at 20:29
  • @АлексейШиманский, не то. Тут именно проблема с if, не могу правильно указать сравнение для его корректного выполнения. Но за линк спасибо, пригодится. – Tymofii Feb 26 '23 at 20:36

2 Answers2

0

Не надо пытаться писать ифы на все варианты ваших условий. Надо отфильтровать нужное, сложить в массив. А уже потом объединить результат через |.

$data = [];
if ($action) $data[] = "action:{$action}";
if ($type) $data[] = "type:{$type}";
if ($variation) $data[] = "variation:{$variation}";

$result = implode('|', $data);

для произвольного числа переменных, сложить их в массив как ключ-значение и отфильтровать

$data = ['action' => 1, 'type' => 2, 'variation' => 3];    
$filtered = array_filter($data, function($v){ return (bool) $v; });
$result = implode('|',  array_map(function($k, $v){ 
                 return "{$k}:{$v}";
             }, 
             array_keys($filtered), 
             $filtered
          ));

Условия соответственно можно поменять под ваши нужды, если нужны знания 0, например, но суть одна: не надо логику объединения результата пихать в ифы, еще и вложенные

teran
  • 29,377
  • В первом случае такая же проблема как и у меня, при любом значении переменной $variation отличного от 0, все работает ок. Но если $variation равен 0 то он его не определят =( – Tymofii Feb 27 '23 at 12:21
  • @Tymofii так проверьте не if ($variation) а if (!is_null($variation)) например, или какое условие вам необходимо. – teran Feb 27 '23 at 12:33
  • помогло , большое спасибо. Но мне все же интересно, почему if ($variation) при $variation = 0 не работает? – Tymofii Feb 27 '23 at 12:36
  • потому что 0 приводится к булевому false. – teran Feb 27 '23 at 12:50
0

Решение моей проблемы: Создаю массив и делаю проверку по условиям. В конечном результате игнорируются не используемые значения. Так же отсутствует проблема с 0 при котором он воспринимался не как int, а как bool. Отдельноe спасибо teran.

$button = [
    "value" => $action ? "action:$action" : 'null'
];

if ($type) { $button["value"] .= "|type:$type"; }

if (!is_null($variation)) { $button["value"] .= "|variation:$variation"; }

Tymofii
  • 100