Помогите разобраться с условием для if на php
Доброго времени суток форумчани. Столкнулся с проблемой, помогите пожалуйста решить.
Вот код:
$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:, но не должен.
Помогите решить проблему. Какое условие необходимо поставить что бы:
- Что бы указании всех трёх переменных было так
action:$action|type:$type|variation:$variation(даже если одно из них принимает значения 0) - При отсутствии одной из трёх сохранялась концепция, например:
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)
Ответы (2 шт):
Не надо пытаться писать ифы на все варианты ваших условий. Надо отфильтровать нужное, сложить в массив. А уже потом объединить результат через |.
$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 при котором он воспринимался не как int, а как bool. Отдельноe спасибо teran.
$button = [
"value" => $action ? "action:$action" : 'null'
];
if ($type) {
$button["value"] .= "|type:$type";
}
if (!is_null($variation)) {
$button["value"] .= "|variation:$variation";
}