В конкретном состоянии установить и сохранить переменную до другого конкретного условия

Здравствуйте, я довольно новичок в программировании. Мне нужно решить эту проблему в php, но решение на любом другом языке будет отличным. Я попытался решить это с помощью оператора if, но если условие изменилось, переменная исчезла. Простой пример для лучшего понимания.

// possible conditions ( 'cond1', 'cond2', 'cond3', 'cond4','cond5' )
// conditions can be called randomly

Я хотел бы иметь что-то вроде этого:

$variable = 'off';
since ( $condition == 'cond2' )
    $variable = 'on';
until ( $condition == 'cond4' )

Цель состоит в том, чтобы переключить переменную "on" в состояние "cond2" и удерживать ее, когда другие условия изменяются независимо от их порядка, до тех пор, пока условие не изменится на "cond4" и переменная не переключится обратно на "off".

Спасибо за любые предложения.

1 ответ

Я не думаю, что ваша текущая концепция реализуема в PHP, поскольку вы не можете прослушивать переменные, вам нужно активно получать уведомления. Таким образом, один сценарий с тем же решением, но другой концепцией будет

class Condition {

    private $value;
    private $variable = false;

    public function setCondition($new_value) {
        $this->value = $new_value;
    }

    public function getCondition() {
        return $this->value;
    }

    public function isVariableSet() {
        return ($this->variable === true); //TRUE  if $this->variable is true
                                           //FALSE otherwise
    }

}

Теперь в методе setCondition(...) вы можете слушать и активно устанавливать variable,

    public function setCondition($new_value) {
        switch ($new_value) {
            case 'cond2':
                $this->variable = true;
                break;
            case 'cond4':
                $this->variable = false;
                break;
        }
        $this->value = $new_value;
    }

С этим вы можете использовать его следующим образом

$foo = new Condition();
$foo->setCondition('cond1');
var_dump( $foo->isVariableSet() ); //FALSE

$foo->setCondition('cond2');
var_dump( $foo->isVariableSet() ); //TRUE

$foo->setCondition('cond3');
var_dump( $foo->isVariableSet() ); //TRUE

$foo->setCondition('cond4');
var_dump( $foo->isVariableSet() ); //FALSE

Или в вашем случае:

$conditions = array( 'cond1', 'cond2', 'cond3', 'cond4','cond5' );

$cond = new Condition();
foreach ($conditions as $i => $condition) {
    $cond->setCondition($condition);
    if ($cond->isVariableSet() == true) {
        $toggle = 'on';
    }
    else {
        $toggle = 'off';
    }
    $results[$condition] = $toggle.' ;  ';
}

Если вы не создаете экземпляр Condition вне цикла вы ничего не получите, поскольку каждый раз создаете новый объект, и состояние не сохраняется. Однако именно это и требуется.

Вы также можете сделать это через array_map() и сохранить foreach()

$conditions = array( 'cond1', 'cond2', 'cond3', 'cond4','cond5' );

$cond = new Condition();
$results = array();

$setCondGetVariable = function($condition) use($cond) {
    $cond->setCondition($condition);
    if ($cond->isVariableSet() == true) {
        $toggle = 'on';
    }
    else {
        $toggle = 'off';
    }
    return $toggle.' ;  ';
};

$results = array_map($setCondGetVariable, $conditions);
Другие вопросы по тегам