За последние 24 часа нас посетили 27584 программиста и 1492 робота. Сейчас ищут 906 программистов ...

как вычислить выражение

Тема в разделе "PHP для новичков", создана пользователем oleg_, 2 мар 2017.

  1. oleg_

    oleg_ Активный пользователь

    С нами с:
    28 ноя 2012
    Сообщения:
    108
    Симпатии:
    2
    Всем привет
    подскажите, никак не допру:
    вот простое выражение "true and false or false".
    получается оно в цикле
    true
    and
    false
    or
    false
    как получить итоговый результат?
     
  2. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    and требует одновременно чтобы все были true
    or
    ничего не требует и хватит одного true после любого or
     
  4. oleg_

    oleg_ Активный пользователь

    С нами с:
    28 ноя 2012
    Сообщения:
    108
    Симпатии:
    2
    это все понятно, в уме не проблема сделать, а как на php реализовать?
     
  5. Sergey_Tsarev

    Sergey_Tsarev Активный пользователь

    С нами с:
    17 мар 2016
    Сообщения:
    502
    Симпатии:
    105
    Как говорит Ноггано: "Если я с кем-то, за что-то тру, то никакого фуфла тут, только true!"
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Чего реализовать?
     
  7. oleg_

    oleg_ Активный пользователь

    С нами с:
    28 ноя 2012
    Сообщения:
    108
    Симпатии:
    2
    вот идет цикл
    $a.=true
    $a.=and
    $a.=false
    $a.=or
    $a.=false

    получилось $a=trueandfalseorfalse;
    надо вычислить выражение, что бы $a=false(результат); или true в зависимости что там будет.
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    блин, а что за задачу ты пытаешься решить таким причудливым образом?
     
  9. oleg_

    oleg_ Активный пользователь

    С нами с:
    28 ноя 2012
    Сообщения:
    108
    Симпатии:
    2
    коротко:
    цикл проходит таблицу, строку за строкой, сверяя нужную ячейку с заданными условиями, коих может быть от 1 до нескольких (3-5 штук).
    к примеру (Статус = Принято И Статус = Оплачен ИЛИ Статус = Отгружен) - это просто пример.
    Если находится совпадение с условием - возвращается true если нет false
    на выходе получается выше описанный массив ответов. В зависимости от конечного результата заданная ячейка подсвечивается заданным цветом.
     
  10. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Как может быть одновременно два статуса?
    Код (Text):
    1. Статус = Принято И Статус = Оплачен
     
  11. oleg_

    oleg_ Активный пользователь

    С нами с:
    28 ноя 2012
    Сообщения:
    108
    Симпатии:
    2
    на это вопрос там есть ответ - это просто пример....
    так просто легче обдумывать, понятно что первое условие всегда будет false
     
  12. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    @oleg_ может тебе нужен приоритет операций как в математики? (10 - 2) * 3
     
  13. oleg_

    oleg_ Активный пользователь

    С нами с:
    28 ноя 2012
    Сообщения:
    108
    Симпатии:
    2
    Да нет, приоритет там правильный and вперед or выполняется.
    мне надо просто вычислить выражение
    Пример: полученные ответы
    1 && 0 || 0
    если вычислить это выражение получится 0 , так как 1&&0 равно 0 и 0||0 равно 0.
    но как это сделать на практике?
    да же так
    Код (Text):
    1. $ry='(1 && 0 || 0)';
    2. eval("\$ry = \"$ry\";");
    на выходе
    (1 && 0 || 0)
    то-есть, условные операторы воспринимаются как просто символы, а не как условные операторы.
    Постоянно натыкаюсь на проблему как вытащить оператор из (строки,базы,формы), такое ощущение что я просто не знаю "best way" для такой операции.
     
    #13 oleg_, 2 мар 2017
    Последнее редактирование: 2 мар 2017
  14. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    @oleg_ лучше опиши задачу которую хочешь решить, входящие данные, результат который хочешь получить, формат и структура данных
     
    #14 denis01, 2 мар 2017
    Последнее редактирование: 2 мар 2017
  15. oleg_

    oleg_ Активный пользователь

    С нами с:
    28 ноя 2012
    Сообщения:
    108
    Симпатии:
    2
    так я уже все описал, даже не знаю что добавить...
    еще раз:
    в цикле перебирается таблица, в ходе перебора, содержимое ячеек сравнивается с условием:
    (Статус = Принято И Статус = Оплачен ИЛИ Статус = Отгружен)
    если в ячейке "статус" встретится например "оплачен" то ответ будет 1. Но, условий 3 штуки...(Статус = Принято)--(Статус = Оплачен)--(Статус = Отгружен)
    соответственно ответов будет 3...
    и между ними еще условные операторы
    0 (Статус = Принято)
    and И
    1 (Статус = Оплачен)
    or ИЛИ
    0 (Статус = Отгружен)
    надо вычислить результат из полученного выражения 0 and 1 or 0
    если результат 0 ячейка не изменяется, если 1 подсвечивается.
     
  16. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Как три если И считается за один вариант, булева логика посмотри

    таблица для И
    true true = true
    false false = false
    true false = false
    false true = false
    --- Добавлено ---
    Вот тут вроде все таблички http://www.mir-koda.ru/full_leson.php?id=7
     
  17. oleg_

    oleg_ Активный пользователь

    С нами с:
    28 ноя 2012
    Сообщения:
    108
    Симпатии:
    2
    еще раз:
    $a. = 1 проход цикла - (сравнивает)-записываем 0
    $a. = 2 проход цикла - "служебный" записываем and
    $a. = 3 проход цикла - (сравнивает)-записываем1
    $a. = 4 проход цикла - "служебный" записываем or
    $a. = 5 проход цикла - (сравнивает)-записываем 0
    на выходе $a= 0and1or0; - что можно с этим сделать?
     
  18. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    Если я здесь (в дурке), значит у меня не все дома.
    Если я здесь, значит не все, сто пудово.
    А дома те, у кого все.
    Но рас меня нет, значит и у них не все...

    :D
     
    Sergey_Tsarev нравится это.
  19. oleg_

    oleg_ Активный пользователь

    С нами с:
    28 ноя 2012
    Сообщения:
    108
    Симпатии:
    2
    TeslaFeo мне без разницы что у тебя не все дома, хвались этим в других темах
     
  20. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    нужно это посчитать?
     
  21. oleg_

    oleg_ Активный пользователь

    С нами с:
    28 ноя 2012
    Сообщения:
    108
    Симпатии:
    2
    да просто посчитать, но не в уме, а в коде!
     
  22. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Напиши парсер этого выражения и посчитай, просто очень странно зачем такое делать.

    Или так
    PHP:
    1. <?php
    2. eval('$r = ( 0 && 1 || 0);');
     
  23. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    А зачем eval-ы??
    PHP:
    1. var_dump(false && true || false); //bool(false)
    Логическое выражение это выражение же. Оно считается как выражение. Только операторы и операнды не как в математическом.

    И в БД логические флаги надо держать не в строковом представлении, а как BOOLEAN.
     
  24. oleg_

    oleg_ Активный пользователь

    С нами с:
    28 ноя 2012
    Сообщения:
    108
    Симпатии:
    2
    Код (Text):
    1. $r = ( 0 && 1 || 0)
    так оно и без eval работает
    а вот так
    Код (Text):
    1. $ry = '(0 && 1 || 1)';
    2.         eval('$r = $ry;');
    уже не работает, а из цикла именно строка получается
    --- Добавлено ---
    хорошо бы так, но из цикла операторы приходят в виде строки... В этом и загвоздка, как из строки оператор получить
    --- Добавлено ---
    Код (Text):
    1. eval('$r = $ry;');
    2.   var_dump($r);
    3.  
    4. string '1 and 0 or 0' (length=12)
     
  25. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Их не в строку надо записывать, а считать сразу
    --- Добавлено ---
    Как вариант массив значений:
    $arr = ['true' => true, 'false' => false];