создать таблицу истинности в php (И / ИЛИ)

#php

#php

Вопрос:

у меня есть массив, содержащий значение типа

 Array
(
    [0] = true
    [1] = OR
    [2] = true
    [3] = AND
    [4] = false
    [5] = AND
    [6] = true
)
  

я хочу создать таблицу истинности в php, например

 true OR true = result1
result1 AND false = result2
result2 AND true = result3
  

я тупой и пока не умею создавать. 🙁

вот мой код

 foreach( $arrValue as $val  )
{
     if(!empty($val))
     {
    if($val=='true')
        $p = true;
    elseif($val=='false')
        $p = false;

    if(isset($p))
    {
            if(isset($result))
        {
             if($val=='AND')
             $result = $result AND $p;                      
        elseif($val=='OR')
             $$result = $result or $p;              

        }
       else
        $result = $p;
    }           
    }
}
  

пожалуйста, помогите этому глупому мальчику получить результаты.

Комментарии:

1. Я уверен, что битовые маски были бы лучшим решением для этого!

2. @saint: Вы имеете в виду en.wikipedia.org/wiki/Karnaugh_map ? Пожалуйста, уточните свой вопрос!?

3. @epitaph: en.wikipedia.org/wiki/Truth_table — Игнорируйте комментарии к битовым маскам, думал, мы говорим о чем-то другом

4. @Robert: Я не знал, что таблицу истинности можно создать с помощью двоичного кода. Помогло ли это найти условие гонки или минимальный срок? Какова святая цель создания таблицы истинности?

5. @epitaph: Я создаю процесс, который автоматически генерирует некоторые результаты и сохраняет их в db. в процессе результаты объединяются друг с другом с некоторым условием И / ИЛИ для описания наилучшего решения. я сохранил все результаты в массиве с помощью operator, как я показал в array выше. существует несколько решений. для достижения единого решения я объединил результаты и применил таблицу истинности.

Ответ №1:

вы думали о создании таблицы истинности с обратными вызовами, например:

 $table = array();

$table[] = array(
    'name' => 'equals',
    'call' => 'check_equals'
);

$table[] = array(
    'name' => 'or',
    'call' => 'check_or'
);

$myData = array(
    true => true,
    false => true,
    true => false,
    true => -1,
)


foreach($myData as $first => $second)
{
     foreach($table as $check)
     {
         echo $check['name'] . call_user_func($check['call'],$first,$second) ? 'good' : 'bad';
     }
}
  

adn затем просто создайте свои обратные вызовы следующим образом:

 function check_or($f1,$f2)
{
    return $f1 || $f2;
}

function check_equals($f1,$f2)
{
    return $f1 === $f2;
}
  

Ответ №2:

Это то, что я хочу.

 //( [0] => true [1] => OR [2] => true [3] => AND [4] => false [5] => AND [6] => true)

function boolstr($val) {
    if($val=='true')
        return true;
    elseif($val=='false')
        return false;
}


function row_operator($arrValue){
    $i=-2; $j=-1;
    foreach( $arrValue as $val  )
    {
        if($i 3 > count($arrValue)) break;
        $boolste = boolstr($arrValue[$i 2]);
        if(isset($res))
        {
            if($arrValue[$j 2]=='AND')
                $res = $res amp;amp; $boolste;
            elseif($arrValue[$j 2]=='OR')           
                $res = $res || $boolste;            

            if($res==true)
                $a='true';
            else $a= 'false';
                $j  = 2;
        }
        else
            $res = $boolste;

        $i  = 2;
    }
    return $res;
}