[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: PHP задания для практики
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22
Invis1ble
Вариант номер два
Возможно, более оптимальный по сравнению с предыдущим с точки зрения производительности, а может и нет. Кому не лень - протестируйте
function getAlphabet($pattern) {
return array_filter(
array_map('chr', array_merge(range(65, 90), range(97, 122), range(192, 255))),
function($letter) use ($pattern) { return preg_match('#' . $pattern . '#', $letter); }
);
}


_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

alex12060
1: 0.012677907943726
2: 0.00065302848815918

Хм, не слышал о подобной конструкции:


function($letter) use ($pattern)


Где о ней можно красиво почитать?
Placido
Задачка, найденная на хабре, с которой я провозился четыре дня, а в конечном итоге написал код за полчаса. Ее выложил товарищ, который устраивался на работу в какую-то шведскую компанию php-разработчиком. Изначально на ее решение было отведено 10 минут.

Задание: написать функцию read_conf($filename), которая будет конвертировать конфигурационный файл (текст файла config.txt - ниже) в многомерный массив (ниже в разделе output). Ключи разделены точками (например, session.server.0.host). Функция должна работать также и с более длинными ключами, например, session.save.db.master.host=10.0.0.1

Оригинал задания на английском ниже (свернут).


Задание (на англ.)

Свернутый текст
Write a function, read_conf($filename), that converts the configuration below into a multidimensional array.

The configuration is divided up in rows and each row is divided up by key and value. The key can be multidimensional, and can be from 1...N, in the example below we only have 4 levels, but the solution should be able to work even when adding another row with more key levels: eg. session.save.db.master.host=10.0.0.1

Config.txt
Свернутый текст
id=www
session.timeout=120
session.server.0.host=127.0.0.1
session.server.0.port=1111
session.server.0.id=session1
session.server.1.host=127.0.0.1
session.server.1.port=1111
session.server.1.id=session2
image.width=640
image.height=480
image.watermark.small=wsmall.png
image.watermark.normal=wnormal.png

Output:
Свернутый текст
Array
(
[id] => www
[session] => Array
(
[timeout] => 120
[server] => Array
(
[0] => Array
(
[host] => 127.0.0.1
[port] => 1111
[id] => session1
)

[1] => Array
(
[host] => 127.0.0.1
[port] => 1111
[id] => session2
)

)

)

[image] => Array
(
[width] => 640
[height] => 480
[watermark] => Array
(
[small] => wsmall.png
[normal] => wnormal.png
)

)

)

Winston
Цитата (alex12060 @ 12.10.2011 - 06:32)
Где о ней можно красиво почитать?

Это лямбда-функции (также еще называются замыкания). Но они появились только в PHP 5.3
Invis1ble
alex12060
Да, это замыкание. И да, фича доступна с версии 5.3.
Почитать можно например в википедии или на хабре.

PS. Спасибо за тест.

PPS. Вот, еще нашел статью - http://www.ibm.com/developerworks/ru/library/os-php-5.3new2/ - вроде неплохая

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

Winston
Invis1ble
У тебя не отработает такой шаблон [а-я], в юникоде :)
Мое решение :)
function foo($pattern)
{
return array_filter(
array_map(function($item) {return iconv("WINDOWS-1251", "UTF-8//IGNORE", chr($item));}, range(65, 255)),
function($item) use ($pattern){return preg_match('#'.$pattern.'#u', $item);}
);
}
echo '<pre>'.print_r(foo('[А-я]'), 1).'</pre>';

Для шаблона [А-я] время
0.00146007537842



Спустя 2 минуты, 11 секунд Winston написал(а):
Цитата (Invis1ble @ 12.10.2011 - 16:06)
Вот, еще нашел статью - http://www.ibm.com/developerworks/ru/library/os-php-5.3new2/ - вроде неплохая

Тоже когда-то читал эту статью, довольно хорошо описано :)
Invis1ble
Цитата
У тебя не отработает такой шаблон [а-я], в юникоде smile.gif

это понятно, ибо в utf-8 коды у кириллицы другие smile.gif

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

Winston
Цитата (Invis1ble @ 12.10.2011 - 18:37)
это понятно, ибо в utf-8 коды у кириллицы другие

А переделать, чтобы нормально работало? smile.gif
Invis1ble
Winston
Легко :)
Универсальное решение ("в лоб")
function getAlphabet($pattern) {
return array_filter(
array(
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b',
'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'А', 'Б', 'В', 'Г',
'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р',
'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю',
'Я', 'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л',
'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ',
'ъ', 'ы', 'ь', 'э', 'ю', 'я'),
function($letter) use ($pattern) { return preg_match('#' . $pattern . '#', $letter); }
);
}


_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.