Помогите разобраться с условием для if на php

Рейтинг: -1Ответов: 2Опубликовано: 26.02.2023

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

$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)

Ответы

▲ 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, например, но суть одна: не надо логику объединения результата пихать в ифы, еще и вложенные

▲ 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";
}