ФорумПрограммированиеPHP для идиотов → разминка для мозга

разминка для мозга

  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 21 августа 2008 г. 17:05

    задачка

    есть три вида правдивых утверждений (bool)true, (int)1, (string)on
    нужно написать функцию которая сравнит любую переменную с этими утверждениями и выдасть true или false
    пример
    $var===true

    усложняем условие
    поиск должен быть регистронезависимым
    preg_match("/[on]/i",$var)

    еще усложняем
    как извесно
    0x1===1 //(16ричная система) 
    01===1 //(8ричная система)

    но работать должно только в 10ричной

    еще усложняем
    "\x6f\x6e"==="on"

    utf8 не катит

    я надеюсь все поняли что два последних условия делают невозможным использование in_array() и array_search()
    вобщем кто предложит самое быстрое и самое короткое, желательно в одну строку, решение тот победил


  • kendo

    Сообщения: 446 Репутация: N Группа: Адекваты

    Spritz 22 августа 2008 г. 2:13, спустя 9 часов 7 минут 46 секунд

    В чем проблема-то?
    function eq($var) {
    return ($var === true) || ($var === 1) || (strtolower($var) == "on");
    }

    Или я что-то недопонял?
  • kendo

    Сообщения: 446 Репутация: N Группа: Адекваты

    Spritz 22 августа 2008 г. 2:24, спустя 11 минут 14 секунд

    Хах, кажется понял, где подкол…
    Т.е. имеется ввиду, что строка "\x6f\x6e" не катит и 01 и 0x1 тоже не катит? Если так, то я не фтыкаю ,как енто сделать, ведь все равно "\x6f\x6e" преобразовывается в строку и числа из други систем в десятериные.
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 22 августа 2008 г. 2:41, спустя 17 минут 13 секунд

    ваще моск апух вчера
    ну типа есть функция в последних снапшотах is_unicode
    ей можно проверить "\x6f\x6e" но ее нет еще в 5,2
    но вот как определить в какой системе находяться числа я ваще не отстреливаю
  • Timur

    Сообщения: 1068 Репутация: N Группа: Джедаи

    Spritz 22 августа 2008 г. 12:17, спустя 9 часов 36 минут 27 секунд

    Я наверно тоже че-то не догоняю, но если аргумент в виде числа - то какая разница, в каком оно формате - 8-ричном, 16-ричном или 10-чном?
    А если аргумент в функцию передаётся в виде строки, то можно элементарно проверять первые символы (0 или 0x):
    [tt]десятичные : [1-9][0-9]*
    | 0
    шестнадцатеричные : 0[xX][0-9a-fA-F]+
    восьмеричные : 0[0-7]+[/tt]


    откуда такая задача?
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 22 августа 2008 г. 12:35, спустя 17 минут 5 секунд

    задача из моей больной головы

    к сожалению нет способа основу числа 8/10/16
    но функция in_array("01",array(1)) выдаст ТРУ , а это не рпавильно
  • Timur

    Сообщения: 1068 Репутация: N Группа: Джедаи

    Spritz 22 августа 2008 г. 18:01, спустя 5 часов 26 минут 35 секунд

    но функция in_array("01",array(1)) выдаст ТРУ , а это не рпавильно

    спорно =) "0x1 и "01" это вроде всего лишь стандарт из Си, но как быть, если к примеру у тебя csv-файл, где в одном из столбцов числа представлены с ведущими нулями? Просто в PHP преобразование строк в числа сделано так, как это сделал бы человек. И взято это, видимо, из того же Си:
    …Более подробную информацию об этом преобразовании смотрите в разделе о strtod(3) документации Unix…


    А что бы ситуация [tt]in_array("010", array(10))[/tt] не выдавала [tt]true[/tt], можно воспользоваться третьим аргументом, делающим сравнение строгим.
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 22 августа 2008 г. 18:20, спустя 19 минут 1 секунду

    как быть, если к примеру у тебя csv-файл, где в одном из столбцов числа представлены с ведущими нулями

    это строки, строки стравниваються со строками

    представь что у тебя есть две строки "10" и "010" при этом первая равно инту 10 а вторая нет, а вобще 10 это плохой пример потому что эо переход через десяток в восьмиричной системе

    дело в том что я спецально брал 1 потому что большее число можно привести к основанию два ? перевести в строку и сравнить, разница будет, а с единицей разницы нет, она во всех системах единица

    А что бы ситуация in_array("010", array(10)) не выдавала true, можно воспользоваться третьим аргументом, делающим сравнение строгим.


    in_array("10", array(10), true)

    в этом варианте тоже фолс будет а должно быть тру

Пожалуйста, авторизуйтесь, чтобы написать комментарий!