Это копия, сохраненная 6 августа 2014 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Это тред для начинающих. Не написал за свою жизнь ни одной программы? Ты наш человек.
Требуемые знания: умение читать. Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Netbeans PHP или PhpStorm (необязательно).
Предыдущий тред был тут: >>360846
У нас есть первые уроки по PHP, они собраны и выложены по адресу http://archive-ipq-co.narod.ru Если ты ньюфаг, просто решай задачки оттуда, они там реально простые, и пости сюда ссылки на решения, мы посмотрим и скажем, правильно или нет и дадим совет, если можно что-то улучшить. Если не совсем ньюфаг, напиши, что ты знаешь, что нет, что хочешь изучить, я дам тебе какую-нибудь задачку посложнее. После прохождения учебника напиши, ОП даст тебе более сложные задания.
Правила: ведем себя воспитанно, помогаем новичкам, постим ссылки на решения задачек, ОП их проверяет и дает советы и замечания.
ОП, как всегда, помогает и дает советы, отвечает на самые нубские и простые вопросы. У ОПа есть почта, так что даже если он не появляется в треде уже неделю, вы всегда можете написать ему что-то хорошее.
Оформляй код аккуратно!!! например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492
Что почитать?
Мануал по PHP — http://www.php.net/manual/ru/langref.php
Начинающим: Никсон Р. - Создаем динамические веб-сайты с помощью PHP (аноны говорят, она не очень хорошая)
Сайт phptherightway
По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
JS: learn.javascript.ru
Позиционирование в CSS: http://softwaremaniacs.org/blog/category/primer/ (снизу вверх).
MySQL: https://gist.github.com/codedokode/10539213
Слишком простые задачи? Напиши что знаешь, что хочешь изучить и придумаем тебе задачку посложнее.
Сайт опять упал!!!!! Не паникуй, а открой http://rghost.net/45000175
Где архивы предыдущих тредов? Известно, где, на mediafire: http://www.mediafire.com/download/gza5360wdzqd743/threads-archive-pr-1..17.zip (189Мб, треды 1-17 из pr), http://www.mediafire.com/download/kgzl1f9366gc6ed/threads-archive-11..20.zip (72 Мб, треды 11-20 из b). Также один анон выложил все на дропбокс: https://www.dropbox.com/sh/4sb69jrx9qwrpcw/-nY5ia__VC (ок, он иногда не работает)
Как начать пользоваться командной строкой — gist.github.com/anonymous/9378956452c8e4a72ac8
Если я решу твой учебник, я смогу легко устроиться на работу и стать старшим программистом в мои 23? Нет. Учебник — лишь первый шаг в начале пути. Информация о фрилансе есть в /wrk
В общем, давайте начинать уже!
Как и чем отформатировать код
Очень важно писать код не как попало, а аккуратно, как принято. Почему? Ну потому, что другой человек, который будет смотреть твой код, вряд ли обрадуется, когда ему придется разбирать слипшиеся строчки, разбросанные в беспорядке скобки и написанные русскими словами названия переменных. Особенно плохо будет если это, например, код тестового задания, которое ты сделал, чтобы устроиться на работу. Ты же не хочешь, чтобы тебя называли быдлокодером?
Не бойся, сделать код аккуратным совсем не сложно. Самый универсальный способ — вставить его на сайт http://phpformatter.com и нажать кнопку Format. Робот сам выровняет твой код в лучших традициях.
Если ты используешь для редактирования кода IDE, то все еще проще (а если не используешь, то почему бы не начать?):
- Eclipse PDT — жми Ctrl + Shift + F для автоматического форматирования кода.
- Netbeans for PHP — жми Alt+Shift+F
- Zend Studio — жми Ctrl + A (выделить все), затем Ctrl + Shift + F
- PhpStorm — жми Ctrl+Alt+L
- PHPDesigner — поищи нужную опцию в меню, она там есть. Или жми Ctrl + Shift + F1
- Komodo IDE — правая кнопка -> Format Using...
Вот так, нажатием одной кнопки ты можешь сделать жизнь гораздо проще.
Как видишь, c IDE жизнь может быть намного проще (еще в них есть автодополнение, автоматическая проверка кода и подсветка ошибок, навигация по файлам и функциям и много чего еще).
Основные правила
Если ты вдруг решил выровнять код вручную, запомни эти правила:
- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults()
- название функции начинается с глагола, в стиле «сделайЧтоТо»
- не знаешь английский (неужели такое бывает?) Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт или slovari.yandex.ru и найди название для переменной там
- в именах классов используется CamelCase, первая буква большая, «_» может использоваться
- мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо
- мы используем для отступов 4 пробела, а не табы (нужно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)
скобки в for и if/else ставятся так (египетские скобки):
if (...) {
// ...
} else {
// ...
}
for (...) {
// .....
}
у определений функций и классов так:
function bakeCookies(...)
{
// ...
}
Официальные ссылки
В PHP есть система стандартов с названием PSR. Вот стандарты, относящиеся к оформлению кода:
http://www.php-fig.org/psr/psr-1/
http://www.php-fig.org/psr/psr-2/
Как и чем отформатировать код
Очень важно писать код не как попало, а аккуратно, как принято. Почему? Ну потому, что другой человек, который будет смотреть твой код, вряд ли обрадуется, когда ему придется разбирать слипшиеся строчки, разбросанные в беспорядке скобки и написанные русскими словами названия переменных. Особенно плохо будет если это, например, код тестового задания, которое ты сделал, чтобы устроиться на работу. Ты же не хочешь, чтобы тебя называли быдлокодером?
Не бойся, сделать код аккуратным совсем не сложно. Самый универсальный способ — вставить его на сайт http://phpformatter.com и нажать кнопку Format. Робот сам выровняет твой код в лучших традициях.
Если ты используешь для редактирования кода IDE, то все еще проще (а если не используешь, то почему бы не начать?):
- Eclipse PDT — жми Ctrl + Shift + F для автоматического форматирования кода.
- Netbeans for PHP — жми Alt+Shift+F
- Zend Studio — жми Ctrl + A (выделить все), затем Ctrl + Shift + F
- PhpStorm — жми Ctrl+Alt+L
- PHPDesigner — поищи нужную опцию в меню, она там есть. Или жми Ctrl + Shift + F1
- Komodo IDE — правая кнопка -> Format Using...
Вот так, нажатием одной кнопки ты можешь сделать жизнь гораздо проще.
Как видишь, c IDE жизнь может быть намного проще (еще в них есть автодополнение, автоматическая проверка кода и подсветка ошибок, навигация по файлам и функциям и много чего еще).
Основные правила
Если ты вдруг решил выровнять код вручную, запомни эти правила:
- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults()
- название функции начинается с глагола, в стиле «сделайЧтоТо»
- не знаешь английский (неужели такое бывает?) Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт или slovari.yandex.ru и найди название для переменной там
- в именах классов используется CamelCase, первая буква большая, «_» может использоваться
- мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо
- мы используем для отступов 4 пробела, а не табы (нужно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)
скобки в for и if/else ставятся так (египетские скобки):
if (...) {
// ...
} else {
// ...
}
for (...) {
// .....
}
у определений функций и классов так:
function bakeCookies(...)
{
// ...
}
Официальные ссылки
В PHP есть система стандартов с названием PSR. Вот стандарты, относящиеся к оформлению кода:
http://www.php-fig.org/psr/psr-1/
http://www.php-fig.org/psr/psr-2/
Как вернуть все предложения, а не только последнее? Так вроде всё работает.
http://ideone.com/BjdLxX
Ну я вообще по другому реализовал, но в твоем случае надо либо собирать в массив все строки, который потом склеивать с помощью implode(но я так не стал делать, поскольку будут трудности в случае если предложения будут разделятся чем то кроме точки, в задании этого нет, но все же), либо же с помощью склейки строк. В общем твоя проблема в том что твоя функция возвращает не весь исправленный текст, а только последнее предложение, следовательно правь функцию.
Судя по старым тредам, оп-хуй какой-то старый неосилятор-велосипедописатель, а я такое быдло стараюсь избегать
Как сделать так, чтобы если я нажал на DIV одного класса, то рамка нажатого дива изменилась до того момента, как я нажму на другой DIV этого же класса.
Или картинка в диве какая-нибудь появлялась, типа галочки.
Как такое сделать? Я в js ньюфаг.
Это через css можно. Гугли радиокнопки.
Этот >>365713 анон прав. Поставь в функции после
$result = $firstLetter . $otherPart;
строку var_dump($result); и посмотри что там хранится.
>>365693
> Если изначально шефа указывать строкой, а не массивом, то придется снова прописывать
Передавать массив ради одного шефа абсолютно нелогично (массив подразумевает что у нас может быть много объектов, а не один объект). Нельзя ради какой-то сторонней функции-фабрики ломать логику.
Шефа можно создавать либо без фабрики, либо сделать функцию-фабрику, создающую ровно одного персонажа.
var_dump, print_r и прочее конечно круто. Но я бы посоветовал работать в ide к которой прикрутить xdebug. Я лично юзаю php storm+xdebug+openserver. С помощью xdebug можно и пошагово выполнять, видя что и где в данный момент хранится и даже с помощью спец закладок перехватывать отправленные из браузера данные что бы протестировать работу формы и т.д.
Твое решение один в один напоминает вот это: http://ideone.com/NefnLu Или ты один и тот же анон? Если нет, то очевидно что ты списал.
> $clause = preg_replace('/^ */', '', $clause);
Есть функции trim, ltrim, rtrim для этого
> $clause = preg_replace('/^.(.+)/ui', "$firstLetter$1", $clause);
Тут не нужны регулярки, конец строки проще получить через mb_substr. Более того, если в $firstLetter окажется символ \ то он может экранировать $1 и подстановка не проихзойдет — не очень-то надежно.
Вот пример с бекслешем перед $: http://ideone.com/OBpwfx — замена $1 на исходный текст не происходит.
> $text = str_replace($clauses[$key], $clause, $text);
Это лишнее усложнение, зачем что-то заменять, когда мы можем просто добавлять обработанное предложение в итоговую строку:
$result .= $text;
Эмм, вообще то это я ему еще совет дал по поводу того, что у него возвращается только последнее предложение.
Мамой клянусь, все сам писал, да и мой код работает получше. + я не храню регулярки используемые 1 раз в переменных
> $text = str_replace($clauses[$key], $clause, $text);
Это сделано с целью сохранить разные знаки препинания !?. Так как в процессе обработки текста мы их теряем.
Самые простые (тем не менее позволяют выявить ошибки в понимании, потому всем советую их) — в конце этой страницы: http://archive-ipq-co.narod.ru/l1/reading-list.html
Задача посложнее: дана страница с текстом, в котором присутствуют ссылки (тег <a>). Сделай средствами CSS3 и анимаций сделай черные плавно высплывающие подсказки с адресом ссылки при наведении на нее мыши. Если ссылка содержит аттрибут target="_blank" то в подсказке должно быть написано [^] перед адресом, например:
[^] http://exaple.com/
Еще задача:
Сделать кастомные радиокнопки и чекбоксы.
Кастомные — значит нестандартно выглядящие.
Радиокнопка — это круглая штука, из группы радиокнопок можно включить только одну.
Чекбокс — квадратик, в котором можно включать и выключать галочку.
Пример: http://jsfiddle.net/bv6fB/1/
Открой ссылку http://getbootstrap.com/components/#btn-groups-single . Видишь, там группа из 3 кнопок (left/middle/right), которые переключаются при нажатии? Нужно сделать такое же только без яваскрипта, на CSS3. То есть надо сделать чтобы круглые радиокнопки выглядели нестандартно.
Естественно, кнопок может быть и не 3, а 2, 4, 6, 10, 20 и так далее.
Внешний вид кнопок, можешь скопировать либо отсюда: http://jsfiddle.net/viralpatel/p499h/embedded/result/ (в код не смотри, просто понажимай и посмотри как работает) либо со страницы по ссылке выше, какой больше нравится.
Вторая часть задания — сделать кастомный чекбокс. Чекбокс — это такой квадратик, в котором при клике появляется и исчезает галочка.
Надо средствами CSS сделать, чтобы чекбокс выглядел так: http://jsfiddle.net/Ft73h/embedded/result/
Можно добавлять дополнительную html-разметку, если надо, но не слишком много.
Бонус: сделай табы (вкладки) на css3, пример: http://inferusvv.ru/demo/tabs/index.html
Задача посложнее: дана страница с текстом и попап (всплывающее окошко) неизвестного размера, который должен выводиться поверх текста. Отцентрируй его вертикально и горизонтально на странице средствами CSS.
Задача на верстку: сверстать макет http://rghost.ru/56603419
Код удобно постить на codepen, jsfiddle, jsbin. Мелкие задачи можно решать и сдавать сразу пачками чтобы не ждать.
Этого хватит? Или надо на какую-то конкретную тему?
Самые простые (тем не менее позволяют выявить ошибки в понимании, потому всем советую их) — в конце этой страницы: http://archive-ipq-co.narod.ru/l1/reading-list.html
Задача посложнее: дана страница с текстом, в котором присутствуют ссылки (тег <a>). Сделай средствами CSS3 и анимаций сделай черные плавно высплывающие подсказки с адресом ссылки при наведении на нее мыши. Если ссылка содержит аттрибут target="_blank" то в подсказке должно быть написано [^] перед адресом, например:
[^] http://exaple.com/
Еще задача:
Сделать кастомные радиокнопки и чекбоксы.
Кастомные — значит нестандартно выглядящие.
Радиокнопка — это круглая штука, из группы радиокнопок можно включить только одну.
Чекбокс — квадратик, в котором можно включать и выключать галочку.
Пример: http://jsfiddle.net/bv6fB/1/
Открой ссылку http://getbootstrap.com/components/#btn-groups-single . Видишь, там группа из 3 кнопок (left/middle/right), которые переключаются при нажатии? Нужно сделать такое же только без яваскрипта, на CSS3. То есть надо сделать чтобы круглые радиокнопки выглядели нестандартно.
Естественно, кнопок может быть и не 3, а 2, 4, 6, 10, 20 и так далее.
Внешний вид кнопок, можешь скопировать либо отсюда: http://jsfiddle.net/viralpatel/p499h/embedded/result/ (в код не смотри, просто понажимай и посмотри как работает) либо со страницы по ссылке выше, какой больше нравится.
Вторая часть задания — сделать кастомный чекбокс. Чекбокс — это такой квадратик, в котором при клике появляется и исчезает галочка.
Надо средствами CSS сделать, чтобы чекбокс выглядел так: http://jsfiddle.net/Ft73h/embedded/result/
Можно добавлять дополнительную html-разметку, если надо, но не слишком много.
Бонус: сделай табы (вкладки) на css3, пример: http://inferusvv.ru/demo/tabs/index.html
Задача посложнее: дана страница с текстом и попап (всплывающее окошко) неизвестного размера, который должен выводиться поверх текста. Отцентрируй его вертикально и горизонтально на странице средствами CSS.
Задача на верстку: сверстать макет http://rghost.ru/56603419
Код удобно постить на codepen, jsfiddle, jsbin. Мелкие задачи можно решать и сдавать сразу пачками чтобы не ждать.
Этого хватит? Или надо на какую-то конкретную тему?
Что-то ты кодировку напутал. Не читается.
>>365728
Ну с таким отношением ты ничего хорошего не услышишь. Иди и создавай свой тред, я не против.
>>365746
Кастомные радиокнопки тебе нужны. Но если ты ньюфаг то начни с тщательного изучения CSS и JS. PHP тут вообще не при чем.
>>365784
Отладчик — это полезный инуструмент. Если он встроен где-то и работает без лишних настрек — отлично. И хорошо бы уметь им пользоваться.
Но var_dump имеет то преимущество что его везде можно воткнуть, в том числе на ideone.
>>365787
> все сам писал,
Ну да ладно. В любом случае, там где можно исплоьзовать trim() или mb_substr, надо исплоьзовать их, так как они проще, а не регулярки.
> Это сделано с целью сохранить разные знаки препинания !?. Так как в процессе обработки текста мы их теряем.
А, точно. Оригинальное решение, хотя и непонятно с первого взгляда как оно работает.
Еще можно использовать в preg_split утверждения (которые не захватываются регуляркой и потому не теряются): http://www.php.net/manual/ru/regexp.reference.assertions.php
Еще можно исплоьзовать у preg_split флаг PREG_SPLIT_DELIM_CAPTURE (детали в мануале) и круглые скобки в регулярке, чтобы сохранять знаки препинания.
Что-то ты кодировку напутал. Не читается.
>>365728
Ну с таким отношением ты ничего хорошего не услышишь. Иди и создавай свой тред, я не против.
>>365746
Кастомные радиокнопки тебе нужны. Но если ты ньюфаг то начни с тщательного изучения CSS и JS. PHP тут вообще не при чем.
>>365784
Отладчик — это полезный инуструмент. Если он встроен где-то и работает без лишних настрек — отлично. И хорошо бы уметь им пользоваться.
Но var_dump имеет то преимущество что его везде можно воткнуть, в том числе на ideone.
>>365787
> все сам писал,
Ну да ладно. В любом случае, там где можно исплоьзовать trim() или mb_substr, надо исплоьзовать их, так как они проще, а не регулярки.
> Это сделано с целью сохранить разные знаки препинания !?. Так как в процессе обработки текста мы их теряем.
А, точно. Оригинальное решение, хотя и непонятно с первого взгляда как оно работает.
Еще можно использовать в preg_split утверждения (которые не захватываются регуляркой и потому не теряются): http://www.php.net/manual/ru/regexp.reference.assertions.php
Еще можно исплоьзовать у preg_split флаг PREG_SPLIT_DELIM_CAPTURE (детали в мануале) и круглые скобки в регулярке, чтобы сохранять знаки препинания.
>Ну с таким отношением ты ничего хорошего не услышишь.
От опа-хуя я ничего хорошего не услышу в любом случае, так как ничего хорошего он сказать не в состоянии
>Иди и создавай свой тред, я не против.
не, мне и тут норм
А ты и есть оп-хуй, или другое зашореное быдло? Тоже пишешь свои охуительные фреймворки, потому что нормальные осилить не можешь?
var initialData = [[[409,418,'xcv','ertr','06/28/2014 17:00:00','06/28/2014 00:00:00',6,'Prt','1 : 1','1 : 1','1 : 1','3 : 2','*1 : 1']
, [[409,'Brreeril',7.11,[[['defrter_gorls',[1]]];
не могу регулярку составить.
$pattern = '#\s*var\s+initialData\s*=\s*(.+);#';
получается фигня какая-то
Новый ньюфаг врывается в этот ИТТ тренд.
http://ideone.com/pnX1Cd. Задача "игра с кубиками", всё ли верно зделол?
<?php
error_reporting(-1);
$number = mt_rand(111111, 999999);
if ($lastDigit = $number % 10 == 1) {
echo " Выпало $number, а это значит, что Da";
} elseif ($lastDigit = $number % 10 == 2) {
echo " Выпало $number, а это значит, что Nyet";
} elseif ($lastDigit = $number % 10 == 3) {
echo "Выпало $number, а это значит, что Naverno";
} elseif ($lastDigit = $number % 10 == 4) {
echo "Выпало $number, а это значит, что Skoree da chem net";
} elseif ($lastDigit = $number % 10 == 5) {
echo "Выпало $number, а это значит, что Skoree net chem da";
} elseif ($lastDigit = $number % 10 == 6) {
echo "Выпало $number, а это значит, что infa sotochka";
} elseif ($lastDigit = $number % 10 == 7) {
echo "Выпало $number, а это значит, что Nestoit ono togo";
} elseif ($lastDigit = $number % 10 == 8) {
echo "Выпало $number, а это значит, что Wivi svoya wizn' kurica";
} elseif ($lastDigit = $number % 10 == 9) {
echo "Выпало $number, а это значит, что Shodi za pivom";
} elseif ($lastDigit = $number % 10 == 0) {
echo "Выпало $number, а это значит, что Sosnuli vse!";
}
Следующее задание написать рулетку, проверьте пожалуйста.
<?php
error_reporting(-1);
$number = mt_rand(111111, 999999);
if ($lastDigit = $number % 10 == 1) {
echo " Выпало $number, а это значит, что Da";
} elseif ($lastDigit = $number % 10 == 2) {
echo " Выпало $number, а это значит, что Nyet";
} elseif ($lastDigit = $number % 10 == 3) {
echo "Выпало $number, а это значит, что Naverno";
} elseif ($lastDigit = $number % 10 == 4) {
echo "Выпало $number, а это значит, что Skoree da chem net";
} elseif ($lastDigit = $number % 10 == 5) {
echo "Выпало $number, а это значит, что Skoree net chem da";
} elseif ($lastDigit = $number % 10 == 6) {
echo "Выпало $number, а это значит, что infa sotochka";
} elseif ($lastDigit = $number % 10 == 7) {
echo "Выпало $number, а это значит, что Nestoit ono togo";
} elseif ($lastDigit = $number % 10 == 8) {
echo "Выпало $number, а это значит, что Wivi svoya wizn' kurica";
} elseif ($lastDigit = $number % 10 == 9) {
echo "Выпало $number, а это значит, что Shodi za pivom";
} elseif ($lastDigit = $number % 10 == 0) {
echo "Выпало $number, а это значит, что Sosnuli vse!";
}
Следующее задание написать рулетку, проверьте пожалуйста.
сомневаюсь, там скриптом формируются табличные данные
> echo "Выпало $number, а это значит, что Skoree da chem net";
это еще чо за курообразное?
окрoпил уринoй пeтушиный рoтешник
заборай своё рнр и уёбывaй обратнo на насест откуда ты имел неосторожность выдристись
Ты чё такой злой? Он же только учится. Постепенно до этого дойдет. Выплеснуть желчь можно и в другом треде.
Да пускай, мне нравится смотреть на сагу этих хаскель петушков и прочих АЙЧ ТИ МИ ЭЛЬ ИЗ ЗЭ ПРОГРАММИНГ ЛАНГУЭЧ. Разбавляют своим веселым баребухом трэд.
Есть див, а в нем имг:
echo "<div class='t1'><img class='t2' src='/.../...' alt=''></div>";
Kak сделать так, чтобы картинка в бэкграунд-имэйдж ДИВа была поверх картинки ИМГ?
слижи-ка засохшие каловые кириешки с моей волосатой сраки
Жди опа, тут большинство сами ньюфаги слишком что бы советы давать. Иногда оп занят и будешь ждать не один день. Не сиди, читай книги, решай задачи дальше, потом вернешься и поправишь.
http://ideone.com/TjsYUf
Пофиксил все баги + заюзал PREG_SPLIT_DELIM_CAPTURE.
Правда не совсем понятно чем это лучше моего метода. Я его же использовал в задании с опечаточниками что бы исправленное предложение вставить на место оригинального никак не влияя на знаки разделяющие его и другие предложения.
>Жди опа, тут большинство сами ньюфаги слишком что бы советы давать.
Спрашивайте, я отвечу
5 лет в хайлоаде, ZCE -кун
Да вон, выше полно постов с вопросами и ссылками на ideone с кодом заданий от опа. Подсказывай какие места в коде можно сделать лучше и как, какие баги, какие в каких случаях не работает.
http://ideone.com/pnX1Cd
http://ideone.com/pnX1Cd#
>Подсказывай какие места в коде можно сделать лучше и как, какие баги, какие в каких случаях не работает.
яснопонятно
>>365796
> if ($op == '') {$result = $number;}
> if (($result == 0) & ($op == '')) {
Повторяется же код. А так, в остальном все верно.
>>365800
Что именно за фигня? Привел бы пример кода на ideone чтобы было видно что получается. Алсо, почитай про жадность квантификаторов: http://www.php.net/manual/ru/regexp.reference.repetition.php
>>365807
Это скорее кусок яваскрипта похожий на JSOn
>>365810
У других анонов все читается, а ты особенный?
А, сейчас посмотрел, это не битые символы, а наклонные квадратики и галочки. Все ок тогда. Только ты бы хоть пояснил, что именно надо сделать. Ты хочешь задачу предложить? Тогда стоило бы чуть больше написать, текстом, а то я сразу и не понял что к чему, и анон не поймет.
Выложи пример кода на ideone, который делает preg_match_all и выводит что-нибудь, чтобы мы видели что именно не так.
>>365817
Я не вижу кубиков, а вижу только рулетку. надо было fork нажать, а ты наверно стер кубики.
> if ($lastDigit = $number % 10 == 1) {
Ой, это во-первых, копипаста, во-вторых, присваивание (=) внутри if что плохо. Надо строку $lastDigit = $number % 10 вынести как отдельную строку в начало программы, а не копировать 10 раз подряд.
Исправь это и наверно все будет норм тогда.
Пошел вон
>>365837
Это местные шизофреники или тролли, они во всех тредах такое пишут. Непонятно, правда, что интересного троллить в разделе где заходит 3 с половной анона в день, из них 3 в PHP-тред.
>>365843
Да не хаскеллисты они, а тролли. Хаскеллисты в основном адекватные люди.
>>365844
Никак. Бекграунд имидж рисуется раньше чем содержимое элемента. Надо сделать отдельный элемент и спозиционировать его поверх картинки например аболютным позиционированием.
>>365850
Не обращай внимания на местных троллей.
Нашел решение, нужно было поменять тип столбца user в таблице на BLOB, чтобы он был чувствителен к регистру.
ПХП-кун, ты, помнится, давал всякие идеи, что можно написать. Вроде сайта, подобного ласт.фм, но для ютуба, ещё что-то (кстати, уже не нужно, т.к. ютуб сам даёт рекомендации по похожим артистам). Если я давно осилил все твои (не обязательно твои) упражнения, что можно сделать для портфолио?
Не знаю. Любой крупный и известный. Инфобокс например несколько лет назад был хорошим и быстрым.
А так, есть сайты вроде hosting-obzor.ru или hosting101.ru, можешь там посмотреть, отзывы почитать.
>>365853
...не один день, а целых два.
>>365864
> Правда не совсем понятно чем это лучше моего метода.
Ну я же не говорю, что оно плохое. Просто с DELIM_CAPTURE чуть очевиднее как оно работает. Ну и ты про такую возможность узнал в итоге.
А так, все верно.
>>365882
> $text = preg_replace('/ *(\\.) */', '$1 ', $text);
А почему пробелы нормальзуются только около точки, хотя выше видно что поддерживаются знаки
[.?!]
?Также, тут можно бы не разбивать текст на предложения 2 раза и не делать 2 цикла по ним.
>>365890
Ну да.
Тут кстати можно бы не разбивать текст на предлоежняи
Не знаю. Любой крупный и известный. Инфобокс например несколько лет назад был хорошим и быстрым.
А так, есть сайты вроде hosting-obzor.ru или hosting101.ru, можешь там посмотреть, отзывы почитать.
>>365853
...не один день, а целых два.
>>365864
> Правда не совсем понятно чем это лучше моего метода.
Ну я же не говорю, что оно плохое. Просто с DELIM_CAPTURE чуть очевиднее как оно работает. Ну и ты про такую возможность узнал в итоге.
А так, все верно.
>>365882
> $text = preg_replace('/ *(\\.) */', '$1 ', $text);
А почему пробелы нормальзуются только около точки, хотя выше видно что поддерживаются знаки
[.?!]
?Также, тут можно бы не разбивать текст на предложения 2 раза и не делать 2 цикла по ним.
>>365890
Ну да.
Тут кстати можно бы не разбивать текст на предлоежняи
В MySQL Для таблиц и отдельных колонок можно задать collation то есть правило сравнения и сортировки строк. По умолчанию там стоит что-то вроде utf8_unicode_ci (ci = case insensitive) то есть нечувствительное к регистру сравнение.
http://www.lissyara.su/articles/freebsd/www/mysql_charsets/
http://gahcep.github.io/blog/2013/01/05/mysql-utf8/
Не думаю, что надо менять collation, думаю надо переписать php код чтобы он учитывал эти особенности.
>>365985
> elseif ($anonDice1 + $anonDice2 > $compDice1 + $compDice2) {
У тебя же есть уже $anonSum, зачем повторно складывать?
> elseif ($anonDice1 + $anonDice2 == $compDice1 + $compDice2) {
В последнем случае можно просто писать else так как очевидно что кроме ничьи там ничего быть не может.
>думаю надо переписать php код чтобы он учитывал эти особенности.
Cомневаюсь. Mysql при проверке переводит все данные в нижний регистр, не думаю, что это можно исправить с помощью пхп кода.
Ты делаешь это неправильно. Надо либо менять collation либо, что лучше менять PHP код. Зачем тебе юзеры, которые различаются регистром букв?
>>365992
А ты делал задание на клон rghost например? Не уверен правда, пойдет ли он в качестве портфолио?
А так, давай сделаем что-нибудь простое. Например, сервис проверки доменов. Он позволяет указать один или несколько доменов, и свою почту. После этого ты получаешь страницу, на которой видны даты, до которой они оплачены и получаешь на почту предупреждение за 30, 14, 7, 3 дня до истечения срока.
Что скажешь?
Нет, ничего он не переводит, он именно сравнивает с учетом или без учета регистра. В некоторых collation по моему буквы е и ё еще считаются одинаковыми.
И это хорошо так как нет никакого смысла создавать 2 пользователей test и TesT.
Тебе надо именно в PHP исправить код, например чтобы он сравнивал без учета регистра. Или хранил имя в нижнем регистре.
Неплохие идеи, спасибо. Почему бы и нет, у каждой второй сайтостудии есть свой файлохостинг, который падает 10 раз в день. Только я не на пхп пишу, а на питоне, но в питонотреде нет адекватных анончиков. Заодно и ExtJS освою, чтобы сделать пользователю свой каталог с виртуальными папками, где он может хранить файлы, как на дропбоксе. Довольно объёмный проект будет, но ничего.
Вторая идея тоже хороша.
> Заодно и ExtJS освою, чтобы сделать пользователю свой каталог с виртуальными папками, где он может хранить файлы, как на дропбоксе
Ой-ой, я несколько лет назад сталкивался с Ext JS и мне он показался тяжелым и уродливым. Справедливости ради, он много где используется, но может тебе хотелось бы какую-то другую JS библиотеку использовать вроде jquery UI или Kendo или еще чего-то?
Алсо, меня беспокоит то, что все эти виртуальные папки часто бывают неудобно реализованы и больше мешают. Ты готов их сделать нормально как-нибудь? Чтобы простая загрузка файла не требовала 100500 кликов?
>Ой-ой, я несколько лет назад сталкивался с Ext JS и мне он показался тяжелым и уродливым.
Его знание часто требуют, а про Kendo я не слышал.
>Ты готов их сделать нормально как-нибудь? Чтобы простая загрузка файла не требовала 100500 кликов?
Можно и не делать папок, а просто отсортировать автоматически по типу файла - картинки в картинки, видео в видео, музыку в музыку, документы в документы. Однако пользователи любят там плодить всякие структуры и ковыряться, так что можно и вирт. файловую систему.
>ExtJS
>другую JS библиотеку
Это не библиотека, а фреймворк.
И глупо его сравнивать с jq плагинами всякими и самим jq, который просто обертка вокруг js, и тоже не фреймворк.
Привет, я тоже новенький, долго занимался перед тем как дропнуть? Как успехов добился на твой взгляд? Что было сложнее всего понять? Алсо, левше и вообще человеку не математического склада ума можно в пхп?
Ты жонглируешь образами, будущими действиями, а не скучным матаном. Здеся нужно понимание причинно-следственных связей и фантазия.
олдфажный ньюфаг с первых тредов
>ideone
https://ideone.com/MRhxjO
Получаю в браузере Array ( [0] => Array ( ) [1] => Array ( ) )
В файле a:2:{i:0;a:0:{}i:1;a:0:{}}
> левше и вообще человеку не математического склада ума можно в пхп?
а другие на нем и не пишут
и погнали. А как писать в хml документ что-то я не разберусь. Вот здесь
http://www.php.net/manual/ru/simplexml.examples-basic.php#example-5536
приводится пример установки значения, то что мне нужно как раз, но я не пойму откуда мне брать $xmlstr - строковое представление файла xml. В примере-то они взяли да присвоили туда строку, а как быть если у меня есть путь к файлу? Как из этого файла сделать строку? Как-то считывать через fread и склеивать или чтоа? Выручайте, братцы.
Есть скрипт, котоырй выводит все документы в папке, как сделать так, чтобы он не показывал ПАПКИ в этой ПАПКЕ?
Пробовал
if (is_dir($path) == false) {}
Не работает. Менял на тру и т.д. - все равно.
Есть 2 двумерных массива. Оба числовые , в одном содержится информация :
$cells = array (
array ('y'=>5,'x'=>4,'i'=>'. .'),
array ('y'=>3,'x'=>3,'i'=>'. .'),
array ('y'=>5,'x'=>4,'i'=>'. .'),
и т.д всего от 40 до 90 элементов
)
в другом массиве тоже самое , но массив состоит из 4 элементов.
$move = array (
array('y'=>3,''=>3,'x'=>"m"),
)
Нужно что бы каждый элемент массива $move сопоставлялся с элементом массива $cell в случае подходящего совпадения , элемент из массива $move удалялся.
Я сделал нахождения элемента , но ни как не могу удалить такой элемент из массива.
foreach($iCanMove as $move){
foreach($iSee as $pointMap){
if ($pointMap['y']==$move['y'] and $pointMap['x']==$move['x'] and $pointMap['i'] !==". ."){
//unset($move);- не работает.
//Убить $move
}
}
};
Через for конечно реализовать проще, но для массивов есть foreach вот и парюсь...
Если я правильно тебя понял и в $path у тебя полный путь к документу, то можно сделать обычную проверку is_file.
> Также, тут можно бы не разбивать текст на предложения 2 раза и не делать 2 цикла по ним.
Пофиксил
http://ideone.com/qPrQoZ
Поддержку знаков кроме точки убрал, так как йода насколько я помню вообще без каких либо эмоций медленно говорил, да и с параметром захвата разделителей у preg_split я разобрался.
http://ideone.com/G6erkH
Не понял в чем усложнение с добавлением новых купюр, считает точно также, может, я что-то упускаю?
http://ideone.com/gR322d
Что это вообще за петушиные задания?
Короче, тред уже судя по всему 27, а воз и ныне там, потому что все эти задания - ниочем и призваны потешить ЧСВ УЧИТЕЛА
У тебя программа выдает неправильный ответ. Она выдала 6600 с помощью 10 купюр, а можно с помощью 6: 3х2000, 3х200.
Что дерзай, я разработчик с 5 лет опыта
Вот это задание по ссылке +- подходит для первого, а вся эта петушня, что я вижу в этом итт треде - пустая трата времени
Насчёт мониторинга доменов — хорошая идея. В интернетах 3,5 скрипта. Два дырявых и один платный, а все остальное говно без швабодки за дохуя баксов в год. Допили https://github.com/bmericc/domainhunter и цены тебе не будет.
ОП, почему скрипты теперь не умеют в зону .name и org?
Выбирай диджитал-оушен или линод. Если ниосилятор, гоудэдди или блюхост.
Поехавший. И как человек не знающий даже синтаксиса будет выполнять это задание? Суть этих легких задачек, в том что бы выучить функции и то как их использовать. Тупо чтение справочника это одно, а научится их использовать для начала в элементарных случаях другое. Чисто теория или чисто практика херня, надо и то и то.
На кой там mt_rand? Перед тем как сделать выплату проверяешь чему равен полный платеж за месяц, то есть не только остаток но и плюс все проценты. Если больше 5000 тысяч, то все как всегда. Если меньше или равно то выплачиваешь все что осталось заплатить.
что не так то? Не могу понять
http://ideone.com/VWDEXM
>И как человек не знающий даже синтаксиса будет выполнять это задание?
Прочитает например статью на вики по ПЭЧЭПЭ
> Суть этих легких задачек, в том что бы выучить функции и то как их использовать. Тупо чтение справочника это одно, а научится их использовать для начала в элементарных случаях другое. Чисто теория или чисто практика херня, надо и то и то.
Итак, за 27 тредов, кто тут сделал хотя бы это джуниорское задание, на которое ты мне ссылку кинул?
Эти треды тут как минимум полгода если че
Оп, не могу справиться. Не хочет вставать на свои места. Css-спрайты сложнее будут, чем просто img прилепить.
Ссылку вообще я тебе кидал. И за полгода здесь народу сменилось прилично, думаю. Я тут меньше месяца, например.
Алсо, тебе не похуй, а?
http://ideone.com/aeCLKn
Есть три таблицы(смотри пик)
companies_data
- хранит всякие системные данныеcorporate_data
- данные фирм одного типа, будет считать юридические еба компании. individual_data
- данные фирм другого типа. Например, всяких б-гмерзских ИП.И я хочу запилить страничку, на которой будет выводиться табличка, в которой содержатся нужные мне поля(не все, отметил галочкой)
Как попизже составить запрос, чтобы сразу из всех таблицек забрать данные? Я ебусь в
JOIN
, но пока нужного результата не получил. UNION
мне не подошел, потому что там надо чтобы количество полей столбцов что ли совпадало. Да и вообще возможно более сложные запросы, поэтому join
предпочтительнее. Неохота переписывать весь код. Если я правильно решил задачу, то просто нужно изменить условие внутри цикла
if ($creditBalance<5000)
{
echo "Выплачено $creditBalance, долг выплачен";
break;
}
Пардон, выплачено не $creditBalance, а $totalPayment=$totalPayment+$creditBalance
http://ideone.com/rIp8QD
["2 день"]
foreach ($works as $key => $value) {echo '$key'} же. Оба выведет. Или посмотри функции для работы с массивами, там наверняка подходящая найдется.
Ну ты же так обращаешься к значению элемента по его ключу, а не к самому ключу. В данном случае значением works["2 день"] является ещё один массив, а echo выводит только строки.
https://github.com/Verpul/uppu.ru/
добавил интерфейс, подобный rghost
А ты постил ссылочку в тред? Я захожу только когда анон постит ссылку.
>>366026
Фреймворк, да, а сравнивать не глупо.
>>366068
О, у тебя тоже даблы выпали. Рулектка — все праивльно, в игре с кубиками ты забыл { } после else. Правила PHP разрешают писать без скобок, но это повышает риск сделать ошибку, потому лучше их всегда ставить. А в остально верно.
>>366078
Ругаться в другой тред.
>>366075
Отлично, продолжай. Тем более что учебник — это лишь основы, а вот после него уже подйут более близкие к жизни задания.
>А ты постил ссылочку в тред? Я захожу только когда анон постит ссылку.
Да, постил, в утонувшем уже треде, в конце было.
PDO может быть? Насчет FTP (им еще пользуются?), не знаю, я бы на ООП что-нибудь сделал.
Про паттерны работы с соединениями не понимаю, а какой там может быть паттерн? Соединился и шли данные.
>>366085
Можно. Математика тут — 4 основных действия, проценты и в одной задаче синус с косинусом — уровень школы.
>>366099
Ох, код скачивания страницы постить смысла нет, он там не работает на ideone, надо было кусок HTML в код прямо вставить. Вот так: https://ideone.com/iHNs0W
Алсо, сохранение в файл делается (уже давно) одной строчкой через file_put_contents(). Алсо, скачть страницу обычно можно с помощью file_get_contents() или черенз curl. Твой способ не будет работать если сервер захочет использовать chunked encoding или gzip.
В твоем случае регулярка скорее всего не работает так как точка соответствует любому символу кроме перевода строки. Читай:
http://www.php.net/manual/ru/regexp.reference.dot.php
http://www.php.net/manual/ru/reference.pcre.pattern.modifiers.php
Здравствуйте, а специалистам не обязательно знать пунктуацию русского языка?
пассивная агрессия
Я же отвечал вроде
> Не знаю. Любой крупный и известный. Инфобокс например несколько лет назад был хорошим и быстрым.
> А так, есть сайты вроде hosting-obzor.ru или hosting101.ru, можешь там посмотреть, отзывы почитать.
>>366126
Пример по моему понятен. Само сохранение в XML делается тут:
echo $element->asXML();
> но я не пойму откуда мне брать $xmlstr - строковое представление файла xml
Это же пример про то, как преобразовать дерево XML в строку, а не как загрузить. Можно использовать и simplexml_load_file, естественно new SimpleXMLElement тогда не нужно.
> Как-то считывать через fread и склеивать или чтоа?
Вообще-то есть file_get_contents(). Но как я написал выше, ты можешь загрузить XML любым способом.
в перспективе - китайский
> Пробовал
> if (is_dir($path) == false) {}
> Не работает.
проверяй что в $path - наверно там что-то непраивльное. is_dir прекрасно работает, это твой код неправильный.
>>366146
> unset($move);- не работает.
Конечно не работает, ты пытаешься удалить переменную $move, а не элемент массива. Надо писать для удаления так:
foreach ($array as $k => $v) {
unset($array[$k]);
}
Но в твоем случае, по моему, проще не обходить все клетки, которых много, а завести массив с кошками/мышками и обходить его так как их обычно меньше чем клеток на карте.
>я бы на ООП что-нибудь сделал
Я и просил пример того, как это нужно делать. Паттерна может и нет, но делают все примерно одинаково. Инстанс в статичном методе, наследуемый метод возвращающий соединение, все хуйня. Если под рукой ничего нет, то не трудись, уже все сам написал.
Создай обычный PDO объект и сделай его синглтоном.
Я просто не очень понимаю, где и зачем тебе это нужно использовать. Попробуй покурить документацию, есть функции key и next для работы с массивами, поэкспериментируй.
http://ua2.php.net/manual/ru/ref.array.php
всё тот же мимо
подскзал: >>366360
>>366166
Хорошо, все верно работает.
>>366177
Та, что дал анон ниже.
>>366205
Я тут подумал, конечно лучше было бы сделать в сотруднике поле «являетсяЛиШефом» — так было бы правильнее с точки зрения ООП — сотрудник должен сам знать, шеф он или нет. И код вроде
$chief->output = 0;
был бы не нужен. Но раз уж ты сделал через передачу аргумента, пусть так остается. Но имей в виду, что вариант с полем лучше. Плохо, что я забыл предупредить об этом.> echo ... count($department->staff) + 1
Вот это нехороший код. Ведь по идее в департаменте может сейчас и не быть шефа. И даже если он всегда есть, все равно, лучше сделать в Department метод getStaffCount() который возвращает нужное число.
> public function setChief($chief)
Тут нужен тайп хинт
> public static function chooseEmployee($name, $rank)
Если передано неправильное имя, в ООП принято выбрасывать исключение (достаточно в конец метода вписать 1 строчку):
throw new Exception("Invalid type: $name");
Это завершит программу с ошибкой если передать непправильное название. А то у тебя никакого сообщения на этот случай нет, ошибка останется незамеченной.
> preg_match_all
Тут нужен preg_match, так как нам нужно только первое совпадение с шаблоном, а не все. При несоответствии регулярке — выкидывать исключение.
Мануал по исключениям: http://www.php.net/manual/ru/language.exceptions.php
В остальном, все нормально. А не ты ли тут боялся, что ООП сложным окажется? Разобрался же в итоге.
подскзал: >>366360
>>366166
Хорошо, все верно работает.
>>366177
Та, что дал анон ниже.
>>366205
Я тут подумал, конечно лучше было бы сделать в сотруднике поле «являетсяЛиШефом» — так было бы правильнее с точки зрения ООП — сотрудник должен сам знать, шеф он или нет. И код вроде
$chief->output = 0;
был бы не нужен. Но раз уж ты сделал через передачу аргумента, пусть так остается. Но имей в виду, что вариант с полем лучше. Плохо, что я забыл предупредить об этом.> echo ... count($department->staff) + 1
Вот это нехороший код. Ведь по идее в департаменте может сейчас и не быть шефа. И даже если он всегда есть, все равно, лучше сделать в Department метод getStaffCount() который возвращает нужное число.
> public function setChief($chief)
Тут нужен тайп хинт
> public static function chooseEmployee($name, $rank)
Если передано неправильное имя, в ООП принято выбрасывать исключение (достаточно в конец метода вписать 1 строчку):
throw new Exception("Invalid type: $name");
Это завершит программу с ошибкой если передать непправильное название. А то у тебя никакого сообщения на этот случай нет, ошибка останется незамеченной.
> preg_match_all
Тут нужен preg_match, так как нам нужно только первое совпадение с шаблоном, а не все. При несоответствии регулярке — выкидывать исключение.
Мануал по исключениям: http://www.php.net/manual/ru/language.exceptions.php
В остальном, все нормально. А не ты ли тут боялся, что ООП сложным окажется? Разобрался же в итоге.
Код считает неправильно: http://ideone.com/IFq7MN — тут он пишет что выдача возможна, но если посчитать сумму, выходит 6300, а не 6600.
> $bills = array_reverse($bills, true);
Для сортировки по ключам лучше использовать ksort/krsort. Тогда можно давать на вход массив в любом порядке.
> if ($number >= $quantity) {
if/esle можно заменить на использоватье функции min:
выданноеЧислоКупюр = min(желаемоеЧисло, имеющеесяВНаличииЧисло);
Если сумму выдать невозможно, надо так и писать: http://ideone.com/IFq7MN
>>366229
Нормальные задания для начинающих. Тред, если считать треды в /b уже 40-й-с-лишним.
>>366255
Ты пишешь глупости. То ли ты троллишь, то ли у тебя нет способностей к преподаванию. пустая трата времени — твой посты.
>>366257
Это задание не на перехват чужих домен, а на создание напоминалки для своих.
Код считает неправильно: http://ideone.com/IFq7MN — тут он пишет что выдача возможна, но если посчитать сумму, выходит 6300, а не 6600.
> $bills = array_reverse($bills, true);
Для сортировки по ключам лучше использовать ksort/krsort. Тогда можно давать на вход массив в любом порядке.
> if ($number >= $quantity) {
if/esle можно заменить на использоватье функции min:
выданноеЧислоКупюр = min(желаемоеЧисло, имеющеесяВНаличииЧисло);
Если сумму выдать невозможно, надо так и писать: http://ideone.com/IFq7MN
>>366229
Нормальные задания для начинающих. Тред, если считать треды в /b уже 40-й-с-лишним.
>>366255
Ты пишешь глупости. То ли ты троллишь, то ли у тебя нет способностей к преподаванию. пустая трата времени — твой посты.
>>366257
Это задание не на перехват чужих домен, а на создание напоминалки для своих.
А, я протупил, это и есть скрипт для мониторинга своих доменов.
Не умеют наверно потому что у каждой зоны свой формат whois, стандартов никаких нет (даже дату каждый пишет по-своему), и нужно писать парсер под них.
Проект, который ты привел, я не советую брать за основу, ибо код там жуткая лапша и начинающим незачем на такое смотреть.
Написать самому скрипт несоложно, это дня 2-3, по сути надо сделать просто интерфейс к библиотеке PHP Whois + крон скрипт для мониторинга.
Анон-питонщик, имей в виду, это задание проще чем файлообменник.
Там, где кода много, должны даваться готовые заготовки. А если там 2-3 строки, можно и ручками написать.
>>366277
Этот >>366278 прав. Надо считать, сколько набежало долга, если много, платим 5000, если мало то платим остаток и уходим.
> $monthlyPayment == $creditBalance;
Эта строчка не имеет никакого смысла, так как сравнение надо делать внутри if, иначе непонятно, ну сравнил ты их на равенство, и что дальше? Или может ты хотел написать = (присвоить переменной значение), а не ==?
>>366288
Приавльно бы заменить ear → year
> }
> elseif
Тут скобки пишутся на одной строке:
} elseif (...) {
Алсо, что-то у тебя как-то рано человек умер. Но сама логика в программе верная, считает правильно.
> Прочитает например статью на вики по ПЭЧЭПЭ
Я же написал выше, у тебя просто нет способностей к преподаванию, и логики наверно. Если человек с нуля может прочесть статью в вики (которая абсолютно для изучения не пригодна) и все понять, зачем ему наш тред вообще?
Давай ты для сравнения попробуешь изучить Haskell по статье в вики, а? Хотя это не очень честное сравнение, так как у тебя есть опыт программирования.
> кто тут сделал хотя бы это джуниорское задание
Сделал далеко не один анон.
каждый день ходя в туалет я по крупицам постигал тонкости рнр
теперь я передаю свой опыт вам
Для начала проверим твой CSS: http://jigsaw.w3.org/css-validator/validator?uri=http%3A%2F%2Ffxsloker.github.io%2Fstyle.css&profile=css3&usermedium=all&warning=1&vextwarning=&lang=ru
Там есть 1 ошибка.
(Хром показывает ошибки например на вкладке Resources в отладчике, и фаерфокс наверно тоже где-то показывает).
Спрайты тут не при чем. Ты зачем-то влепил абсолютное позиционирование там, где оно не нужно:
> .services-wrapper li {
> position: absolute;
И из-за его употребления все поехало. Например, АП блоки не занимают место в потоке и потому не расталкивают находящиеся ниже блоки.
Я советую убрать тут АП.
>>366291
Это хорошо.
>>366294
> if($deposit>=1000000)
> $age=$age+$i;
Ставь пробелы для лучшей читаемости:
if ($deposit >= 1000000)
$age = $age + $i;
А так, считает верно.
>>366304
Это называется по моему наследование таблиц и тут есть разные варианты проектирования. В твоем случае выборку надо делать через LEFT JOIN (так как обычный JOIN требует чтобы слева и справа обязательно была запись).
То есть
SELECT FROM companies_data
LEFT JOIN corporate_data AS cd ON ...
LEFT JOIN individual_data AS id ON ...
Если одной строчке в companies_data соответствует ровно одна строчка в одной из других таблиц то это должно работать верно.
Если интересно, какие есть еще варианты наследования таблиц, вот ссылки:
http://design-pattern.ru/patterns/single-table-inheritance.html
http://design-pattern.ru/patterns/class-table-inheritance.html
http://design-pattern.ru/patterns/concrete-table-inheritance.html
У тебя явно используется Class TI.
>>366294
> if($deposit>=1000000)
> $age=$age+$i;
Ставь пробелы для лучшей читаемости:
if ($deposit >= 1000000)
$age = $age + $i;
А так, считает верно.
>>366304
Это называется по моему наследование таблиц и тут есть разные варианты проектирования. В твоем случае выборку надо делать через LEFT JOIN (так как обычный JOIN требует чтобы слева и справа обязательно была запись).
То есть
SELECT FROM companies_data
LEFT JOIN corporate_data AS cd ON ...
LEFT JOIN individual_data AS id ON ...
Если одной строчке в companies_data соответствует ровно одна строчка в одной из других таблиц то это должно работать верно.
Если интересно, какие есть еще варианты наследования таблиц, вот ссылки:
http://design-pattern.ru/patterns/single-table-inheritance.html
http://design-pattern.ru/patterns/class-table-inheritance.html
http://design-pattern.ru/patterns/concrete-table-inheritance.html
У тебя явно используется Class TI.
Не выводится сколько всего выплачено (должно быть около 61270)
>>366316
Правильный ответ примерно 61270 руб. Непонятно, зачем там из totalPayments еще что-то вычитать - там по моему только прибавлять надо.
>>366319
В твоем примере echo "2 день" — только так. По внутреннему массиву нельзя получить ключ под которым он хранится во внешнем. Или приведи другой пример кода.
>>366330
Потому что ты пытаешься получить элемент массива по ключу. Если хочешь вывести ключ, то выводи ключ: <?= "2 день" ?>
>>366338
Гляну сегодня или завтра.
>>366358
И на старуху бывает проруха, видимо, забыл.
>>366371
Еслит говорить про абстрактное соединение то так:
$connection = new Connection(....);
$connection->connect();
А так, посмотри PDO.
>>366368
Приведи пример кода. так ничего не понять, что ты хочешь.
Не выводится сколько всего выплачено (должно быть около 61270)
>>366316
Правильный ответ примерно 61270 руб. Непонятно, зачем там из totalPayments еще что-то вычитать - там по моему только прибавлять надо.
>>366319
В твоем примере echo "2 день" — только так. По внутреннему массиву нельзя получить ключ под которым он хранится во внешнем. Или приведи другой пример кода.
>>366330
Потому что ты пытаешься получить элемент массива по ключу. Если хочешь вывести ключ, то выводи ключ: <?= "2 день" ?>
>>366338
Гляну сегодня или завтра.
>>366358
И на старуху бывает проруха, видимо, забыл.
>>366371
Еслит говорить про абстрактное соединение то так:
$connection = new Connection(....);
$connection->connect();
А так, посмотри PDO.
>>366368
Приведи пример кода. так ничего не понять, что ты хочешь.
> + count($this->chief);
Ох, какой неочевидный код, пришлось в мануал лезть проверять. Я бы написал либо просто 1, либо если шеф может отсутствовать, то так:
... + ($this->chief ? 1 : 0);
Так, все верно. Усложнять задачу, я думаю, нет смысла, давай сразу тогда решай задачу про кошек-мышек. Если захочешь, дополнительно могу потом дать еще задачку сделать дерево (я поясню как именно).
> if($this->isImage($file)){
А почему проверка типа сделана при отображении страницы файла? По моему, лучше определять это один раз в момент загрузки — файл-то не изменится, незачем его каждый раз проверять.
Остальное наверно завтра гляну, но так, код более-менее верный, разве что по HTML/CSS могут быть замечания.
Взял заготовку кода.
/* Возвращает соответствующую числу форму слова: 1 рубль, 2 рубля, 5 рублей */
function inclineWord($number, $word1, $word2, $word5) {
/* DIY */
}
Вопрос - зачем параметры $word1, $word2, $word5?
Как я понял эта функция принимает 1 число и возвращает соответствующее ему слово?
>Ох, код скачивания страницы постить смысла нет, он там не работает на ideone, надо было кусок HTML в код прямо вставить. Вот так: https://ideone.com/iHNs0W
file_get_contents()-делал, не берет содержимое initialData только html, не знаю почему. file_put_contents() тоже пробовал, тут не принципиально. Почитаю ману по ссылке, спасибо.
Ты даешь ей число и 3 варианта слова и она выбирает нужный:
inclineWord(35, 'дом', 'дома', 'домов') -> домов
Но ты можешь ее и не использовать, а сделать по-своему, если хочешь.
http://ideone.com/8aJJ9J
Даже поле выводить не хочет. Да и саму структуру надо продумать. Поделись как все должно быть в общих чертах.
> 2014
> рнр
Animals:
- getPoint() - тут выбираются случайные координаты по вертикали и горизонтали
Mice:
$name = array (1, 2, 3), $count;
- takeStep()
Cats:
$name = "K", $count;
- takeStep()
- eatMouse()
- makeAsleepCat()
FieldCreator:
-getField() - тут собирается массив-поле нужной ширины и высоты.
Game:
-getGameField() - тут строит поле с животными с учетом всех вышеуказанных методов, но опять же все в одну функцию не запихнешь.
-ShowGameField() - выводит поле
Правильно ли я составил структуру? Что еще забыл? Нужны ли $name и $count?
Animals:
- getPoint() - тут выбираются случайные координаты по вертикали и горизонтали
Mice:
$name = array (1, 2, 3), $count;
- takeStep()
Cats:
$name = "K", $count;
- takeStep()
- eatMouse()
- makeAsleepCat()
FieldCreator:
-getField() - тут собирается массив-поле нужной ширины и высоты.
Game:
-getGameField() - тут строит поле с животными с учетом всех вышеуказанных методов, но опять же все в одну функцию не запихнешь.
-ShowGameField() - выводит поле
Правильно ли я составил структуру? Что еще забыл? Нужны ли $name и $count?
Not Found
The requested URL /1.php was not found on this server.
Подсказка Денвера
Вы ошиблись при наборе URL в браузере. Вероятнее всего, сервер пытается найти файл X:/home/111/www/1.php, которого не существует.
В случае использования CGI-скриптов, корректные пути к CGI-директориям следующие:
URLКуда указывает
http://***/cgi-glob/script.cgi/home/cgi-glob/script.cgi
http://***/cgi/script.cgi/home/***/cgi/script.cgi
http://***/cgi-bin/script.cgi/home/***/cgi-bin/script.cgi
ОН СУЩЕСТВУЕТ
У меня уже есть test1.ru, я пробовал добавлять туда, но не помогло, при том, что уже имеющийся index.html находит.
http://ideone.com/Dno18q
Исправил и переделал с условием выдачи наименьшим числом купюр.Норм?
Окей, уточню. Выставь 100 купюры в 0 и попробуй.
Паддинга добавить на li. Сам по себе background-image место не занимает и элемент не растягивает.
Алсо, почему картинки с белым фоном, а не с серым или прозрачным? Лучше всего прозрачный конечно, хотя с серым наверно меньше весить будет, если в PNG-8 сохранять.
> abstract class Animals
Один объект представляет собой одно животное, потому правильнее Animal, а не Animals.
> Даже поле выводить не хочет.
Там ошибки какие-то внизу, посмотри, var_dump-ом проверь что там не так.
>>366566
Когда решаешь задачу на ООП, надо ответить на вопросы:
- какие в задаче есть объекты (тут как минимум есть Кошка, Мышка, Карта и может еще класс Игра, который всем этим управляет)
- какие у них у каждого есть свойства
- какие методы у них должны быть? Что они должны уметь делать?
- как они связаны между собой? Например, если брать объект Кошка и Карта то связь очевидна — Кошка может находиться на Карте. Если брать объекты Кошка и Мышка, то явной связи нет — Кошка может съесть Мышку, но напрямую они никак не связаны.
Твой вариант более-менее нормальный, но по моему ты пытаешся сделать один объект для всех кошек — а это неправильно, 1 кошка = 1 объект. Также, не вижу у тебя класса «Карта» или «Поле» — а он скорее всего понадобится.
> getPoint() - тут выбираются случайные координаты по вертикали и горизонтали
Можно так, но можно координаты и извне задавать.
> Mice, Cats
То же самое, как я понимаю, один объект = 1 кошка/мышка, значит Cat и Mouse
Есть текст. В нем есть определенный текст ссылка вида:
&linkurl=1144567811123454489015345678971238567898183456789
Так вот, длина строки с цифрами постоянна, как и часть строки "&linkurl=". Мне нужно удалить эти циферки, как это сделать ПЫХПЫХОМ?
Шлюха авансом..
Нет
>>366577
В браузере что набрал в адресной строке? http://111/1.php ? http://www.111/1.php ? Файлы .htaccess где-нибудь там есть рядом?
>>366583
Имена функциям надо давать нормальные, в виде сделайЧтоТо(), а не f() так как очень трудно понять по названию, что она делает.
> if ($mi == 1) {
Вместо этого условия, лучше убрать echo из функции вообще и сделать чтобы она возвращала массив с ответом.
Переменные $amount, $bills тоже надо вынести из функции в начало программы, чтобы они явно передавались в нее. Хорошая функция работает с любыми переданными снаружи значениями, а не с жестко зашитыми внутри.
http://ideone.com/hpV7G0 — 6600 он выдать не может, так как тут нужен более сложный подход. Погугли «задача про банкомат».
Насчет функции array_kshift, ты все равно не используешь результат, вместо нее можно использовать просто array_shift.
Алсо, я же тебе советовал if/else заменить на min(), а то у тебя эти 3 строчки скопированы 2 раза:
$amount = $amount - ($quantity * $nominal);
$delivery = $quantity;
$sum = $sum + $delivery;
>>366603
Читай про регулярные выражения (мануал: http://www.php.net/manual/ru/pcre.pattern.php )
cd C:\Program Fles\<имя папки>\<имя файла>
получаю "Неверно задано имя папки", а в случае
cd C:\Program Fles\<имя папки>
<имя файла>
всё норм?
Потому что cd - это смена директории. Нафига ей передавать путь до файла?
>наш PHP-код будет запускать эту утилиту, она будет возвращать например список файлов и дальше мы с ним делаем что хотим.
Получаю пикрелейтед. Придется пилить парсер, я правильно понимаю?
Точно, на tmp_name раньше не обращал внимания, думал только после загрузки такие действия реальны. Убрал вызов метода в загрузку файла.
Никогда не правь файлы сторонних библиотек. В частности, ты внес изменения в www/ui/css/bootstrap.css Это плохо, так как:
- другой человек не догадается туда заглянуть и подумает что там стандартный бутстрап
- неочевидно что именно ты поменял, без сравнения с исходным файлом
- если ты захочешь обновить библиотеку, то придется вручную разбирать все изменения
Удали пожалуйста все свои изменения из бутстрапа (и других библиотек если ты их туда вносил) и вынеси в отдельный файл. Желательно и в папку отдельную от бутстрапа его положить, чтобы все не смешалось в кучу.
Идеальный вариант — когда каждая библиотека в своей отдельной папке, и в любой момент ее можно заменить на новую версию.
В gitignore у тебя что-то странное:
*/uploads/
Почему не пишешь путь нормально, например, www/uploads ?
Причем htaccess внутри uploads надо бы исключить из исключений.
Для вывода сообщения об ошибке используй не серенькую надпись, а например алерт: http://getbootstrap.com/components/#alerts
Если ни одного файла нет, то не надо выводить пустую таблицу, а надо так и написать: «Ни одного файла не загружено. Хотите стать первым?»
Логотип обычно ведет на главную страницу.
Отображать размер файла лучше кратко: 558694 b -> 558 Kb
Надписи стоит везде сделать на одном языке
> </base>
У тега base вроде бы нет закрывающего тега: http://htmlbook.ru/html/base . И имей в виду, что при использовании base есть подвохи — например, перестают работать состоящие только из якоря ссылки вроде #link
> <center>
Этот тег давно устарел, используй div + CSS text-align: center;
Идентификаторы надо писать в едином стиле:
> in_the_middle_of_page
> page-header
> ul{ padding: 15px;
Не стоит переопределять стили для тегов. Завтра в разделе «о нас» ты добавишь текст и внезапно обнаружишь, что у списка появились огромные остутпы. Вместо ul лучше назначь этот стиль на какой-то конкретный класс.
А так, в остальном все нормально сделано.
Никогда не правь файлы сторонних библиотек. В частности, ты внес изменения в www/ui/css/bootstrap.css Это плохо, так как:
- другой человек не догадается туда заглянуть и подумает что там стандартный бутстрап
- неочевидно что именно ты поменял, без сравнения с исходным файлом
- если ты захочешь обновить библиотеку, то придется вручную разбирать все изменения
Удали пожалуйста все свои изменения из бутстрапа (и других библиотек если ты их туда вносил) и вынеси в отдельный файл. Желательно и в папку отдельную от бутстрапа его положить, чтобы все не смешалось в кучу.
Идеальный вариант — когда каждая библиотека в своей отдельной папке, и в любой момент ее можно заменить на новую версию.
В gitignore у тебя что-то странное:
*/uploads/
Почему не пишешь путь нормально, например, www/uploads ?
Причем htaccess внутри uploads надо бы исключить из исключений.
Для вывода сообщения об ошибке используй не серенькую надпись, а например алерт: http://getbootstrap.com/components/#alerts
Если ни одного файла нет, то не надо выводить пустую таблицу, а надо так и написать: «Ни одного файла не загружено. Хотите стать первым?»
Логотип обычно ведет на главную страницу.
Отображать размер файла лучше кратко: 558694 b -> 558 Kb
Надписи стоит везде сделать на одном языке
> </base>
У тега base вроде бы нет закрывающего тега: http://htmlbook.ru/html/base . И имей в виду, что при использовании base есть подвохи — например, перестают работать состоящие только из якоря ссылки вроде #link
> <center>
Этот тег давно устарел, используй div + CSS text-align: center;
Идентификаторы надо писать в едином стиле:
> in_the_middle_of_page
> page-header
> ul{ padding: 15px;
Не стоит переопределять стили для тегов. Завтра в разделе «о нас» ты добавишь текст и внезапно обнаружишь, что у списка появились огромные остутпы. Вместо ul лучше назначь этот стиль на какой-то конкретный класс.
А так, в остальном все нормально сделано.
При загрузке файл просто помещается во временную папку, а ты его можешь переместить с помощью rename() или move_uploaded_file(). Вторая функция лучше, так как дополнительно проверяет, что это действительно только что загруженный файл, а не что-то левое.
Если файл не будет перемещен, то он удаляется из временной папки после завершения скрипта.
Алсо, старайся не писать код в контроллерах, так как его нельзя повторно использовать. Например, функцию isImage() не получится вызвать из другого места программы, а если бы ты ее сделал статическим методом в отделбьном классе например, то можно было бы. Этот принцип еще называется «тонкие контроллеры».
>>366689
Некоторые утилиты имеют опции, которые делают вывод данных в каком-нибудь стандартном формате вроде XML или JSON. Потому, прежде чем отчаиваться, стоит почитать мануал. Но тут я ничего особого не нашел, разве что опцию -slt, которая выводит данные построчно, и вывод которой наверно будет проще парсить.
Так что да, придется.
Если ты не рассматриваешь конечно альтернативные варианты вроде:
- написать php-расширение на языке Си для взаимодействия с 7z.dll и получения информации напрямую
- добавить (написать код на Си/Си++) в архиватор опцию вывода данных в json/xml.
Вообще, конечно, парсить вывод программы — это не лучшая идея, так как там куча подвохов: например, что если у пользователя твоей программы другая локаль (настройки языка в системе) и программы выводит данные на другом языке?
Лучше использовать библиотеку или расширение, если таковые имеются, но похоже что у нас их нет.
Попробуй опцию -slt, с ней по моему парсить проще будет.
Также, есть немало подвохов при вызове внешней программы из PHP:
- надо проверять код возврата (чтобы увидеть ошибку)
- надо делать ограничение по времени (чтобы в случае зависания php скрипт не завис)
- возможно стоит сделать ограничение на объем передаваемых данных (что если злодей загрузит архив из миллиарда файлов чтобы заполнить как можно больше памяти?)
Чуть не забыл! Запуск внешней программы — прямой путь к уязвимостям. И в windows, и в linux в PHP, когда ты запускаешь программу (наример через exec()), ты должен указать строку, которая будет передана командному интерпретатору.
Если бы надо было указать массив вида «имя программы + опции», проблем бы не было. Но там, где есть разбор строки, есть пути для уязвимостей.
Злоумышленник может попытаться подставить в строку свои команды, которые дадут ему контроль над сервером.
Вот пример: команда ls (Линукс) или dir (windows). Она выводит список файлов в каталоге. Допустим, у нас есть скрипт для вывода списка файлов и имя каталога предоставляется пользователем. Есть ли уязвимость в этом скрипте?
$directory = $_GET['directory'];
$command = 'ls "'.$directory.'"'; // для windows вместо ls поставить dir
passthru($command);
Заметь, мы поставили кавычки в командную строку, чтобы корректно работали имена каталогов с пробелами. Однако, кавычки не защитят нас от инъекции. Злоумышленник может передать такое значение directory:
/"; cat config.php; echo "
В итоге получится такая командная строка:
ls "/"; cat config.php; echo ""
Под Линукс это будет вопринято и выполнено как 3 отдельные команды, вторая выведет содержимое указанного файла. Естсественно, вместо нее может быть например команда скачивания скрипта-бекдора.
По идее подставляемое имя надо экранировать, но это не так просто, так как бекслеш например будет работать в linux, но не будет работать в windows, там для экранирования используется ^. Плюс, надо внимательно изучить мануалы по командным оболочкам, чтобы получить список символов, которые надо экранировать.
К тому же прграммист может не знать про эти особенности.
В PHP есть функция http://www.php.net/manual/ru/function.escapeshellarg.php — но она не работает под Windows и я не уверен что она корректно работает под Линуксом и ее нельзя обойти.
Потому, когда будешь делать вызов внешней программы, обязательно проверь, есть ли у пользователя возможность повлиять на формируемую командную строку (в том числе через имя файла) и подставить туда свои значения.
Чуть не забыл! Запуск внешней программы — прямой путь к уязвимостям. И в windows, и в linux в PHP, когда ты запускаешь программу (наример через exec()), ты должен указать строку, которая будет передана командному интерпретатору.
Если бы надо было указать массив вида «имя программы + опции», проблем бы не было. Но там, где есть разбор строки, есть пути для уязвимостей.
Злоумышленник может попытаться подставить в строку свои команды, которые дадут ему контроль над сервером.
Вот пример: команда ls (Линукс) или dir (windows). Она выводит список файлов в каталоге. Допустим, у нас есть скрипт для вывода списка файлов и имя каталога предоставляется пользователем. Есть ли уязвимость в этом скрипте?
$directory = $_GET['directory'];
$command = 'ls "'.$directory.'"'; // для windows вместо ls поставить dir
passthru($command);
Заметь, мы поставили кавычки в командную строку, чтобы корректно работали имена каталогов с пробелами. Однако, кавычки не защитят нас от инъекции. Злоумышленник может передать такое значение directory:
/"; cat config.php; echo "
В итоге получится такая командная строка:
ls "/"; cat config.php; echo ""
Под Линукс это будет вопринято и выполнено как 3 отдельные команды, вторая выведет содержимое указанного файла. Естсественно, вместо нее может быть например команда скачивания скрипта-бекдора.
По идее подставляемое имя надо экранировать, но это не так просто, так как бекслеш например будет работать в linux, но не будет работать в windows, там для экранирования используется ^. Плюс, надо внимательно изучить мануалы по командным оболочкам, чтобы получить список символов, которые надо экранировать.
К тому же прграммист может не знать про эти особенности.
В PHP есть функция http://www.php.net/manual/ru/function.escapeshellarg.php — но она не работает под Windows и я не уверен что она корректно работает под Линуксом и ее нельзя обойти.
Потому, когда будешь делать вызов внешней программы, обязательно проверь, есть ли у пользователя возможность повлиять на формируемую командную строку (в том числе через имя файла) и подставить туда свои значения.
http://fxsloker.github.io/
Оп, смотри спрайты запилил. Но я забыл как делать кастомные радиокнопки.
))
Предлагаю доработать сайт, например, после каждого задания сделать форму для решения, организовать это можно не нагружая сервер, используя, например, ideone, увеличить количество задач.
Когда твой код видит что остаток равен или меньше 5к(что не совсем верно, так как надо проверять не только остаток но и полную сумму платежа(комиссия, проценты)). Ты же только что заплатил 5к за кредит, следующие 5к будут только через месяц, а там уже не только остаток платить. Проверяешь сумму платежа, если меньше или равно 5к, выплачиваешь то что высчитал целиком и все, если же нет то дальше продолжаешь платить по 5к.
http://ideone.com/eugY3t
Оп, я тут подумал вот что:
Перед каждым ходом мышь и кот оценивают ситуацию, то есть точки перебираются справа, снизу, слева, сверху (с их возможностью поля зрения), а если попадается враг, то записываются его координаты. Далее нужно придумать как их сравнивать и находить наиболее безопасную сторону. Верно мыслю?
Посмотри на код.
Естественно. У тебя условие хрень какая то. Долг+ комиссия+процент если <= 5000, платим только то что осталось, если же нет то платим 5 тысяч и по новой, пока Д+К+П не станет <=500
И как это все реализовать?
Все! Местами поменял и получилось
if ($dolg * $percent + $comisiya <= 5000) {
$platij = $dolg;
Следующий раз, перед тем как что то спрашивать. Вчитайся в то что написал и не отправляя формы, посиди подумай еще часик, погугли и только потом уже спрашивай.
Почему, он мне один хуй, пишет, что отдал 60000к, хотя, по сути, должен писать, например 59212
В общем почему то 034 приравнивается к 28, и функция возвращает двадцать восемь. Но если же беру в кавычки число и передаю как строку то все ок. С чем связано такое явление?
>>366880
Ты бы хоть код постил на ideone. Экстрасенсов тут нету.
Восьмеричная система счисления. Во многих языках, унаследовавших синтаксис Си.
Вот функция перевода группы из 3 цифр в пропись
http://ideone.com/5jfnJl
Я же тебе объяснял, проверять надо до того как заплатил, а не после, это раз. Два - ты делаешь платеж равным долгу и на этом заканчиваешь скрипт. Где вывод информации о том сколько заплатил, где прибавление последнего платежа к общей сумме выплат и вывода этой информации? У тебя просто выводится слово Хватит!
И отдельная просьба - называть переменные на английском. https://translate.google.com/ в помощь.
логически до всего этого я допёр, а вот в коде реализовать не могу это. Напиши уже решение.
>Ты хочешь задачу предложить?
Однажды я услышал от БИЗНЕС ГУРУ БИЗНЕСА: «эй ТЫ, чтобы достичь УСПЕХА нужно ЗАНИМАТЬСЯ СИРИОЗ ДЕЛОМ 21 ДЕНЬ, СЛЫШАЛ?? 42 ЧАСА В НЕДЕЛЮ». У меня от этого БИЗНЕС КОЛОМ ВСТАЛ. Тут я понел, что стану МЕЛЬЁНЭРАМ. После длительных мучений, раздумий, я решил задачу!!! А через 21 день Я КУПИЛ КРАСНЫЙ ФИРАРЫ!!1 И ТИПЕРЬ ЛЕЧУ НА ЛИЧНОМ САМАЛЕТЕ НА МАЛЬДИВЫ!!
==> ЧТОБЫ КУПИТЬ «21 ДЕНЬ УСПЕХА» НАЖМИТЕ ЗДЕСЬ <==
Не понимаю, почему этот код не работает. Почему в 0ой элемент массива не записывается ничего, а в последнем что-то есть, когда в гайде написано, что 0ой и последний элемент это пустые строки?
Я всё таки сделал эту хрень. Но через массив не получилось почему-то, пришлось городить костыли.
По-моему у тебя каша в голове. Ты ведь знаешь, что если $i=0, то -($i+1) == -1?
Лол, только сейчас понял. Просто там было -i, потом я понял, что это не работает и поставил $i+1, поэтому там и стоит это тупое условие.
Оп, смотри пинг-понг на одном css. Только выиграть по-моему нереально.
У тебя ссылки странно сделаны (например «see portfolio»): большой div, а в нем маленький элемент <a>. В чем смысл? Почему нельзя только <a> тут обойтись?
Надо будет еще побольше интерактивности добавить, чтобы все реагировало на наведение, нажатие, и тд. Я потом еще может пару идей подкину что можно сделать.
Радиокнопки делаются примерно так: http://habrahabr.ru/post/154719/ за счет псевдокласса :checked
>>366774
У меня раньше была даже мысль сделать робота для проверки решений, но что-то я его так и не доделал, все некогда было.
>>366790
Код который там дан, не совсем правильный (специально). Я бы советовал удалить все, что в цикле, и попробовать написать самому, а не копировать то, что было дано.
Надо просто каждый месяц прибавлять коммиссию/проценты и смотреть, чему равен долг: если большой — платим 5000, если маленький — сколько осталось.
Алсо, это задача сложная, некоторые ее по 3 дня решали.
Троллить в другой тред
>>366844
Вместо того, чтобы перебирать точки, может быть выгоднее просто перебирать животных, которые есть в радиусе зрения, так как их меньше чем клеток.
Насчет алгоритма выбора хода, можно использовать разные методы, например, можно складывать векторы по аналогии с отталкиванием зарядов. Берем всех кошек, которая видит мышка, и от каждой рисуем стрелочку-вектор. Эта стрелочка как бы показывает направление, в котором мышь хочет убежать, она направлена в противоположную сторону от кошки, а ее длина зависит от расстояния: чем дальше кошка, тем короче стрелочка (то есть тем меньше мышка боится кошку). Соответственно, если кошек несколько, то эти вектора мы складываем, чтобы получить общее направление.
У метода есть недостаток: если мышка сидит между 2 кошками (например одна слева, другая справа), то вектора от кошек будут направлены в противоположные стороны и при сложении компенсируют друг друга и получится что мышке лучше сидеть на месте (хотя лучше убегать вверх или вниз).
Также, метод не учитывает тот факт, что клетки с краю поля, а тем более в углу менее выгодны (на них у мышки меньше вариантов ходов и ее проще поймать).
Есть также второй вариант: берем все возможные ходы мышки (включая вариант стоять на месте) и для каждого оцениваем в очках выгоду от него. После чего выбираем самый выгодный.
Выгода должна складываться из несколько факторов:
- расстояние до ближайшей кошки: если после хода мы окажемся рядом с кошкой, это плохой ход, если далеко то хороший
- сколько вариантов хода есть с этой клетки: края и углы поля хуже, так как с них меньше вариантов уйти, а центр лучше так как дает больше свободы
При этом разные факторы должны иметь разный вес: так, лучше сходить на угловую клетку, чем на не угловую, но соседнюю с кошкой (где нас съедят следующим ходом).
Для кошки тоже можно применить вариант с подсчетом очков, а можно просто найти ближайшую мышку и двигаться в ее сторону.
> public $point;
Какой смысл хранить координаты массивом, а не 2 отдельными свойствами?
> public function getStartPoint()
Это все же лучше вынести куда-то в другое место. В Field например.
Мышку и Кошку надо наследовать от общего предка, так как у них много общего.
В этой задаче, думаю стоит начать применять инкапсуляцию — то есть сделать все свойства private или protected и доступ к ним через методы.
Инкапсуляция — это когда нельзя снаружи залезтть внутрь обхекта, а можно только вызывать его методы.
Код в takeStep() надо сделать по-другому, например не стоит вручную обходить массив $field, когда у нас есть класс Field и мы можем сделать в нем методы вроде «найти все кошек в указанном радиусе» или «проверить занята ли эта кдетка».
Циклом foreach например
>>366880
Проверь все ли ты выводишь. Может ты в переменную что-то прибавляешь, а вывести с помощью echo забыл, а сама себя переменная не выведет.
>>366882
PHP воспринимает начинающиеся с 0 числа как восьмеричные числа (это числа которые состоят из цифр 0-7, после 7 идет сразу 10).
>>366885
Лучшим выходом будет не приписывать лишний 0, то есть писать 34, а не 034.
>>366886
> $key = (int)$hundred * 100;
(int) тут не нужен, floor и так вернет целое число.
> сто ноль
Где-то ошибка у тебя в логике, не надо приписывать число единиц если оно равно нулю. Для нуля лучше вообще в самом начале функции отдельный if поставить:
если (число равно нулю) ...
Ну и еще, я бы попробовал упростить место, где if вложен внутрь if, может можно его одноуровневым сделать?
А так, нормально.
Циклом foreach например
>>366880
Проверь все ли ты выводишь. Может ты в переменную что-то прибавляешь, а вывести с помощью echo забыл, а сама себя переменная не выведет.
>>366882
PHP воспринимает начинающиеся с 0 числа как восьмеричные числа (это числа которые состоят из цифр 0-7, после 7 идет сразу 10).
>>366885
Лучшим выходом будет не приписывать лишний 0, то есть писать 34, а не 034.
>>366886
> $key = (int)$hundred * 100;
(int) тут не нужен, floor и так вернет целое число.
> сто ноль
Где-то ошибка у тебя в логике, не надо приписывать число единиц если оно равно нулю. Для нуля лучше вообще в самом начале функции отдельный if поставить:
если (число равно нулю) ...
Ну и еще, я бы попробовал упростить место, где if вложен внутрь if, может можно его одноуровневым сделать?
А так, нормально.
лучше сделай код внутри цикла примерно так:
- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
А то, что есть, можешь стереть. Ну и переменные хорошо бы нормально назвать конечно.
>>366891
Не знаю
>>366917
Все бы ничего, но реально трудно понять, что ты хочешь сказать. Но в любом случае, рад, что у тебя получилось сделать то, что на картинке изображено.
>>366924
А ты PREG_SPLIT_NO_EMPTY использовал? Без него добавляется пустой элемент с начала и с конца.
>>366927
> $symbol2=mb_substr($text,-1);
> if($i>0)
> {
> $symbol2=mb_substr($text, -($i+1),1);
Тут if не нужен, формула -($i + 1) работает для $i == 0 тоже.
Ну и отступы у тебя разъехались как-то. А так, верно работает.
лучше сделай код внутри цикла примерно так:
- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
А то, что есть, можешь стереть. Ну и переменные хорошо бы нормально назвать конечно.
>>366891
Не знаю
>>366917
Все бы ничего, но реально трудно понять, что ты хочешь сказать. Но в любом случае, рад, что у тебя получилось сделать то, что на картинке изображено.
>>366924
А ты PREG_SPLIT_NO_EMPTY использовал? Без него добавляется пустой элемент с начала и с конца.
>>366927
> $symbol2=mb_substr($text,-1);
> if($i>0)
> {
> $symbol2=mb_substr($text, -($i+1),1);
Тут if не нужен, формула -($i + 1) работает для $i == 0 тоже.
Ну и отступы у тебя разъехались как-то. А так, верно работает.
От префиксов уже отказываются, это признано неудачной идеей.
Сейчас новые префиксы обычно делают так, что они работают только в режиме разработчика (надо включить специальную опцию в настройках) и соответственно для верстки их применять будет бесполезно.
Более того, ты можешь смотреть поддержку свойства браузерами например на caniuse (пример http://caniuse.com/#search=border-radius ) и проверить, может новые версии браузеров уже давно без префиксов работают.
Единственное, что останется с префиксами — это то, что не стандартизовано, вроде -webkit-appearance или -ms-interpolation.
>>366971
В фаерфоксе что-то не работает. Но вообще, на CSS трудно сделать игру, так как это не язык программирования (а язык стилей).
Смотри, у тебя в последний месяц анон платит 5000, и сразу же выплачивает 4139 остатка. А ведь он не может сразу это выплатить, он должен подождать месяц, за который набегут проценты и комиссии и итоговая сумма выйдет больше — не 49139, а около 61270.
Также, если поставить маленькую сумму кредита, например 1000, твоя программа не учтет это и все равно в первый месяц выплатит 5000, хотя достаточно заплатить 2030.
попробуй переписать код внутри цикла примерно так:
- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
Если речь о работе с Бд, то просто используй транзакции (детали в вики).
try {
начать транзакцию
создать что тебе надо
коммит
} catch (исключение) {
откатить траназкцию
]
Если речь об ООП без работы с базой, то там вообще проблем нет, PHP сам удалит неунжные объекты рано или поздно, например:
$root = new Root();
$something = new Something($root->getId());
$product = new Product($something->getId());
Тут не надо ничего делать, ну будет исключение, ну и пусть эти объекты остаются, ни на что они не влияют.
> if($this->getChild()->create() == null){
Не надо if, надо сразу в create() выкидывать исклбчение. Исключения придуманы специально чтобы не писать if
Если речь о работе с Бд, то просто используй транзакции (детали в вики).
try {
начать транзакцию
создать что тебе надо
коммит
} catch (исключение) {
откатить траназкцию
]
Если речь об ООП без работы с базой, то там вообще проблем нет, PHP сам удалит неунжные объекты рано или поздно, например:
$root = new Root();
$something = new Something($root->getId());
$product = new Product($something->getId());
Тут не надо ничего делать, ну будет исключение, ну и пусть эти объекты остаются, ни на что они не влияют.
> if($this->getChild()->create() == null){
Не надо if, надо сразу в create() выкидывать исклбчение. Исключения придуманы специально чтобы не писать if
КАК встроить $_POST[] в регулярное выражение?
Пробовал так - не получается:
$phrase = $_POST['search'];
$sub = 'mb_internal_encoding("utf-8"); [17] => error_reporting(-1);';
$preg = preg_match('/(\$phrase)/u', $sub, $mat);
print_r($mat);
Так тоже не получается:
$sub = 'mb_internal_encoding("utf-8"); [17] => error_reporting(-1);';
$preg = preg_match('/(\$_POST\['search'\])/u', $sub, $mat);
print_r($mat);
KAK сделать так, чтобы в прег поместилась фраза из $_поста?
А, туплю, ты используешь $_POST['search']. Тогда норм.
'/(\$phrase)/u' — в строчки в одинарных кавычках нельзя вставлять переменные. Точнее можно, но они будут воспринматься как обычный текст, и туда не будет подставляться то что в них содержится.
Алсо, зачем ты пишешь
\$phrase
Что ты хочешь добиться бекслешем?
И зачем ты пищешь '/(\$_POST\['search'\])/u ? Это вообще что-то странное, где написано что так можно делать?
Почитай сначала мануал про подстановку переменных в строку: http://www.php.net/manual/ru/language.types.string.php#language.types.string.parsing
Также, надо использовать preg_quote (подробности в мануале), чтобы экранировать спецсимволы.
Также, если тебе надо просто искать по слову то можно использовать mb_strpos и не заморачиваться с регулярными выражениями.
>Что ты хочешь добиться бекслешем?
Экранирую знак доллара.
>И зачем ты пищешь '/(\$_POST\['search'\])/u ?
Ну, в преге встраивается фраза из С_ПОСТ.
Это массив. Выводишь ты отдельный элемент, с помощью квадратных скобок.
echo $_POST; — работать не будет
>>367038
Экранирование работает на 2 уровнях:
- экранирование символов в строке от PHP, чтобы он например понял \$x как символы $ и x а не название переменной. Это то, что пытаешься сделать ты.
- экранирование символов от регулярки. Оно происходит после экранирования от PHP, потому для него надо бекслеши ставить по 2 раза.
При этом я написал выше, в строку с одиночными кавычками вообще нельзя подставлять переменные. Иди мануал почитай.
Работа с БД, но я бы хотел избежать транзакций. Во-первых пока транзакция идет доступ у БД закрыт знаю, есть разные уровни во-вторых просто спортивный интерес. Мало ли что я захочу делать если на предыдущем уровне не срослось. Хочу чтобы связка была максимально гибкой. Типа транзакций, но на пыхе. Не зря же исключения бросаю - бросил исключение, отловил и залоггировал например.
Прочитал я уроки с оп-поста, задачки порешал. Очень понравилось. Но я что-то совсем не понял, что PHP делает в вебе? Как взаимодействует/или нет с HTML немного знаю его?
И может кто-нибудь привести пример применения, хотя бы на том же дваче.
>Но я что-то совсем не понял, что PHP делает в вебе? Как взаимодействует/или нет с HTML
Сервер обрабатывает код, превращая результат в HTML текст и отсылает пользователю.
То есть то, что нельзя сделать в HTML, мы делает в PHP, а сервер превращает это в HTML?
Ну как бы любой код на пхп доходит до тебя в виде хтмл, вот написал ты, например:
$x=2*4;
echo $x;
Открываешь в браузере исходный код и видишь только:
<html>
<head>
</head>
<body>
8
</body>
</html>
Ты путаешь математику и программирование. Ты пишешь какие-то не связанные друг с другом формулы вместо последовательных действий с переменными. Проследи как у тебя меняется значение $creditBalance.
http://fxsloker.github.io/
Оп, смотри, радиокнопки приделал. Я не дизайнер, не знаю какой цвет при checked лучше (кстати в заказе это описывается обычно, или нужно самому придумывать??).
У социальных кнопок края какие-то неровные и потертые получились. Также не знаю какой эффект лучше прилепить, а то сейчас отвратно выглядит.
>(11) месяц спустя долг = (4138.1720657184)
Получается, что оно меньше, чем $monthlyPayment, поэтому выполняется второе условие и срабатывает break:
else {
$monthlyPayment = $remain;
............
А на самом деле 4138*1,03+1000 = 5262, то есть..... ну ты думаю уже придумал, что дальше.
Я бы убрал вот это if ($creditBalance >= $monthlyPayment). Мешает же. В некоторых случаях $creditBalance будет явно меньше 5000
И я решил уже, помню тоже мучался когда-то над ней. Хотя дальше задача про айпад в кредит будет посложнее, с ней дольше страдал.
И пока вызов не готов, идет новый вызов того-же скрипта. Что произойдет, новый экземпляр программы будет пытаться использовать уже открытые ресурсы? Или пользователь получит сообщение об ошибке, зависание?
Посмотри внимательно на свой код:
> if ( $creditBalance < $monthlyPayment ) {
> $monthlyPayment = $creditBalance;
Тут явная ошибка. Если остаток маленький, то ты копируешь в переменную monthlyPayment (сколько платить в месяц) этот остаток. Но ведь в следующем месяце на остаток начислятся проценты и комиссия, и он станет больше и той суммы, что ты сохранил в переменной, не хватит для выплаты. Посмотри на свой код — там как раз каждый месяц примерно 1000 остается.
Эта проверка у тебя стоит не в том месте. Посмотри внимательно на алгоритм который я написал:
- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
А вот как сделано у тебя:
- прибавляем проценты и комиссию к остатку долга
- платим 5000 (или остаток который был на конец предыдущего месяца)
Давай, попробуй еще что-нибудь поменять в коде.
Смотри, сначала надо представить как вообще работают сайты и браузер. А работают они так:
Когда ты вводишь адрес сайта или переходишь по ссылке, браузер отправляет на сервер, который обслуживает сайт, запрос и просит дать ему код страницы.
Браузер и сервер общаются друг с другом, используя протокол HTTP. Протокол — это что-то вроде языка, на котором браузер и сервер общаются друг с другом. Браузер может отправлять запросы, а сервер — отвечать на них. Сторону, которая отправляет запрос, называют еще клиентом, потому можно сказать, что браузер — это HTTP-клиент.
С помощью HTTP можно как получать данные с сервера, например, веб-страницу, файл или картинку, так и отправлять на сервер, например, текст комментария или поста. Запросы в HTTP всегда делаются по инициативе браузера — браузер их посылает, а сервер отвечает.
Так вот, браузер посылает запрос, а сервер в ответ посылает ему страницу с текстом в формате HTML, которую браузер отображает на экране.
Откуда сервер берет HTML-страницы? Есть 2 варианта.
Страницы бывают 2 видов: статические (неизменные) и динамические.
Статические сраницы — это обычные HTML-файлы, которые вебмастер создал в редакторе и загрузил на сервер. Статические страницы и сайты неизменные — на них всегда отображается одна и та же информация, пользователь не может ни отправить комментарий, ни что-то сделать еще. Эта технология годится только для сайтов их нескольких страничек, где ничего не меняется само по себе.
Динамические страницы не хранятся на диске, а генерируются программой на сервере при получении запроса. Программа может быть написана на разных языках, включая PHP (кроме PHP еще используют Руби, Питон, Яву, C#, Node.JS и много чего еще).
Обычно серверная программа (скрипт) хранит данные в базе данных. При получении запроса от браузера скрипт берет нужные данные из базы, выводит их в соответсвии с шаблоном и отправляет в браузер, который их отображает.
К примеру, форум или борда может хранить тексты постов в базе данных. При получении запроса на просмотр страницы она выбирает нужные посты, подставляет их в шаблон, и отдает в браузер. При получении запроса на добавление нового поста она сохраняет его текст в базу и отдает страницу с добавленным постом.
Мы будем изучать использование PHP на сервере для генерации страниц, и использование базы данных, но уже после прохождения учебника, в виде отдельных заданий. Для начала все-таки надо сам PHP выучить.
А, еще. Сами веб-страницы пишутся на 3 языках: HTML, CSS, JS.
HTML - это язык разметки текста, на котором пишутся веб-страницы. Он представляет собой обычный текст, в который вставляются специальные коды — теги:
Это пример <em>HTML</em> кода, а это <a href="http://google.com/">ссылка</a>
(посмотреть этот пример в действии: http://jsbin.com/yuducoyu/1/edit )
CSS — это язык стилей оформления. Он определяет, каким шрифтом должен выводиться текст, каким цветом, какую фоновую картинку использовать, какого размера должны быть блоки на странице, промежутки между ними и как они располагаются. То есть задает внешний вид.
JavaScript (не путай с явой) — это простой язык для написания скриптов (программ), которые выполняются в браузере. Они могут реагировать на разные события, например, нажатия кнопок, движение мыши, и делать что-то со страницей, показывать/скрывать блоки на ней, делать анимации и многое другое. Например, сайт «яндекс карты» содержит очень много кода на языке JS. На Js можно даже написать игру.
Смотри, сначала надо представить как вообще работают сайты и браузер. А работают они так:
Когда ты вводишь адрес сайта или переходишь по ссылке, браузер отправляет на сервер, который обслуживает сайт, запрос и просит дать ему код страницы.
Браузер и сервер общаются друг с другом, используя протокол HTTP. Протокол — это что-то вроде языка, на котором браузер и сервер общаются друг с другом. Браузер может отправлять запросы, а сервер — отвечать на них. Сторону, которая отправляет запрос, называют еще клиентом, потому можно сказать, что браузер — это HTTP-клиент.
С помощью HTTP можно как получать данные с сервера, например, веб-страницу, файл или картинку, так и отправлять на сервер, например, текст комментария или поста. Запросы в HTTP всегда делаются по инициативе браузера — браузер их посылает, а сервер отвечает.
Так вот, браузер посылает запрос, а сервер в ответ посылает ему страницу с текстом в формате HTML, которую браузер отображает на экране.
Откуда сервер берет HTML-страницы? Есть 2 варианта.
Страницы бывают 2 видов: статические (неизменные) и динамические.
Статические сраницы — это обычные HTML-файлы, которые вебмастер создал в редакторе и загрузил на сервер. Статические страницы и сайты неизменные — на них всегда отображается одна и та же информация, пользователь не может ни отправить комментарий, ни что-то сделать еще. Эта технология годится только для сайтов их нескольких страничек, где ничего не меняется само по себе.
Динамические страницы не хранятся на диске, а генерируются программой на сервере при получении запроса. Программа может быть написана на разных языках, включая PHP (кроме PHP еще используют Руби, Питон, Яву, C#, Node.JS и много чего еще).
Обычно серверная программа (скрипт) хранит данные в базе данных. При получении запроса от браузера скрипт берет нужные данные из базы, выводит их в соответсвии с шаблоном и отправляет в браузер, который их отображает.
К примеру, форум или борда может хранить тексты постов в базе данных. При получении запроса на просмотр страницы она выбирает нужные посты, подставляет их в шаблон, и отдает в браузер. При получении запроса на добавление нового поста она сохраняет его текст в базу и отдает страницу с добавленным постом.
Мы будем изучать использование PHP на сервере для генерации страниц, и использование базы данных, но уже после прохождения учебника, в виде отдельных заданий. Для начала все-таки надо сам PHP выучить.
А, еще. Сами веб-страницы пишутся на 3 языках: HTML, CSS, JS.
HTML - это язык разметки текста, на котором пишутся веб-страницы. Он представляет собой обычный текст, в который вставляются специальные коды — теги:
Это пример <em>HTML</em> кода, а это <a href="http://google.com/">ссылка</a>
(посмотреть этот пример в действии: http://jsbin.com/yuducoyu/1/edit )
CSS — это язык стилей оформления. Он определяет, каким шрифтом должен выводиться текст, каким цветом, какую фоновую картинку использовать, какого размера должны быть блоки на странице, промежутки между ними и как они располагаются. То есть задает внешний вид.
JavaScript (не путай с явой) — это простой язык для написания скриптов (программ), которые выполняются в браузере. Они могут реагировать на разные события, например, нажатия кнопок, движение мыши, и делать что-то со страницей, показывать/скрывать блоки на ней, делать анимации и многое другое. Например, сайт «яндекс карты» содержит очень много кода на языке JS. На Js можно даже написать игру.
Примерно так и есть. Браузер посылает запрос на сервер, на нем запускается php-программа и то, что она выводит, отправляется назад в браузер и он отображает эту информацию. Соответсвтенно используя PHP, ты можешь отобразить на странице все, что угодно.
>>367097
Всего лишь второй? Это немного.
Смотри, у тебя в последний месяц анон платит 5000, и сразу же выплачивает 4139 остатка. А ведь он не может сразу это выплатить, он должен подождать месяц, за который набегут проценты и комиссии и итоговая сумма выйдет больше — не 49139, а около 61270.
Также, если поставить маленькую сумму кредита, например 1000, твоя программа не учтет это и все равно в первый месяц выплатит 5000, хотя достаточно заплатить 2030.
Попробуй переписать код внутри цикла примерно так:
- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
Если тебе трудно написать сразу, давай писать по частям:
- напиши код, который каждый месяц только увеличивает долг (и выводит его на экран)
- допиши к нему код, который каждый месяц пишет, большой сейчас долг (школьник не может его выплатить разом) или маленький (меньше 5000 и его можно выплатить за один раз)
- допиши код, который каждый месяц пишет, сколько надо заплатить в этом месяце (с учетом того что больше 5000 школьник заплатить не может)
- наконец, допиши код, который платит эту сумму, уменьшая долг и считает сколько всего выплачено
> кстати в заказе это описывается обычно, или нужно самому придумывать??
Хорошо, если дизайнер в макете нарисовал кнопку в нажатом состоянии и при наведении (кстати, не вижу у тебя подсвечивания при наведении). Если нет, придется самому что-то придумывать.
Делать эффекты при наведении и нажатии надо, чтобы пользователь чувствовал обратную связь, что это кнопка и что ее можно нажать.
В твоем случае, вот примеры эффектов для кнопок (наверняка где-нибудь пригодится):
http://tympanus.net/Development/CreativeButtons/
http://ianlunn.github.io/Hover/
http://www.sanwebe.com/2014/02/css3-buttons-examples-with-effects-animations (при клике на картинку с кнопками можно увидеть демо страницу и на ней понажимать их)
http://www.inserthtml.com/demos/css/button-styles/
Может, я уже их скидывал, не помню, но ознакомься, чтобы иметь представление, какие эффекты можно использовать для каких кнопок.
Для плоских кнопок наверно подойдет выделение цветом, как у тебя. Если ты посмотришь, то там обычно делают затемнение/осветление при наведении и опускают кнопку на 2-3 пикселя при нажатии. Еще можно сделать эффект «вжатия» в страницу (тут http://ianlunn.github.io/Hover/ он назван Box Shadow Inset — только лучше тень сделать не размытой, а с резкими краями). Еще можно делать эффект свечения (Glow), только не серым цветом.
На макете активная кнопка выделена, но серым цветом, а не ярко-красным.
Кстати, что касается круглых кнопок — там тень получилась слишком огромная, она должна быть меньше, и ее нет на макете. Предлагаю сделать эффект «вжатия» для них, добавляя сверху темную тень в 1-2 пикселя при нажатии. А при наведении можно делать их ярче и добавлять небольшой glow например.
Для пунктов меню можно сделать свечение при наведении и делать их темными в момент нажатия. Для кнопки see portfolio тоже надо что-то придумать.
Не забудь менять на кнопках и ссылках форму курсора мыши.
> У социальных кнопок края какие-то неровные и потертые получились.
Хорошо, что ты подметил. Действительно, края некрасивые. В этом легко убедиться если заменить картинку на background: yellow — получится идеальный круг.
Сначала я подумал что может быть у тебя PNG8 вместо PNG24 (нет, не так). Потом, что может быть сами картинки некачественные (не, с ними все норм). Потом, что виноват box-shadow или анимация (нет). И наконец в самом конце я заметил причину — border-radius. Он обрезает содержимое блока и края картинок (не забывай, что пиксели имеют конечные размеры. Те пиксели, которые оказываются на краю круга, меняют свою яркость и получается эффект рваных краев). Надо сделать чтобы кнопка была на 1-2 пикселя больше радиусом чем картинка.
Но это хорошо, что ты заметил. Верстальшик должен быть внимательным к мелочам.
А вот на качество иконок вверху ты внимания не обратил. Сравни качество на пикрелейтед. У тебя мыло какое-то.
Сравни вертикальные отступы на макете и на верстке около надписей:
Our Featured Works
Curabitur blandit tempus porttitor. Maecenas faucibus mollis interdum.
Они не совпадают.
Надпись «Get in Touch» не белая, а серая, померяй на макете пипеткой. Еще несколько ошибок на пикрелейтед.
> кстати в заказе это описывается обычно, или нужно самому придумывать??
Хорошо, если дизайнер в макете нарисовал кнопку в нажатом состоянии и при наведении (кстати, не вижу у тебя подсвечивания при наведении). Если нет, придется самому что-то придумывать.
Делать эффекты при наведении и нажатии надо, чтобы пользователь чувствовал обратную связь, что это кнопка и что ее можно нажать.
В твоем случае, вот примеры эффектов для кнопок (наверняка где-нибудь пригодится):
http://tympanus.net/Development/CreativeButtons/
http://ianlunn.github.io/Hover/
http://www.sanwebe.com/2014/02/css3-buttons-examples-with-effects-animations (при клике на картинку с кнопками можно увидеть демо страницу и на ней понажимать их)
http://www.inserthtml.com/demos/css/button-styles/
Может, я уже их скидывал, не помню, но ознакомься, чтобы иметь представление, какие эффекты можно использовать для каких кнопок.
Для плоских кнопок наверно подойдет выделение цветом, как у тебя. Если ты посмотришь, то там обычно делают затемнение/осветление при наведении и опускают кнопку на 2-3 пикселя при нажатии. Еще можно сделать эффект «вжатия» в страницу (тут http://ianlunn.github.io/Hover/ он назван Box Shadow Inset — только лучше тень сделать не размытой, а с резкими краями). Еще можно делать эффект свечения (Glow), только не серым цветом.
На макете активная кнопка выделена, но серым цветом, а не ярко-красным.
Кстати, что касается круглых кнопок — там тень получилась слишком огромная, она должна быть меньше, и ее нет на макете. Предлагаю сделать эффект «вжатия» для них, добавляя сверху темную тень в 1-2 пикселя при нажатии. А при наведении можно делать их ярче и добавлять небольшой glow например.
Для пунктов меню можно сделать свечение при наведении и делать их темными в момент нажатия. Для кнопки see portfolio тоже надо что-то придумать.
Не забудь менять на кнопках и ссылках форму курсора мыши.
> У социальных кнопок края какие-то неровные и потертые получились.
Хорошо, что ты подметил. Действительно, края некрасивые. В этом легко убедиться если заменить картинку на background: yellow — получится идеальный круг.
Сначала я подумал что может быть у тебя PNG8 вместо PNG24 (нет, не так). Потом, что может быть сами картинки некачественные (не, с ними все норм). Потом, что виноват box-shadow или анимация (нет). И наконец в самом конце я заметил причину — border-radius. Он обрезает содержимое блока и края картинок (не забывай, что пиксели имеют конечные размеры. Те пиксели, которые оказываются на краю круга, меняют свою яркость и получается эффект рваных краев). Надо сделать чтобы кнопка была на 1-2 пикселя больше радиусом чем картинка.
Но это хорошо, что ты заметил. Верстальшик должен быть внимательным к мелочам.
А вот на качество иконок вверху ты внимания не обратил. Сравни качество на пикрелейтед. У тебя мыло какое-то.
Сравни вертикальные отступы на макете и на верстке около надписей:
Our Featured Works
Curabitur blandit tempus porttitor. Maecenas faucibus mollis interdum.
Они не совпадают.
Надпись «Get in Touch» не белая, а серая, померяй на макете пипеткой. Еще несколько ошибок на пикрелейтед.
illustartion — опечатка
Как у тебя с JS кстати? Было бы неплохо сделать фильтрацию портфолио, да еще и с анимацией при нажатии кнопок.
Надо бы еще наверно на портфолио сжделать выезжающие снизу подсказки на темном полпрозрачном фоне, а то страница какая-то неактивная.
Дан текст. Выведите список «N самых часто встречающихся слов или сочетаний слов». Сочетания слов могут состоять из 2 или 3 слов. К примеру, для текста
> Эта функция сортирует массив в обратном порядке таким образом, что сохраняются отношения между ключами и значениями. Сохраняются отношения и сохраняются отношения и еще сохраняются отношения и опять сохраняются отношения.
Самым часто встречающимся сочетанием будет «сохраняются отношения». При этом слова «сохраняются» и «отношения» уже выводить по отдельности в список не надо.
К БД может подсоединяться много пользователей и работать параллельно, проблем никаких нет.
Если работать на чтение, то с файлами тоже проблем нет − читать файл может сколько угодно процессов параллельно, он по умолчанию не блокируется.
Соответственно, ответ «второй процесс будет работать».
А вот если писать в файл, то будут проблемы — один процесс может поменять файл, и второй прочитает часть старых данных, часть новых, вперемешку. Это плохо, потому надо предпринимать какие-то меры — например, заблокировать файл на время записи — в этом случае никто другой не может получить к нему доступ и будет ждать либо получить ошибку.
Для блокировки можно использовать функцию http://www.php.net/manual/ru/function.flock.php
Если же ты хочешь запретить запуск 2 процессов, то можно сделать специальный файлик, в него пишем время запуска, при завершении процесса удаляем. Соответственно ты должен проверить, есть ли такой файл, если есть значит процесс уже запущен, если есть но в нем старая дата — значит процесс либо завис либо умер, не удалив файл.
Не забывай блокировать файл на запись, иначе 2 процесса могут увидеть что файла нет и запуститься параллельно.
> новый экземпляр программы будет пытаться использовать уже открытые ресурсы
Нет. Каждый процесс скрипта независим и устанавливает свое соединение с БД, свои дескрипторы открытых файлов, свои пермеенные, в общем они независимы друг от друга.
Я же только начал учить js. Опять же могу пока на нем только логические задачи решать.
Оп, а как лучше сравнивать макет и страницу? Можно наложить как-нибудь psd на готовый вариант?
Да и наверное ожидается, что будет эффект, как на кинопоиске при наведении на постер, например тут, http://www.kinopoisk.ru/film/736206/ Но я так не умею. Я бы тогда эту страницу для портфолио использовал.
window писать не обязательно?
Занялся js все-таки.
<?php
$fp2 = fopen('1.css','w');
$fp2 = fopen("1.css", "a");
$mytextcss = "
h1 {
color: #ff0000;
}\r\n";
$css = fwrite($fp2, $mytextcss);
if ($css) {
echo 'File CSS has been successfuly written.';
} else {
echo 'An error during recording';
}
$fp = fopen('1.html','w');
$fp = fopen("1.html", "a");
$mytexthtml = "<html>
<style type="text/css" href="1.css">
<h1>WIN?</h1>
</style>
</html>\r\n";
$html = fwrite($fp, mytexthtml);
?>
<?php
$fp2 = fopen('1.css','w');
$fp2 = fopen("1.css", "a");
$mytextcss = "
h1 {
color: #ff0000;
}\r\n";
$css = fwrite($fp2, $mytextcss);
if ($css) {
echo 'File CSS has been successfuly written.';
} else {
echo 'An error during recording';
}
$fp = fopen('1.html','w');
$fp = fopen("1.html", "a");
$mytexthtml = "<html>
<style type="text/css" href="1.css">
<h1>WIN?</h1>
</style>
</html>\r\n";
$html = fwrite($fp, mytexthtml);
?>
ОП, а как сделать ограничение по времени? Нашел вот такую статью http://habrahabr.ru/post/66160/, но ни черта не получилось воспроизвести. Вместо id процесса мне всегда приходит пустая строка. А даже если приходила бы - разве серверы разрешают вот так лазить в процессах? И потом - на сервере же теоретически может стоять какая угодно ОС, получается, нам изначально нужно затачивать приложение под него? А если в процессе работы решат выкладывать приложение на другом, всё переделывать? Я ничего не понимат.
fopen два раза подряд на каждый файл использовать не надо, достаточно будет использовать тип 'w'(только для записи файлов).
> $mytexthtml = "<html><style type="text/css" href="1.css">
Прерываешь строку своими же двойными кавычками, используй внутри строки одинарные, например :
"<html><style='text/css'"
Сначала высчитываем баланс, потом проверка условия, потом тотал пеймент, не?
Тут конечно не помешало бы, хотя бы в общих чертах, изучить как вообще работает взаимодействие между процессами в linux/windows.
То, что в статье на хабре — велосипеды и костыли. Человек явно не разбирается толком в линуксе и PHP. Там используются временные файлы, которые надо не забыть удалять, хотя можно перенаправить вывод и ввод дочернего процесса в пайпы без использования диска (пайпы — это каналы для передачи данных между процессами, они есть и в linux и в windows. Один процесс пишет данные в пайп, а другой их читает. Так как у процесса есть 3 стандартных канала - ввод, вывод и вывод ошибок, то нужно использовать 3 пайпа).
Использование пайпов еще имеет то преимущство, что если PHP скрипт упадет с ошибкой, то пайп закроется, и внешняя программа при попытке продолжать выводить в него данные получит в линуксе сигнал SIGPIPE, который ее скорее всего прибьет (сигнал — это специальное сообщение, которое ОС может направлять процессу, для уведомления о разных событиях, в linux используется более 30 видов сигналов: http://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB%D1%8B_(UNIX) )
Запускать внешний процесс ты скорее всего будешь через proc_open() или popen(). Эти команды запускают дочерний процесс, а его ввод и вывод подключают к пайпам (каналы для передачи данных между процессами), из которых ты можешь читать то, что он выводит. Соответственно, в процессе чтения ты
можешь считать сколько байт передано, и склоько времени прошло.
Правда, подсчет времени сработает только если процесс что-то выводит, иначе функция чтения из пайпа тоже подвиснет на неопределенное время. Чтобы это обойти, надо сделать файловый дескриптор неблокирующим (и под windows он все равно останется блокирующим, если мне не изменяет память), но это давай оставим на потом.
Убить процесс в linux можно, послав ему один из сигналов SIGTERM (просьба завершить выполнение) или SIGKILL (принудительное завершение, этот сигнал нельзя перехватить или проигнорировать) с помощью функции posix_kill().
Также, есть кроссплатформенная (?) функция proc_terminate() для завершения процесса. Она наверно лучше подойдет.
> И потом - на сервере же теоретически может стоять какая угодно ОС, получается, нам изначально нужно затачивать приложение под него?
Ну хорошо бы конечно специфичные для ОС функции вынести отдельно так, чтобы работало и под win и под linux.
> Вместо id процесса мне всегда приходит пустая строка.
Там код рассчитан только на linux, в частности конструкция
& echo $!
Я же говорю, автор не осилил даже изучить функцию proc_open и лепит костыли.
> А даже если приходила бы - разве серверы разрешают вот так лазить в процессах?
тут нет никакого лазанья, он запускает процесс и командой echo (не php-командой, а bash-командой) выводит его id. А так, обычно на сервере права доступа опредеяются пользователем, если процесс запущены одним пользователем то скорее всего могут «лазать» друг в друга.
Тут конечно не помешало бы, хотя бы в общих чертах, изучить как вообще работает взаимодействие между процессами в linux/windows.
То, что в статье на хабре — велосипеды и костыли. Человек явно не разбирается толком в линуксе и PHP. Там используются временные файлы, которые надо не забыть удалять, хотя можно перенаправить вывод и ввод дочернего процесса в пайпы без использования диска (пайпы — это каналы для передачи данных между процессами, они есть и в linux и в windows. Один процесс пишет данные в пайп, а другой их читает. Так как у процесса есть 3 стандартных канала - ввод, вывод и вывод ошибок, то нужно использовать 3 пайпа).
Использование пайпов еще имеет то преимущство, что если PHP скрипт упадет с ошибкой, то пайп закроется, и внешняя программа при попытке продолжать выводить в него данные получит в линуксе сигнал SIGPIPE, который ее скорее всего прибьет (сигнал — это специальное сообщение, которое ОС может направлять процессу, для уведомления о разных событиях, в linux используется более 30 видов сигналов: http://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB%D1%8B_(UNIX) )
Запускать внешний процесс ты скорее всего будешь через proc_open() или popen(). Эти команды запускают дочерний процесс, а его ввод и вывод подключают к пайпам (каналы для передачи данных между процессами), из которых ты можешь читать то, что он выводит. Соответственно, в процессе чтения ты
можешь считать сколько байт передано, и склоько времени прошло.
Правда, подсчет времени сработает только если процесс что-то выводит, иначе функция чтения из пайпа тоже подвиснет на неопределенное время. Чтобы это обойти, надо сделать файловый дескриптор неблокирующим (и под windows он все равно останется блокирующим, если мне не изменяет память), но это давай оставим на потом.
Убить процесс в linux можно, послав ему один из сигналов SIGTERM (просьба завершить выполнение) или SIGKILL (принудительное завершение, этот сигнал нельзя перехватить или проигнорировать) с помощью функции posix_kill().
Также, есть кроссплатформенная (?) функция proc_terminate() для завершения процесса. Она наверно лучше подойдет.
> И потом - на сервере же теоретически может стоять какая угодно ОС, получается, нам изначально нужно затачивать приложение под него?
Ну хорошо бы конечно специфичные для ОС функции вынести отдельно так, чтобы работало и под win и под linux.
> Вместо id процесса мне всегда приходит пустая строка.
Там код рассчитан только на linux, в частности конструкция
& echo $!
Я же говорю, автор не осилил даже изучить функцию proc_open и лепит костыли.
> А даже если приходила бы - разве серверы разрешают вот так лазить в процессах?
тут нет никакого лазанья, он запускает процесс и командой echo (не php-командой, а bash-командой) выводит его id. А так, обычно на сервере права доступа опредеяются пользователем, если процесс запущены одним пользователем то скорее всего могут «лазать» друг в друга.
Есть расширения к браузеру (искать можно по словам pixel perfect) которые позволяют наложить png на страницу, но я бы не советовал слишком фанатично гнаться за пиксел перфект, так как шрифты в разных ОС рендерятся по разному и текст может в высоту и в ширину различаться на несколько пикселей. Плюс, верстка может зависеть от ширины окна браузера.
Можешь попробовать каким-нибудь воспользоваться. Помни, что браузерные расширения могут быть вредоностными, так что лучше ставить их не на основной браузер или внимательно проверять автора расширения.
Обращать внимание надо не на попиксельное соответствие, а на выравнивание (блоки выровнены друг с другом или нет), отступы (в футере между строками текста одинаковые промежутки - и в верстке должно быть так же). Лучше всего научиться видеть такие вещи и соответственно видеть, когда они нарушаются.
>>367192
Ну нет, я имел в виду другой эффект: http://demo.hongkiat.com/css3-image-captions/index.html — напрмер, первый эффект отсюда. Он вроде на чистом CSS, его то можно сделать наверно?
То, что на кинопоиске — это другое, оно используется для показа большой версии картинки и тут неприменимо, так как у нас картинки по задумке ведут на отдельную страницу при клике.
Жаль, что ты пока JS не изучил конечно.
А, и еще, в transition не пиши all, пиши конкретные свойства, которые анимируются.
Еще location.replace() есть. Вроде да, одно и то же.
location и window.location по сути одно и то же так как глобальные переменные являются элементами глобального объекта window. То есть если ты напишешь
a = 1;
То window.a будет тоже равно 1.
>>367216
Почти в каждой строке. Анон выше все правильно написал.
>>367251
Там есть фраза:
> Если тебе трудно написать сразу, давай писать по частям:
Если трудно, пиши по частям, и когда зайдешь в тупик, запости свой код, я скажу что дальше надо сделать. В общем, покажи код, который ты написал (не скопировал, а написал) без него дать совет трудно.
>Запускать внешний процесс ты скорее всего будешь через proc_open() или popen()
Через exec запускал. функция proc_open() меня напугала и, если честно, увидел, что есть вариант попроще и не захотел в ней разбираться. Ну вот в итоге просрал кучу времени
Наоборот, proc_open как раз придумана для таких случае когда надо запустить подконтрольный нам процесс.
Там есть пример #1 в мануале, можешь начать с него. Но он читает только данные со стандартного вывода (дескриптор 1), и не читает поток ошибок (дескриптор 2). Читать одновременно эти оба потока через stream_get_contents() не выйдет, так как это блокирующий вызов (блокирующий значит что он ждет данных сколько угодно времени), и если ты например таким кодом читаешь данные:
$stdout = stream_get_contents($pipes[1]); // PHP ждет в этой строчке пока процесс не выведет все, что хотел и не завершится, закрыв тем самым пайп со своей стороны
$stderr = stream_get_contents($pipes[2]);
А процесс в это время пишет большой объем данных в поток ошибок (из которого мы ничего не читаем пока), то рано или поздно буфер пайпа заполнится и процесс заисвнет в ожидании пока PHP его прочитает. А PHP сидит в первой строчке и ждет данных на стандартном выводе.
Потому тут надо делать неблокирующее чтение, через stream_select() и читать по очереди из обоих пайпов.
Я наверно плохо объяснил, но не бойся, как ты до этого момента дойдешь, я поясню поподробнее.
Код:
http://pastebin.com/cd3ZQdDR
Ошибка следующая:
Notice: Undefined offset: 1
Попытки дебажить:
print_r($substrings[$i]);
Результат:
me)second
print_r($tmp_exploded);
Результат:
Array ( [0] => me [1] => second )
Под индексом 1 в массиве $tmp_exploded же есть элемент, с чего ошибке-то вылезать?
В $tmp все пишется верно, обе части строки плюс скобочка к первой, как будто ошибки никакой и нет.
http://ideone.com/fCeQKT
((((((((
харча
Тебе бы про основы HTML почитать, у тебя нет обязательных тэгов <head> и <body> даже. <h1> при этом должен находится в <body>, в <head> должен быть тэг <link> вместо <style>, если ты подгружаешь стили, а не пишешь их в том же файле.
http://jsbin.com/qawewimi/1/edit?js,console
Оп, я не думал, что тут у меня будут трудности.
Оп, дай мне лучше пока задачу на Function Declaration и Function Expression. Забывается все, нужно также набить руку.
А хотя лучше вообще с низов что-нибудь.
"к ооп в рнр нет царского пути" - главпетух
Ты весь код уж кидай, и на ideone, что бы сразу все видеть.
В оп посте ссылка на сайт. Имхо - короче и доступнее чем там, а главное с задачами, нет нигде.
Твоя регулярка найдет либо номер где нету скобок, либо тот где в скобки заключено 10 чисел. Врубаешься к чему я?
И когда фиксишь код, лучше заливай по новой, а не правь уже залитый, так как я не оп и вообще нуб прошедший все регулярки от опа. Лучше будет если все таки и оп сможет убедится что тебе херни не насоветовали. В данном случае конечно все элементарно, но на будущее.
Спасибо, учту. Чтобы код не перезаписывался надо вместо редактирования fork нажимать?
Да, можно и fork.
> (int) тут не нужен, floor и так вернет целое число.
Документация php(http://www.php.net/manual/ru/function.floor.php) и моя IDE PhpStorm говорят обратное. Когда я набирал код, ide сказала мне что нельзя пихать float на место ключа $spelling[$key]. Да и офф сайт говорит что возвращается число с плавающей точкой.
Боюсь, что до тонкостей stream_select() не доберусь вообще, proc_open() не доходит до меня совершенно. В exec() я передавал команду вида <путь к 7z.exe> <команда> <свич> <путь к архиву>, но в proc_open() она работать не хочет, без ошибок выполняется только запуск программы. Судя по примеру в документации и другим, что находил, в самой proc_open() процесс только запускаем, а все остальные команды надо передавать в pipe, но как, если после выполнения 7z.exe кажется, что вообще нет никакого видимого процесса, с которым можно работать?
> Ну и еще, я бы попробовал упростить место, где if вложен внутрь if, может можно его одноуровневым сделать?
http://ideone.com/idlAIw
Какой именно? Или все можно упростить? Честно говоря не представляю как. Ведь вложенный if нужен везде для обработки разных ситуаций с одним и тем же числом. Например сотня. Две ситуации - числа после нее не равны нулю и тогда мы идем дальше, или равны - тогда сразу же возвращаем значение. Так и везде в принципе.
Я тут сейчас Котерова во время еды почитываю. Глава 21 посвящена запуску внешних утилит. Там про все функции расписано и приведены примеры как работать с процессами.
http://rutracker.org/forum/viewtopic.php?t=2055655
Благодарю.
Поясните в чем я ошибся?
Что вообще надо, чтобы угореть по хипстерской хуйни?
Где искать свежую инфу?
Делитесь сайтиками/бложиками.
Твоя регулярка говорит нам - искать любую букву ИЛИ символ пробела встречающиеся от 1 до бесконечности раз. Как трактуется тут символ ^ я вообще хз. Я знаю только про то что в начале регулярки этот символ означает то что надо искать все что после него в начале строки. Еще ^ бывает в начале квадратных скобках, что означает НЕ[^0-9] - Искать все кроме цифр. В общем после этого непонятног оместа у тебя идет указание искать запятую после которой идет что либо кроме пробела и переноса строки, после чего должен идти пробел(ты его там поставил) и после всего этого дела снова любая буква ИЛИ символ пробела встречающиеся от 1 до бесконечности раз.
Если убрать не понятно зачем впихнутый ^, то твоя регулярка сочтет этот текст верным.
Мне нужно исключить запятую с любым символом после неё кроме пробела, но я не знаю, как объеденить в отрицании два условия. если я поставлю [^, \\s] это будет значить "не запятую или не любой символ кроме пробела", а мне нужно "не запятая и не любой символ кроме пробела". Чтобы если после запятой был пробел, то программа не выдавала ошибки и соответственно выдавала в остальных случаях.
Лолшта?
Может проще искать ошибки, а не верный текст? Так например ты найдешь запятую после которой забыли поставить пробел - (,\\S) или так ,[^ ] например.
По этой хуйне даже отдельная книга есть, представляешь. Целая книга по регулярным выражением, настолько эта тема обширна.
Я конечно не являюсь гуру, но спустя неделю-
две занятий более менее сносно читаю и понимаю регулярки. Тут главное практика. Ничего в них такого адского нет, куча всяких наворотов конечно есть аля (test)\1 (ищет testtest) или утверждения, но по тиху если не сдаваться то все становится более чем понятно.
>>367599
К слову о книге. 600 страниц не так уж много учитывая что обычно книги посвященные проге от 1000 страниц. И лично мне помогло чтение Фридл - Регулярные выражения совместно с решением задач опа.
А какие книги ты уже осилил? Я вот прочитал Никсона, а что дальше читать не знаю. Чувсвтую что знаний маловато, даже не на все оповские задачки хватает.
Книги как дополнение но не в коем случае не замена. Перед сном, во время нямки почитываю, подмечаю какие функции бывают. Запоминать смысла нет, как столкнусь с проблемой буду знать что гуглить и где искать. Писать код, писать и еще раз писать. К слову сказать у опа вся инфа есть на сайте, нужная для его же задачек. Так что перечитывай еще раз вдумчиво.
На данный момент я прочел около 100 страниц из книги про регулярки и 400 из котерова. Задачки получше будут имхо.
Но это все мое имхо конечно, лично я считаю чтение второстепенным если хочешь уметь писать код.
Чтение книг*
http://www.php.net/
Если не понятно до конца как что то работает в php дуй на офф сайт. Там подробно каждая функция разложена, с примерами использования.
Дописал уже весь скрипт. Не проверяй все что выше в этой ветке.
Тут все вместе взятое
http://ideone.com/gG3PLo
Наткнулся вот на такую статью http://ru.wikipedia.org/wiki/Командная_строка_ARC
и теперь кажется, что истина где-то рядом проблема где-то в этой области. Только хз, куда дальше копать.
Не советую сохранять код на pastebin, он запрещен у некоторых провайдеров в Империи за распространение нехорошей информации, лучше на ideone заливайте например или любой другой пастебин.
> Под индексом 1 в массиве $tmp_exploded же есть элемент, с чего ошибке-то вылезать?
Может он иногда есть, а иногда нет. Когда ты проверяешь, он есть, а в программе попадается строка где его нет. Поставь проверку например через if (count(...) < 2) чтобы она в этом случае делала var_dump() и сам проверь.
Ну или если не найдешь сам, запости свой код на ideone чтобы эта ошибка была видна, я проверю.
>>367297
Считает хорошо, согласен. Но код стоит улучшить.
> $creditBalance = $creditBalance - $creditBalance;
Тебе не кажется что проще тут написать $creditBalance = 0?
> $creditBalance * $percent + $servicePayment
Это выражение повторяется несколько раз. Копипаста — зло. Избавься от повторов (можешь в самом начале цикла например это значение сохранять назад в переменную creditBalance).
> $paymentTotal = $paymentTotal + $monthlyPayment;
тут можно использовать +=, будет короче.
Чтобы вставить в программу большой текст, содержащий кавычки (HTML, CSS код), удобно использовать такой способ, как nowdoc (мануал: http://www.php.net/manual/ru/language.types.string.php#language.types.string.syntax.nowdoc ). Посмотри мануал, там пример есть.
Вместо fopen/fwrite/fclose удобнее использовать одну функцию, которая делает все сразу одной строчкой: file_put_contents (детали в мануале).
Пустой экран у тебя из-за плохого знания HTML. Посмотри внимательно:
<style>...<h1>
Кто внутри тега стайл пишет h1? Почитай мануал про этот тег: http://htmlbook.ru/html/style
Алсо, <styleml> — что это за тег? Сам придумал?
В общем, жду исправленный код.
Анон, спасибо за совет, но ты немного ошибся. В HTML4 тег body не обязателен — если его пропустить, браузер сам должен его добавить как только увидит любой тег или текст. В HTML5 пошли еще дальше и сделали head тоже необязательным, его браузер сам подставит если увидет теги вроде title которые могут быть только в head.
Пруф: http://www.whatwg.org/specs/web-apps/current-work/multipage/semantics.html#the-head-element
> A head element's start tag can be omitted if the element is empty, or if the first thing inside the head element is an element.
http://www.whatwg.org/specs/web-apps/current-work/multipage/sections.html#the-body-element
> A body element's start tag can be omitted if the element is empty, or if the first thing inside the body element is not a space character or a comment, except if the first thing inside the body element is a meta, link, script, style, or template element.
Ну и тег html тоже:
> An html element's start tag can be omitted if the first thing inside the html element is not a comment.
Если код начинается не с комментария, то можно html пропустить (в случае комментария — неясно, до html или после он идет).
Но лучше конечно всегда их писать, аккуратнее получается.
А вот что нельзя пропускать — так это доктайп в самом начале. Без него браузер переключится из режима поддержки стандартов в режим совместимости с древнимии сайтами, сделанными до 2000 года (quirks mode) и скорее всего страница будет выглядеть неправильно, опявятся лишние отступы.
http://ideone.com/9DTfoZ - "Пиши верно"
http://ideone.com/vLGeDf - "Yoda"
В задаче на пропись не могу понять, как применять эту функцию для чисел больше 999 -> http://ideone.com/KC3yZc
Кстати, ещё у меня возник вопрос по поводу ЛОГИЧЕСКОГО ОПЕРАТОРА "!". Я пытался его использовать вместо выражений != вот тут -> http://ideone.com/jfPCsE, так как их слишком много, но у меня ничего не вышло. Как его применять в коде? Или как сократить число "!="?
И ешё один вопрос по ++x и x++, особенно ++x, поскольку у тебя на сайте это не объясняется. Где такая запись может применяться и нахуя она вообще нужна?
Напомню другим анонам, если кому интересно, к каким задачкам это решения. Это задачки для изучающих яваскрипт, тема «функции и замыкания».
Задание 1. Напиши функцию создания генератора sequence(). Она при вызове возвращает другую функцию-генератор, которая при каждом вызове дает число на 1 больше, и так до бесконечности: Начальное число, с которого начинать отсчет, и шаг, задается при создании генератора. Шаг можно не указывать, тогда он будет равен одному. Начальное значение по умолчанию равно 0.
var generator = sequence(10, 3);
console.log(generator()); // 10
console.log(generator()); // 13
console.log(generator()); // 16
console.log(generator()); // 19
Задание 2. Также, нужна функция take(gen, x) которая вызвает функцию gen заданное число (x) раз и возвращает массив с результатами вызовов. Она нам пригодится для отладки:
var gen2 = sequence(0, 2);
console.log(take(gen2, 5)); // [0, 2, 4, 6, 8 ]
Теперь по поводу решения.
> return function counter(startCount, newCount) {
Неверно: ты должен вернуть функцию без аргументов, то есть просто function()
Соответственно, код должен значительно упроститься. Общая идея у тебя верная, просто убери лишнее.
Там ошибка Line 8: Missing semicolon. Ты пропустил точку с запятой.
Если тебе интересно, почему возвращается NaN, то смотри: ты возвращаешь и сохраняешь в counter функцию с 2 аргументов, но вызвыаешь ее не указывая их:
console.log(counter());
В JS в функцию можно передавать при вызове как больше, так и меньше аргументов, это не вызвает ошибок. Соответственно в этой функции currentCount = step = undefined
В функции ты пытаешься сложить их, а сумма 2 undefined дает нам NaN: http://jsbin.com/qawewimi/2/edit
В общем, все твои беды в этой задаче из-за того, что ты добавил анонимной функции 2 аргумента. Убери их.
Давай добьем эти задачи, у меня там дальше еще несколько есть, если трудности, то напиши, будем разбираться.
Напомню другим анонам, если кому интересно, к каким задачкам это решения. Это задачки для изучающих яваскрипт, тема «функции и замыкания».
Задание 1. Напиши функцию создания генератора sequence(). Она при вызове возвращает другую функцию-генератор, которая при каждом вызове дает число на 1 больше, и так до бесконечности: Начальное число, с которого начинать отсчет, и шаг, задается при создании генератора. Шаг можно не указывать, тогда он будет равен одному. Начальное значение по умолчанию равно 0.
var generator = sequence(10, 3);
console.log(generator()); // 10
console.log(generator()); // 13
console.log(generator()); // 16
console.log(generator()); // 19
Задание 2. Также, нужна функция take(gen, x) которая вызвает функцию gen заданное число (x) раз и возвращает массив с результатами вызовов. Она нам пригодится для отладки:
var gen2 = sequence(0, 2);
console.log(take(gen2, 5)); // [0, 2, 4, 6, 8 ]
Теперь по поводу решения.
> return function counter(startCount, newCount) {
Неверно: ты должен вернуть функцию без аргументов, то есть просто function()
Соответственно, код должен значительно упроститься. Общая идея у тебя верная, просто убери лишнее.
Там ошибка Line 8: Missing semicolon. Ты пропустил точку с запятой.
Если тебе интересно, почему возвращается NaN, то смотри: ты возвращаешь и сохраняешь в counter функцию с 2 аргументов, но вызвыаешь ее не указывая их:
console.log(counter());
В JS в функцию можно передавать при вызове как больше, так и меньше аргументов, это не вызвает ошибок. Соответственно в этой функции currentCount = step = undefined
В функции ты пытаешься сложить их, а сумма 2 undefined дает нам NaN: http://jsbin.com/qawewimi/2/edit
В общем, все твои беды в этой задаче из-за того, что ты добавил анонимной функции 2 аргумента. Убери их.
Давай добьем эти задачи, у меня там дальше еще несколько есть, если трудности, то напиши, будем разбираться.
У меня есть урок для начинающих по ООП: http://archive-ipq-co.narod.ru/l1/pasta.html
После него можно почитать «Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования», главы про ООП.
>>367378
Погугли «php блог mvc», а так какой-то конкретной ссылки у меня нет. А так, у нас есть задание сделать борду на микрофреймворке Slim, вот верстка: https://github.com/codedokode/board-markup можешь попробовать сделать, если хочешь.
А, вспомнил. Если тебя интересуют взрослые фреймворки, почитай про Symfony 2. Там к нему есть туториал http://symfony.in.ua/symfony2-jobeet-tutorial.html — там последовательно разбирается создание сайта на нем с использованием MVC.
Хотя, конечно, он не совершенен, там многое не объясняется, например:
> Как и Symfony 1.x, Symfony2 поставляется вместе с компонентом консоли, который будет использоваться для различных задач. Для просмотра списка опций и доступных команд, наберите в командной строке...
Не упомянуто что делать это надо в корневой папке проекта. И не упомянуто как вообще пользоваться командной строкой. А у меня как раз есть паста на эту тему: https://gist.github.com/codedokode/10539568
(паста)
Смотри, у тебя в последний месяц анон платит 5000, и сразу же выплачивает 4139 остатка. А ведь он не может сразу это выплатить, он должен подождать месяц, за который набегут проценты и комиссии и итоговая сумма выйдет больше — не 49139, а около 61270.
Также, если поставить маленькую сумму кредита, например 1000, твоя программа не учтет это и все равно в первый месяц выплатит 5000, хотя достаточно заплатить 2030.
Надо смотреть чему равен остаток долга и обрабатывать ситуацию, когда она маленький, а не выплачивать сразу же 5000 вот в этом месте: $creditBalance = $creditBalance - $monthlyPayment;
Попробуй переписать код внутри цикла примерно так:
- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
Если тебе трудно написать сразу, давай писать по частям:
- напиши код, который каждый месяц только увеличивает долг (и выводит его на экран)
- допиши к нему код, который каждый месяц пишет, большой сейчас долг (школьник не может его выплатить разом) или маленький (меньше 5000 и его можно выплатить за один раз)
- допиши код, который каждый месяц пишет, сколько надо заплатить в этом месяце (с учетом того что больше 5000 школьник заплатить не может)
- наконец, допиши код, который платит эту сумму, уменьшая долг и считает сколько всего выплачено
няша
Но учтите, что для изучения Symfony 2 надо кроме туториала:
- знать ООП на среднем уровне
- знать базы данных на среднем уровне
- знать HTML/CSS/JS на начальном уровне
- иметь представление о шаблонизаторе twig или быть готовым прочесть мануал по нему
- иметь представление о том что такое ORM и как он работает (ORM — это штука, которая позволяет сохранять в базу данные из объектов и загружать данные из базы прямо в объекты без написания sql-запросов, очень удобно)
- быть знакомым с Doctrine либо быть готовым прочесть мануал по ней
- быть готовым постоянно лезть в документацию Symfony и гугл
>>367472
Я вижу ты уже исправил код. Хорошо, но этого недостаточно для решения задачи.
Задачу про номера телефонов надо проверить на большом числе телефонов, чтобы убедиться что твой код правильный. Но руками подставлять номера — долго и скучно. Пусть работает робот, а не человек! Давай-ка научимся основам автоматического тестирования и заставим железяку проверять саму себя.
Для этого давай добавим в программу тесты, чтобы сразу было видно, верно все работает или нет. Сделай 2 списка номеров (правильные и нет), добавь их в программу и напиши цикл, который их по очереди прогоняет через регулярку и проверяет что они определяются как надо (если нет — надо вывести какой именно номер не распознается правильно).
Вот список номеров:
Правильные: array('84951234567', '+74951234567', '8-495-1-234-567', ' 8 (8122) 56-56-56', '8-911-1234567', '8 (911) 12 345 67', '8-911 12 345 67', '8 (911) - 123 - 45 - 67', '+ 7 999 123 4567', '8 ( 999 ) 1234567', '8 999 123 4567');
Неправильные: array('02', '84951234567 позвать люсю', '849512345', '849512345678',
'8 (409) 123-123-123', '7900123467', '5005005001', '8888-8888-88',
'84951a234567', '8495123456a',
'+1 234 5678901', // неверный код страны
'+8 234 5678901', // либо 8 либо +7
'7 234 5678901' // нет +
);
Но учтите, что для изучения Symfony 2 надо кроме туториала:
- знать ООП на среднем уровне
- знать базы данных на среднем уровне
- знать HTML/CSS/JS на начальном уровне
- иметь представление о шаблонизаторе twig или быть готовым прочесть мануал по нему
- иметь представление о том что такое ORM и как он работает (ORM — это штука, которая позволяет сохранять в базу данные из объектов и загружать данные из базы прямо в объекты без написания sql-запросов, очень удобно)
- быть знакомым с Doctrine либо быть готовым прочесть мануал по ней
- быть готовым постоянно лезть в документацию Symfony и гугл
>>367472
Я вижу ты уже исправил код. Хорошо, но этого недостаточно для решения задачи.
Задачу про номера телефонов надо проверить на большом числе телефонов, чтобы убедиться что твой код правильный. Но руками подставлять номера — долго и скучно. Пусть работает робот, а не человек! Давай-ка научимся основам автоматического тестирования и заставим железяку проверять саму себя.
Для этого давай добавим в программу тесты, чтобы сразу было видно, верно все работает или нет. Сделай 2 списка номеров (правильные и нет), добавь их в программу и напиши цикл, который их по очереди прогоняет через регулярку и проверяет что они определяются как надо (если нет — надо вывести какой именно номер не распознается правильно).
Вот список номеров:
Правильные: array('84951234567', '+74951234567', '8-495-1-234-567', ' 8 (8122) 56-56-56', '8-911-1234567', '8 (911) 12 345 67', '8-911 12 345 67', '8 (911) - 123 - 45 - 67', '+ 7 999 123 4567', '8 ( 999 ) 1234567', '8 999 123 4567');
Неправильные: array('02', '84951234567 позвать люсю', '849512345', '849512345678',
'8 (409) 123-123-123', '7900123467', '5005005001', '8888-8888-88',
'84951a234567', '8495123456a',
'+1 234 5678901', // неверный код страны
'+8 234 5678901', // либо 8 либо +7
'7 234 5678901' // нет +
);
Фреймворк — это готовый каркас или скелет, основа приложения.
Библиотека — это когда ты подключаешь к своей программе чужой код и вызываешь функции из него когда тебе удобно.
Фреймворк — это библиотека наоборот. Фреймворк становится основной частью приложения, и вызвает твой код когда это требуется.
>>367493
Я вижу, что в итоге ты правильно посоветовал. Только пусть теперь анон еще свою задачу и на других номерах проверяет, я ему список дал.
>>367550
Упс, а я всегда так делал и работало. Верно, floor() возвращает число типа float, то есть с плавающей точкой. Но когда ты его используешь как индекс массива, php сам его преобразует в integer.
Мануал: http://www.php.net/manual/ru/language.types.array.php
> Числа с плавающей точкой (тип float) также будут преобразованы к типу integer, т.е. дробная часть будет отброшена. Например, ключ со значением 8.7 будет в действительности сохранен со значением 8.
То есть это (int) тут все-таки не нужно. По крайней мере, я ни разу не видел чтобы так делали, и сам не делал.
Насчет IDE — не знаю, почему она тут видит ошибку. Ну ладно, тогда можешь оставить этот (int), хуже от него в принципе не будет.
Покажи код. Насчет команды — может быть ты забыл что-то взять в кавычки? Ставил ли флаг bypass_shell?
> без ошибок выполняется только запуск программы.
Опять же, хорошо бы написать какие именно ошибки выводятся.
> Судя по примеру в документации и другим, что находил, в самой proc_open() процесс только запускаем, а все остальные команды надо передавать в pipe, но как, если после выполнения 7z.exe кажется, что вообще нет никакого видимого процесса, с которым можно работать?
Не, неверно. Должно работать имя программы + аргументы через пробел. Если в именах файлов есть пробелы, надо брать их в двойные кавычки.
> но как, если после выполнения 7z.exe кажется, что вообще нет никакого видимого процесса, с которым можно работать
Ну он выполняется, выводит что-то и завершается сразу. Ты наверно просто не замечаешь. Покажи код.
> Какой именно? Или все можно упростить?
Ну если сделать примерно так:
если (число равно нулю)...
если (в числе есть сотни)...
если (в младих разрядах число от 11 до 19) ...
иначе если (в числе есть десятки) ...
если (есть единицы и число не заканчиается на 11..19)...
// тут вложенный if для проверки случая с isFemale
То вроде получается почти без вложенных if? А без лишних return вполне можно обойтись. Разве так не проще будет?
>>367568
А что именно там советуют использовать? А то может сомнительные какие методы?
>>367572
[\\w \\d]+^...
Здесь ^ обозначает просто символ «крышечка», без какого-то специального значения. То есть твоя регулярка ищет текст где должен быть этот символ.
> Какой именно? Или все можно упростить?
Ну если сделать примерно так:
если (число равно нулю)...
если (в числе есть сотни)...
если (в младих разрядах число от 11 до 19) ...
иначе если (в числе есть десятки) ...
если (есть единицы и число не заканчиается на 11..19)...
// тут вложенный if для проверки случая с isFemale
То вроде получается почти без вложенных if? А без лишних return вполне можно обойтись. Разве так не проще будет?
>>367568
А что именно там советуют использовать? А то может сомнительные какие методы?
>>367572
[\\w \\d]+^...
Здесь ^ обозначает просто символ «крышечка», без какого-то специального значения. То есть твоя регулярка ищет текст где должен быть этот символ.
Го наверно? Искать на хабре.
> Что вообще надо, чтобы угореть по хипстерской хуйни?
Макбук/айпад/инстаграм/артхаус/борода/старбакс? Что кстати у нас вместо старбакса? Кофехаус подойдет или нет?
>>367580
Тут тоже хорошо бы упростить код и сделать if в один уровень.
>>367584
Символ ^ имеет специальное значение только в начале регулярки, в ситуациях типа
/lalala|^word/
(по сути он тоже стоит тут в начале одного из вариантов) и в начале квадратных скобок. Во всех остальных случаях он обозначает просто символ крышечки.
>>367589
Есть утверждения, которые могли бы помочь ( http://www.php.net/manual/ru/regexp.reference.assertions.php ) но гораздо проще, как советует анон, искать именно ошибки, а не правильный текст.
Практика, писать код пока не запомнишь все.
>>367602
Совсем сложные конструкции и регулярки лучше вообще не использовать, а попробовать переписать код чтобы они были не нужны.
Алсо, отслыка к предыдущим скобкам \1 — это еще не самая сложная вещь (там еще есть рекурсивное выражение (?R) вроде бы). Почитай-ка статью про то, как разбирать сложные грамматики на регулярках: http://habrahabr.ru/post/171667/
>>367603
Мэтта Зандстру читай если хочешь что-то почитать, название книги в ОП-посте есть.
>>367609
Я обычно просто набираю в адресной строке браузера «php имя_функции» — первой ссылкой будет ссылка на мануал. Алсо, в некотоых IDE подсказка по функциям встроена.
>>367613
> $numbers = preg_split('/,/', $number, 0, PREG_SPLIT_NO_EMPTY);
Не, так не надо делать. Работай с числами с помощью математики, а не костылей. То есть % и floor тут твои лучшие друзья.
Чтобы не мучаться с пробелами, можно делать так: добавлять слова в массив, а в конце делать implode:
$words[] = 'три';
$words[] = 'миллиона';
....
Тогда этот костылек: $number = preg_replace('/ +/', ' ', $number); будет не нужен.
Неверно выводит для некоторых чисел:
> На вашем счету девять миллионов тысяч (9,000,000) рублей
Практика, писать код пока не запомнишь все.
>>367602
Совсем сложные конструкции и регулярки лучше вообще не использовать, а попробовать переписать код чтобы они были не нужны.
Алсо, отслыка к предыдущим скобкам \1 — это еще не самая сложная вещь (там еще есть рекурсивное выражение (?R) вроде бы). Почитай-ка статью про то, как разбирать сложные грамматики на регулярках: http://habrahabr.ru/post/171667/
>>367603
Мэтта Зандстру читай если хочешь что-то почитать, название книги в ОП-посте есть.
>>367609
Я обычно просто набираю в адресной строке браузера «php имя_функции» — первой ссылкой будет ссылка на мануал. Алсо, в некотоых IDE подсказка по функциям встроена.
>>367613
> $numbers = preg_split('/,/', $number, 0, PREG_SPLIT_NO_EMPTY);
Не, так не надо делать. Работай с числами с помощью математики, а не костылей. То есть % и floor тут твои лучшие друзья.
Чтобы не мучаться с пробелами, можно делать так: добавлять слова в массив, а в конце делать implode:
$words[] = 'три';
$words[] = 'миллиона';
....
Тогда этот костылек: $number = preg_replace('/ +/', ' ', $number); будет не нужен.
Неверно выводит для некоторых чисел:
> На вашем счету девять миллионов тысяч (9,000,000) рублей
Все верно считает.
>>367630
Не, это отношения не имеет.
>>367685
Если хорошо будешь учить, то год. Хотя, там написано опыт 2 года, так что не уверен что тебя возьмут.
Си++ тоже конечно востребован, но его надо знать не на студенческом уровне.
>>367695
> "Пиши верно"
Норм, только после последней точки лишний пробел, сделай trim().
> Yoda
То же самое, лишний пробел с конца.
Алсо, тут 2 цикла. Второй цикл лишний - ты можешь просто сделать чтобы функция makeFirstletterUppercase работала только с одним предложением и вызывать ее для каждого предложения отдельно.
> не могу понять, как применять эту функцию для чисел больше 999
Идея в том, что мы разбиваем большое число на миллионы, тысячи, и все что меньше тысячи и обрабатываем их отдельно — и соответственно там не будет чисел болье 999. Если не хочешь, можешь сделать по-своему как-то.
> по поводу ЛОГИЧЕСКОГО ОПЕРАТОРА "!"
Там все относительно просто. В PHP есть так называемый логический (булев) тип и в нем 2 специальных значения — true (истина) и false (ложь). Их можно хранить в переменных так же, как и числа или строки:
$z = false;
$a = true;
Операторы сравнения чисел >, <, ==, != возвращают true если сравнение выполняется и false если нет:
var_dump(2 == 2); // true
var_dump(2 == 5); // false
var_dump(2 > 10); // false
var_dump(2 != 10); // true
Соответственно, оператор if, получая true (или любое другое непустое значение), выполняет первый блок кода, а получая false, выполняет то что в else:
if (true) {
// этот код выполняется
}
if (false) {
// этот код никогда не выполняется
} else {
// а этот выполнится
}
Над логическими значениями можно делать логические операции, и их в PHP всего 3: !(не), && (и), || (или).
«Не» просто меняет true на false и наоборот:
var_dump(!true); // false
var_dump(!false); // true
«И» возвращает true только когда с обоих сторон стоит true, а «или» — если хотя бы одно из значений равно true:
var_dump(true && false); // false
var_dump(false && false); // false
var_dump(true && true); // false
var_dump(true || true); // false
var_dump(true || false); // false
var_dump(false || false); // false
Собственно, вот и объяснение, как работает if и сравнения. Мануал:
http://www.php.net/manual/ru/language.types.boolean.php
http://www.php.net/manual/ru/language.operators.logical.php
http://www.php.net/manual/ru/language.operators.comparison.php
Вот как можно применить «не»:
!($a > $b) равносильно $a <= $b
!($a == $b) равносильно $a != $b
!($a && $b) равносильно (!$a || !$b) — это еще называется Закон де Моргана ( http://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BA%D0%BE%D0%BD%D1%8B_%D0%B4%D0%B5_%D0%9C%D0%BE%D1%80%D0%B3%D0%B0%D0%BD%D0%B0 )
Все верно считает.
>>367630
Не, это отношения не имеет.
>>367685
Если хорошо будешь учить, то год. Хотя, там написано опыт 2 года, так что не уверен что тебя возьмут.
Си++ тоже конечно востребован, но его надо знать не на студенческом уровне.
>>367695
> "Пиши верно"
Норм, только после последней точки лишний пробел, сделай trim().
> Yoda
То же самое, лишний пробел с конца.
Алсо, тут 2 цикла. Второй цикл лишний - ты можешь просто сделать чтобы функция makeFirstletterUppercase работала только с одним предложением и вызывать ее для каждого предложения отдельно.
> не могу понять, как применять эту функцию для чисел больше 999
Идея в том, что мы разбиваем большое число на миллионы, тысячи, и все что меньше тысячи и обрабатываем их отдельно — и соответственно там не будет чисел болье 999. Если не хочешь, можешь сделать по-своему как-то.
> по поводу ЛОГИЧЕСКОГО ОПЕРАТОРА "!"
Там все относительно просто. В PHP есть так называемый логический (булев) тип и в нем 2 специальных значения — true (истина) и false (ложь). Их можно хранить в переменных так же, как и числа или строки:
$z = false;
$a = true;
Операторы сравнения чисел >, <, ==, != возвращают true если сравнение выполняется и false если нет:
var_dump(2 == 2); // true
var_dump(2 == 5); // false
var_dump(2 > 10); // false
var_dump(2 != 10); // true
Соответственно, оператор if, получая true (или любое другое непустое значение), выполняет первый блок кода, а получая false, выполняет то что в else:
if (true) {
// этот код выполняется
}
if (false) {
// этот код никогда не выполняется
} else {
// а этот выполнится
}
Над логическими значениями можно делать логические операции, и их в PHP всего 3: !(не), && (и), || (или).
«Не» просто меняет true на false и наоборот:
var_dump(!true); // false
var_dump(!false); // true
«И» возвращает true только когда с обоих сторон стоит true, а «или» — если хотя бы одно из значений равно true:
var_dump(true && false); // false
var_dump(false && false); // false
var_dump(true && true); // false
var_dump(true || true); // false
var_dump(true || false); // false
var_dump(false || false); // false
Собственно, вот и объяснение, как работает if и сравнения. Мануал:
http://www.php.net/manual/ru/language.types.boolean.php
http://www.php.net/manual/ru/language.operators.logical.php
http://www.php.net/manual/ru/language.operators.comparison.php
Вот как можно применить «не»:
!($a > $b) равносильно $a <= $b
!($a == $b) равносильно $a != $b
!($a && $b) равносильно (!$a || !$b) — это еще называется Закон де Моргана ( http://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BA%D0%BE%D0%BD%D1%8B_%D0%B4%D0%B5_%D0%9C%D0%BE%D1%80%D0%B3%D0%B0%D0%BD%D0%B0 )
Ошибка, вот как праивльно:
var_dump(true && false); // false
var_dump(false && false); // false
var_dump(true && true); // true
var_dump(true || true); // true
var_dump(true || false); // true
var_dump(false || false); // false
>>367695
> И ешё один вопрос по ++x и x++, особенно ++x, поскольку у тебя на сайте это не объясняется. Где такая запись может применяться и нахуя она вообще нужна?
Это называется пост- и преинкремент. разница в том, какое число возвращается — старое или новое значение переменной. Мануал: http://www.php.net/manual/ru/language.operators.increment.php
Разницу можно увидеть таким кодом:
$a = $b = 1;
var_dump($a++); // 1
var_dump(++$b); // 2
Где применяется? не знаю, я обычно $a++ везде пишу. Разве что на собеседованиях любят задавать вопросы типа что присвоится в переменную в таком коде:
$y = 10;
$x = $y++;
$x = ++$x;
Ошибка, вот как праивльно:
var_dump(true && false); // false
var_dump(false && false); // false
var_dump(true && true); // true
var_dump(true || true); // true
var_dump(true || false); // true
var_dump(false || false); // false
>>367695
> И ешё один вопрос по ++x и x++, особенно ++x, поскольку у тебя на сайте это не объясняется. Где такая запись может применяться и нахуя она вообще нужна?
Это называется пост- и преинкремент. разница в том, какое число возвращается — старое или новое значение переменной. Мануал: http://www.php.net/manual/ru/language.operators.increment.php
Разницу можно увидеть таким кодом:
$a = $b = 1;
var_dump($a++); // 1
var_dump(++$b); // 2
Где применяется? не знаю, я обычно $a++ везде пишу. Разве что на собеседованиях любят задавать вопросы типа что присвоится в переменную в таком коде:
$y = 10;
$x = $y++;
$x = ++$x;
Я пытался ввести конструкцию
(($lastDigit >= 2) && ($lastDigit <= 4 )) ! (($last2digits >= 12) && ($last2digits <= 14)) , но она не работает. Где я ошибся?
По поводу тысяч и миллионов - для них нужно писать отдельную функцию или можно как-то реализовать в одной? Я просто не понимаю, как объединить числа от 0 до 999 и тысячи с миллионами в одной функции. Особенно сбивает с толку параметh $isFemale, который должнен отвечать за тысячи, а это значит они должны быть в этой же функции.
Оператором НЕ нельзя связать 2 выражения, это унарный оператор, с одним аргументом он используется в виде
!(выражение)
Я же выше вроде написал. Ты наверно хотел написать 2 оператора,
... и не(....)
Проблема как всегда была между монитором и спинкой стула.
>Ставил ли флаг bypass_shell
Вот этого не сделал.
Пока что вот так сделал https://github.com/Wiedzal/uppu/blob/master/module/Uppu/src/Uppu/Model/ArchiveUtil.php
А есть какой-нибудь хороший гайд по Git'у для полных овощей?
http://jsbin.com/patirowu/4/edit?js,console
Забыл, что параметры главной функции доступны для всех вложенных функций.
Пока это посмотри, а я второе задание сделаю.
каким хреном там 61270, если при общей выплате в 60000, долг остаётся где то 290? каким хреном эти 290 в 127 превращаются? Писал хз сколько рази в разных позах, всегда какая то хуета.
http://jsbin.com/yijozeji/1/edit
Вторая задача. А разве добавлять в массив нельзя так mas[] = .. ;
Я - самоучка С++, изучал его джаст фор фан во время учебы в вузике, чтобы мозги окончательно не усохли.
Три месяца назад волей судьбы устроился работать seo-шником. Так вот, со своими задачами я уже довольно хорошо справляюсь и теперь свободное время хочу уделить веб-макакингу. Где и что можно прочитать о технологиях web-разработки в общем? Где и для чего какой язык применяется?
Первым делом бегло пробежался по HTML и CSS, сейчас курю PHP, после С++ на первый взгляд все гораздо проще.
Итак, анон, расскажи мне по какому пути двигаться, а лучше дай гад.
Загляни в /web/
> > $numbers = preg_split('/,/', $number, 0, PREG_SPLIT_NO_EMPTY);
Не, так не надо делать. Работай с числами с помощью математики, а не костылей. То есть % и floor тут твои лучшие друзья.
По остальным пунктам согласен и правлю, а вот тут не понимаю. Если я могу разбить число на триады в 1 строку. Зачем использовать математические функции если для того что бы разбить на триады с помощь их, мне потребуется не одна строка, а три?
Хотя вру, понял что используя математику даже меньше кода получается в итоге, да и понятнее в целом.
http://ideone.com/iAljpy
Пофиксил все, за исключение одного момента. Пробелы не идеальны в случае если число типо 9 000 000 так как в массив попадает null и функция implode его тоже склеивает. Я бы мог конечно удалить все значения null из массива перед склеиванием, но это получается такой же костыль как и тот от которого я избавился. Хотя в целом результат намного лучше.
И по поводу дополнительной задачки на часто встречающиеся словосочетания. Подскажи хотя бы куда копать. Вчера весь вечер ломал голову, в итоге вернулся к чтению доков и книги по регуляркам в надежде найти то что мне нужно.
>Предлагаю сделать эффект «вжатия» для них, добавляя сверху темную тень в 1-2 пикселя при нажатии.
Темная тень на черном фоне? Не видно же будет.
http://fxsloker.github.io/
Уменьшил радиус, но социальные кнопки все равно какие-то не такие.
Пытаюсь кошек-мышек делать, хочу чтобы следующий шаг выполнялся после нажатия на кнопку, учитывая всю предыдущую инфу. Или может как иначе надо? нагуглил только всякие сохранения объектов в файлы, а потом чтение оттуда, но по-моему это не то и можно проще.
ну спасибо, посмотрю.
Че-то он мимо меня прошел, не так часто в интернетах про него слышно (в сравнении с остальными вебовскими баззвордами). Почитал вики, так вроде годнота и наверняка в каждом сайте есть. Или не?
Или да.
У тебя при первом цикле -i и i будут 0ым символом.
Еще забыл сказать, mb_substr у тебя возвращает все слово, вместо одной буквы. i это позиция, если после неё не указать количество букв, то она будет возвращать всё слово с позиции и. Тебе нужно исправить код, чтобы было вот так mb_substr($toLower, $i, 1) тогда он будет возвращать одну букву.
Вот мои конфиги:
server {
listen 8080;
#root /var/www/dd.test.com/rockmongo;
access_log /var/www/dd.test.com/nginx.access.log;
server_name dd.test.com www.dd.test.com;
root /var/www/dd.test.com/rockmongo;
location / {
index index.html index.php;
}
location ~ \.php$ {
# fastcgi_pass 127.0.0.1:9000;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/dd.test.com/rockmongo$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
}
user www-data;
worker_processes 4;
pid /run/nginx.pid;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
#default_type application/octet-stream;
default_type text/html;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
include /etc/nginx/mime.types;
#default_type application/octet-stream;
default_type text/html;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
gzip_disable "msie6";
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# Gzip Settings
##
gzip on;
gzip_disable "msie6";
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/ja$
##
# nginx-naxsi config
##
# Uncomment it if you installed nginx-naxsi
##
#include /etc/nginx/naxsi_core.rules;
##
##
# nginx-naxsi config
##
# Uncomment it if you installed nginx-naxsi
##
#include /etc/nginx/naxsi_core.rules;
##
# nginx-passenger config
##
# Uncomment it if you installed nginx-passenger
##
#passenger_root /usr;
#passenger_ruby /usr/bin/ruby;
##
# Virtual Host Configs
##
# Uncomment it if you installed nginx-passenger
##
#passenger_root /usr;
#passenger_ruby /usr/bin/ruby;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
Вот мои конфиги:
server {
listen 8080;
#root /var/www/dd.test.com/rockmongo;
access_log /var/www/dd.test.com/nginx.access.log;
server_name dd.test.com www.dd.test.com;
root /var/www/dd.test.com/rockmongo;
location / {
index index.html index.php;
}
location ~ \.php$ {
# fastcgi_pass 127.0.0.1:9000;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/dd.test.com/rockmongo$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
}
user www-data;
worker_processes 4;
pid /run/nginx.pid;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
#default_type application/octet-stream;
default_type text/html;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
include /etc/nginx/mime.types;
#default_type application/octet-stream;
default_type text/html;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
gzip_disable "msie6";
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# Gzip Settings
##
gzip on;
gzip_disable "msie6";
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/ja$
##
# nginx-naxsi config
##
# Uncomment it if you installed nginx-naxsi
##
#include /etc/nginx/naxsi_core.rules;
##
##
# nginx-naxsi config
##
# Uncomment it if you installed nginx-naxsi
##
#include /etc/nginx/naxsi_core.rules;
##
# nginx-passenger config
##
# Uncomment it if you installed nginx-passenger
##
#passenger_root /usr;
#passenger_ruby /usr/bin/ruby;
##
# Virtual Host Configs
##
# Uncomment it if you installed nginx-passenger
##
#passenger_root /usr;
#passenger_ruby /usr/bin/ruby;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
Изменил как ты написал, но возвращает всё равно не по 1 символу.
for($i=1; $i<=$half;$i++){
$sSymbol = mb_substr($toLower, $i, 1);
echo "{$sSymbol}";
}
Вывод: розаупалан
А, понял. Действительно возвращает по одному символу, это я забыл \n.
И цикл лучше бы начать с 0, а то первый символ в тексте у тебя теряется.
Это лучше, чем ничего. Но лучше долго там не задерживаться, а то отупеешь.
>>367856
Гайд по гиту, на русском и английском — git book http://git-scm.com/book/ru
> if (!defined('ARCH_TOOL_PATH')) {
Ой, как плохо. Это лучше бы в конфиг вынести.
> if (is_resource($process)) {
Не надо городить if в несколько этажей, лучше написать
if (!$process) {
... return или throw...
}
...
> fclose($pipes[0]);
Это логично в самом начале поставить, чтобы если программа попробует что-то читать со стандартного ввода, она сразу бы получила «конец файла», а не зависла навсегда в ожидании. Смотри сам:
$content = stream_get_contents($pipes[1]); // PHP ждет когда программа выведет данные и завершится, а программа в это же время ждет данных на входе
fclose($pipes[0]);
Т.е. у тебя будет взаимная блокировка если программа попытается что-то прочесть (ну она вроде не должна, но все же надежнее переставить fclose для потока 0 повыше).
> $entry_name = trim(substr(strrchr($line, "="), 1));
strrchr() находит самое правое вхождение символа. А что, если путь или имя файла содержит знак «=»? Твой код сработает неправильно. Лучше разбивать строку регуляркой.
> strtolower
работает только с 8-битными кодировками, а в случае utf-8 она ломает кириллицу. Я уже устал всем говорить, что надо исплоьзовать mb_strtolower().
Кстати, о кодировке. Под linux скорее всего список файлов выдается в utf-8, а вот под windows скорее всего в cp866 или winodws-1251. надо определить, в какой именно, и преобразовывать текст в utf-8 а то русские буквы не будут работать.
Это лучше, чем ничего. Но лучше долго там не задерживаться, а то отупеешь.
>>367856
Гайд по гиту, на русском и английском — git book http://git-scm.com/book/ru
> if (!defined('ARCH_TOOL_PATH')) {
Ой, как плохо. Это лучше бы в конфиг вынести.
> if (is_resource($process)) {
Не надо городить if в несколько этажей, лучше написать
if (!$process) {
... return или throw...
}
...
> fclose($pipes[0]);
Это логично в самом начале поставить, чтобы если программа попробует что-то читать со стандартного ввода, она сразу бы получила «конец файла», а не зависла навсегда в ожидании. Смотри сам:
$content = stream_get_contents($pipes[1]); // PHP ждет когда программа выведет данные и завершится, а программа в это же время ждет данных на входе
fclose($pipes[0]);
Т.е. у тебя будет взаимная блокировка если программа попытается что-то прочесть (ну она вроде не должна, но все же надежнее переставить fclose для потока 0 повыше).
> $entry_name = trim(substr(strrchr($line, "="), 1));
strrchr() находит самое правое вхождение символа. А что, если путь или имя файла содержит знак «=»? Твой код сработает неправильно. Лучше разбивать строку регуляркой.
> strtolower
работает только с 8-битными кодировками, а в случае utf-8 она ломает кириллицу. Я уже устал всем говорить, что надо исплоьзовать mb_strtolower().
Кстати, о кодировке. Под linux скорее всего список файлов выдается в utf-8, а вот под windows скорее всего в cp866 или winodws-1251. надо определить, в какой именно, и преобразовывать текст в utf-8 а то русские буквы не будут работать.
Много кто делал, вроде даже в этом треде была пара анонов.
У тебя в регулярке пропущен флаг u в конце, нужный для поддержки utf-8 и русских букв. Без него регулярка ломает символы, в результате получаются битые символы, которые обычно отображаются вопросиками или ромбиками, а ideone от них вообще ломается и выдает пустую страницу.
В общем, допиши флаг u: $re = "/..../u";
Алсо, твоя регулярка не найдет ошибку в слове «Жыр», проверь. Алсо, насчет а/но тоже по моему не совсем верно сделано.
>>367882
Все верно.
>>367902
Там остается 268 или около того, за месяц набегают проценты + 1000 комиссия, получается уже 1270. Вы бы, молодой человек, договор прочитали прежде чем подписывать.
>>367910
> разве добавлять в массив нельзя так mas[] = .. ;
нет, это только в php можно
Все верно решено.
>насчет а/но тоже по моему не совсем верно сделано
Ну он находит ошибки, где нет запятой перед а и но, хотя и выводит их с последней буквой стоящего перед ними слова. Так же я понятия не имею, в какую сторону двигаться, чтобы скрипт еще и исправлял ошибки, а не просто показывал их.
> var mas = [];
надо называть переменную arr или result.
3. Напиши функцию map, которая принимает на вход функцию и массив, и обрабатывает каждый элемент массива этой функцией, возвращая новый массив. Пример:
function square(x) { return x * x; } // возведение в квадрат
console.log(map(square, [1, 2, 3, 4])); // [1, 4, 9, 16]
console.log(map(square, [])); // []
Это аналог array_map из PHP.
4. Напиши функцию fmap, которая принимает на вход 2 функции, a и gen, где gen — функция-генератор вроде той, что была в первом задании. fmap возвращает новую функцию-генератор, которая при каждом вызове берет следующее значение из gen и пропускает его через функцию a. Пример:
var gen = sequence(1, 1);
function square(x) { return x * x; }
var squareGen = fmap(square, gen);
console.log(squareGen()); // 1
console.log(squareGen()); // 4
console.log(squareGen()); // 9
console.log(squareGen()); // 16
5. Частичное применение (partial application)
вики: http://ru.wikipedia.org/wiki/%D0%A7%D0%B0%D1%81%D1%82%D0%B8%D1%87%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5
Напиши функцию patrial(fn, a1, a2, ....), которая позволяет зафиксировать один или несколько аргументов функции. Пример:
function add(a, b) { return a + b; }
function mult(a, b, c, d) { return a * b * c * d; }
var add5 = partial(add, 5); // Мы получили функцию с 1 аругемнтом, которая прибавляет к любому числу 5
console.log(add5(2)); // 7
console.log(add5(10)); // 15
console.log(add5(8)); // 13
var mult23 = partial(mult, 2, 3); // мы зафиксировали первые 2 аргумента mult() как 2 и 3
console.log(mult23(4, 5)); // 2*3*4*5 = 120
console.log(mult23(1, 1)); // 2*3*1*1 = 6
6. Наша функция partial позволяет фиксировать только первые аргументы. Усовершенствуй ее, чтобы зафиксировать можно было любые аргументы, пропущенные аргументы обозначаются с помощью undefined:
function test(a, b, c) { return 'a=' + a + ',b=' + b + ',c=' + c; }
var test1_3 = partial(test, 1, undefined, 3);
console.log(test1_3(5)); // a=1,b=5,c=3
> var mas = [];
надо называть переменную arr или result.
3. Напиши функцию map, которая принимает на вход функцию и массив, и обрабатывает каждый элемент массива этой функцией, возвращая новый массив. Пример:
function square(x) { return x * x; } // возведение в квадрат
console.log(map(square, [1, 2, 3, 4])); // [1, 4, 9, 16]
console.log(map(square, [])); // []
Это аналог array_map из PHP.
4. Напиши функцию fmap, которая принимает на вход 2 функции, a и gen, где gen — функция-генератор вроде той, что была в первом задании. fmap возвращает новую функцию-генератор, которая при каждом вызове берет следующее значение из gen и пропускает его через функцию a. Пример:
var gen = sequence(1, 1);
function square(x) { return x * x; }
var squareGen = fmap(square, gen);
console.log(squareGen()); // 1
console.log(squareGen()); // 4
console.log(squareGen()); // 9
console.log(squareGen()); // 16
5. Частичное применение (partial application)
вики: http://ru.wikipedia.org/wiki/%D0%A7%D0%B0%D1%81%D1%82%D0%B8%D1%87%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5
Напиши функцию patrial(fn, a1, a2, ....), которая позволяет зафиксировать один или несколько аргументов функции. Пример:
function add(a, b) { return a + b; }
function mult(a, b, c, d) { return a * b * c * d; }
var add5 = partial(add, 5); // Мы получили функцию с 1 аругемнтом, которая прибавляет к любому числу 5
console.log(add5(2)); // 7
console.log(add5(10)); // 15
console.log(add5(8)); // 13
var mult23 = partial(mult, 2, 3); // мы зафиксировали первые 2 аргумента mult() как 2 и 3
console.log(mult23(4, 5)); // 2*3*4*5 = 120
console.log(mult23(1, 1)); // 2*3*1*1 = 6
6. Наша функция partial позволяет фиксировать только первые аргументы. Усовершенствуй ее, чтобы зафиксировать можно было любые аргументы, пропущенные аргументы обозначаются с помощью undefined:
function test(a, b, c) { return 'a=' + a + ',b=' + b + ',c=' + c; }
var test1_3 = partial(test, 1, undefined, 3);
console.log(test1_3(5)); // a=1,b=5,c=3
Кроме PHP, есть еще такие языки:
SQL — язык, на котором пишутся запросы к базе данных для получения или вставки в нее данных
JS — язык программирования, на котором пишутся программки-скрипты, которые загружаются вместе со страницей и выполняются в браузере.
Кое-какие ссылки, в том числе на книги, есть в ОП-посте. Можешь мой учебник еще попробовать пройти, а если пройдешь, то у нас есть еще задания вроде такого: https://gist.github.com/codedokode/9424217 где тебе все эти знания понадобятся.
>>367985
> так как в массив попадает null
А ты не добавляй в массив null, сделай проверку.
> по поводу дополнительной задачки на часто встречающиеся словосочетания. Подскажи хотя бы куда копать.
- Разбиваем текст на слова, например регуляркой
- Обрабатываем массив слов, чтобы привести все буквы в один регистр
- Хитрым способом (циклом, как же еще) собираем из соседних слов пары и тройки слов и объединяем все в один большой массив
- Считаем число повторов (циклом либо через array_count_values) и сохраняем в массив
- Сортируем по убыванию (uksort, krsort или подобные функции)
- Выводим
- ???
- PROFIT
> if ($lastNum < 2) {
Это условие не нужно, такая проверка уже есть в smallNumberToText().
> if ($number > 999) {
Не нужно, так как далее ты проверяешь что $triad не равно нулю
Так, вообще, работает программа верно.
Кроме PHP, есть еще такие языки:
SQL — язык, на котором пишутся запросы к базе данных для получения или вставки в нее данных
JS — язык программирования, на котором пишутся программки-скрипты, которые загружаются вместе со страницей и выполняются в браузере.
Кое-какие ссылки, в том числе на книги, есть в ОП-посте. Можешь мой учебник еще попробовать пройти, а если пройдешь, то у нас есть еще задания вроде такого: https://gist.github.com/codedokode/9424217 где тебе все эти знания понадобятся.
>>367985
> так как в массив попадает null
А ты не добавляй в массив null, сделай проверку.
> по поводу дополнительной задачки на часто встречающиеся словосочетания. Подскажи хотя бы куда копать.
- Разбиваем текст на слова, например регуляркой
- Обрабатываем массив слов, чтобы привести все буквы в один регистр
- Хитрым способом (циклом, как же еще) собираем из соседних слов пары и тройки слов и объединяем все в один большой массив
- Считаем число повторов (циклом либо через array_count_values) и сохраняем в массив
- Сортируем по убыванию (uksort, krsort или подобные функции)
- Выводим
- ???
- PROFIT
> if ($lastNum < 2) {
Это условие не нужно, такая проверка уже есть в smallNumberToText().
> if ($number > 999) {
Не нужно, так как далее ты проверяешь что $triad не равно нулю
Так, вообще, работает программа верно.
Вот оно как, сам думал о том что бы абсолютно все варианты склеить в группы из 3 слов, потом из двух и проверить что сочетания из двух не являются частью уже найденых из трех, но отбросил так как подумал что дикий быдлокод и должно быть что то проще чисто с помощью регулярного выражения крутого все найти.
Гм, это надо проверить, так я не могу сказать. Если не подойдет, можно просто сделать кнопку темнее при нажатии или просто опускать ее вниз на пару пикселей (при этом border-radius будет обрезать низ картинки, создавая иллюзию вдавливания, я надеюсь).
Но у тебя в любом случае сделана тень неестественно, так как при нажатии у тебя тень едет вверх (как будто кто-то двигает источник света), а не кнопка вниз. Плюс, в макете в ненажатом состоянии тени нет, а у тебя есть.
>>367996
> Уменьшил радиус,
Ну а я советовал увеличить размеры. Но я сейчас еще немного подумал, и понял реальную причину. Смотри, тень рисуется не от картинки, которая у тебя поставлена, а от формы блока (можешь убедиться, отключив фоновую картинку вообще или поменяв радиус). У тебя форма блока и радиус неидельно соответствуют радиусу кружочка на картинке, потому тень находится на некотором расстоянии, потому появляется темная щель между тенью и картинкой.
Тут есть 2 варианта:
- пририсовать тень в фотошопе
- сделать, чтобы цветной кружочек был не частью картинки, а рисовался за счет border-radius + background-color на блоке. Тогда тень будет идеально совпадать с ним.
Ну и еще, как я написал выше, хороший вариант вообще переделать эту странную тень.
Чтобы сохранять состояние между запусками программы, надо использовать либо файлы либо базу данных. На ideone это недоступно, если у тебя есть на компьютере апач + php то тогда вполне реально это сделать, сохраняй данные например в файл в формате json, а при запуске скрипта читай оттуда.
Для чтения/записи в файл есть функции file_put_contents/file_get_contents. В файл нельзя сохранить массив или объект, потому для преобразования объектов и массивов в строку (это называется сериализация) есть json_encode/json_decode, а так же serialize/unserialize. Отличие serialize в том, что она умеет сохранять еще и объекты, а json_encode — только массивы. Зато json_encode хорошо читается человеком.
>>368187
> mb_substr($toLower, -$i);
Это значит, взять подстроку от $i-го символа с конца и до конца. Тебе надо брать только один символ.
Плюс, если $i == 0 то -$i тоже равно нулю, и оно берет вообще всю строку от начала и до конца.
Надо что-то поменть.
Мануал по нгинкс почитай, он вроде даже на русском есть
В твоем случае, проблема может быть например здесь
index index.html index.php;
но я не уверен.
>>368254
Да что угодно. Говори, что выучишь все, что понадобится. Вообще, у начинающих обычно особо нечего показать, потому их спрашивают по теории по всем технологиям, которые они указали в резюме, могут задачку какую-нибудь дать.
В случае с PHP можешь перечитать мануал, в случае с html/css тоже.
>>368265
Он у тебя найдет ошибку в такой ситуации:
> Не черный фломастер. А красный.
И в такой:
> Бей его в нос.
А не должен.
> Так же я понятия не имею, в какую сторону двигаться, чтобы скрипт еще и исправлял ошибки
В сторону preg_replace, если ты до нее еще не дошел, то читай урок дальше или мануал.
Мануал по нгинкс почитай, он вроде даже на русском есть
В твоем случае, проблема может быть например здесь
index index.html index.php;
но я не уверен.
>>368254
Да что угодно. Говори, что выучишь все, что понадобится. Вообще, у начинающих обычно особо нечего показать, потому их спрашивают по теории по всем технологиям, которые они указали в резюме, могут задачку какую-нибудь дать.
В случае с PHP можешь перечитать мануал, в случае с html/css тоже.
>>368265
Он у тебя найдет ошибку в такой ситуации:
> Не черный фломастер. А красный.
И в такой:
> Бей его в нос.
А не должен.
> Так же я понятия не имею, в какую сторону двигаться, чтобы скрипт еще и исправлял ошибки
В сторону preg_replace, если ты до нее еще не дошел, то читай урок дальше или мануал.
Ну поиск сочетаний, которые надо исключить, это конечно отдельная песня. Тут еще надо подумать, как лучше сделать и быстрее. Для начала можно без этого сделать.
А я еще нашел в гуглах $_SESSION, вроде заработало с ней, это разве не правильнее, чем в файлы писать? Выше тут еще про ajax говорили, что скажешь, стоит разбираться?
> Отличие serialize в том, что она умеет сохранять еще и объекты, а json_encode — только массивы
То-то у меня и не считало объектом результат json_decode, ясно.
> это разве не правильнее, чем в файлы писать?
Ну в данном случае это может быть удобнее, но файлы не умирают через 15 минут как сессия. С другой стороны, для каждого пользователя сессия своя, а файл общий.
> То-то у меня и не считало объектом результат json_decode,
Ты еще мануал по обеим функциям почитай на всякий пожарный.
>>368300
В слове ЖЫР не найдет ошибку. Ты читал про флаг i (искать без учета регистра букв) у регялярки?
http://ideone.com/Ff1z7j — не видит пропущенную перед «но» запятую, зато видит ошибку там, где ее нет.
> http://ideone.com/Ff1z7j — не видит пропущенную перед «но» запятую, зато видит ошибку там, где ее нет.
Может ему стоит ошибки на разные регулярки разбить? Я так делал, вроде как проще. Сам не советую, так как нуб.
Пользуясь случаем еще вопрос который давно интересует но все забываю спросит - Почему ты этим занимаешься? Любишь нести знания? Нет личной жизни? Какие то планы по выращиванию макак которым можно скидывать задачи и получать деньги?
http://jsbin.com/yijozeji/2/edit?js,console
console.log(map(gen, square));
Так не работает.
console.log(gen.map(square));
А вот так работает.
http://jsbin.com/robejuju/1/edit?js,console
Можно мне как-нибудь через объект сохранять значение? Пока не выходит.
Ну а так вот, работает:
http://jsbin.com/xamerora/1/edit?js,console
public function move() {
$this->nextstep = rand(1, 4);
if ($this->nextstep == 1) {
$this->y = $this->y - 1;
} elseif ($this->nextstep == 2) {
$this->x = $this->x + 1;
} elseif ($this->nextstep == 3) {
$this->y = $this->y + 1;
} else {
$this->x = $this->x - 1;
}
}
Это один ход в кошках-мышках:
1 - вверх
2 - направо
3 - вниз
4 - налево
Проблема в том, что не знаю как запилить проверку на близость к границе поля. Слишком много условий получается и вообще малочитабельно и некрасиво. Наверное есть какой-то ООП-трюк, а я не знаю.
Ибо кошка может заспавниться
1. в центре поля
2. около границы поля
3. в углу поля
Тогда $this->nextstep = rand(1, 4); подходит только для первого случая, ибо во втором есть три выхода (например вверх, направо и налево), а в третьем случае только два выхода (например налево и вверх).
Че можно сделать?
Раз уж гет, то напишу еще
public function checkBorders() {
$this->borders = array(
"up" => false,
"right" => false,
"down" => false,
"left" => false
);
if ($this->x == 0) {
$this->borders['left'] = true;
}
if ($this->x == Field::SIZE - 1) {
$this->borders['right'] = true;
}
if ($this->y == 0) {
$this->borders['up'] = true;
}
if ($this->y == Field::SIZE - 1) {
$this->borders['down'] = true;
}
}
Был такой вариант, но как это использовать при просчете хода не знаю.
http://ideone.com/Sjeoh6 так, со здел вроде бы исправил, но вот как быть с а и но я ума не прилоду.
Я не совсем понял, для чего у тебя массив $mouseEyes. Он туда записывает массив с координатами кошки? Адлячего?
Хотя я еще до туда не дошел и не думал про их взаимодействие. Я пока пытаюсь заставить их двигаться и передо мной встала проблема выхода кошки за границы поля.
Хотя не, теперь вроде и с но исправил. Ну как, ОП, теперь всё верно?
Ну я хочу сделать, чтобы ход мыши зависел от расположения кошки. Если видно кошку, то идем в противоположную сторону, если там конечно нет стены. Иначе наверное случайная сторона. Я еще не дописал это условие, но чувствую там много условий будет.
Хуево объяснил. Видим координаты кошки: идем в противоположную сторону, а если массив пустой, то идем в любую сторону.
Так а если мышка в стену упрется и захочет пойти дальше? Я ж про это грю.
Я вот еще думал это ограничить средством самого массива: если пытаемся поставить мышку в клетку, которая не равна ".", то возвращаем false и запускаем заново. Вроде пока самый норм вариант, но это пока диванная версия, может там какие подводные камни есть.
Ну да, если +1 ход не равен ".", то выбираем другую сторону. Ну и иначе выбираем другой ход. Короче мне тут кажется лучше уж тогда через switch делать, а то условий до кучи будет и разных вариаций.
ОП, ты писал про балльную систему. Мне она больше приглянулась.
Можно оперировать через -1, 0, 1? Например:
$border = все координаты границ; //может быть только 0 и -1, т.к. профита никакого не приносит.
$corner = все координаты углов; //тоже 0 и -1
$center = координаты всех точек, принадлежащих центру (необъективно наверное получится); // 0 и 1, полезное свойство
$seenCat = координаты кошки, если она в поле зрения; // 0 и 1, полезное свойство
Например, сначала мышь оценивает ход вправо: попадаем в одну из координат $border? если да, то $border = -1. В угол попадаем? $corner = 0; (т.к. не попадаем). $center можно пропустить, т.к. $border = -1. $seenCat = 1.
Получаем -1+0+1=0, и сравниваем с остальными, а если есть схожие результаты, то ходить в последний лучший результат.
Ты это имел ввиду? Моим способом получится? Какие условия я еще пропустил?
Вроде как все, даже сам еще немного код упростил.
>Это лучше бы в конфиг вынести
Да, не разобрался пока как, в процессе.
>Кстати, о кодировке
Ещё когда допиливал вывод инфы о медиафайлах, возникла проблема с кириллистическими тегами в getID3, убил два дня на эти все определения, переводы, удивлялся, почему не работает, ковырял настройки расширения, ковырял сам getID3, но кракозябры так и не победил. Потом внимательно почитал комменты в документации, нашел вот это http://habrahabr.ru/post/107945/ и кучу костылей. Костыли не помогли тогда, не помогают и сейчас, точно такая же хрень, кодировка не определяется нормально и не переводится.
В частности использовал вот этот http://www.php.net/manual/ru/function.mb-detect-encoding.php#113983, но он тоже ошибается. Там, где тот же декодер Лебедева определяет ср1251 например и нормально декодирует, он выдает ISO-8859-1.
Хобби, just for fun.
Выращивать новые кадры с нуля в общем невыгодно, так как есть фриланс с сотней тысяч кандидатов. Только крупные компании вроде mail.ru/яндекс могут позволить себе финансировать всякие «школы яндекса» и спецкурсы в универе в расчете на будущее.
>>368324
> console.log(gen.map(square));
> А вот так работает.
Ты используешь метод map() который есть у массивов. А я просил сделать отдельную функцию с такими именем.
>>368332
> Ну а так вот, работает:
Верно, только это
var res = square(counter());
return res;
можно было писать сразу с return без дополнительной переменной.
А, еще, сделай тогда, чтобы в качестве counter() можно было указать функцию с аргументами, и при вызове
squareCounter(1, 2, 100);
Эти аргументы бы передавались функции counter(). Аргументов может быть любое количество.
> Можно мне как-нибудь через объект сохранять значение? Пока не выходит.
А зачем?
> fmap.res = ...
Это просто добавляет функции новое свойство (так как функции в JS — это тоже объекты и им можно добавлять свойства).
Хобби, just for fun.
Выращивать новые кадры с нуля в общем невыгодно, так как есть фриланс с сотней тысяч кандидатов. Только крупные компании вроде mail.ru/яндекс могут позволить себе финансировать всякие «школы яндекса» и спецкурсы в универе в расчете на будущее.
>>368324
> console.log(gen.map(square));
> А вот так работает.
Ты используешь метод map() который есть у массивов. А я просил сделать отдельную функцию с такими именем.
>>368332
> Ну а так вот, работает:
Верно, только это
var res = square(counter());
return res;
можно было писать сразу с return без дополнительной переменной.
А, еще, сделай тогда, чтобы в качестве counter() можно было указать функцию с аргументами, и при вызове
squareCounter(1, 2, 100);
Эти аргументы бы передавались функции counter(). Аргументов может быть любое количество.
> Можно мне как-нибудь через объект сохранять значение? Пока не выходит.
А зачем?
> fmap.res = ...
Это просто добавляет функции новое свойство (так как функции в JS — это тоже объекты и им можно добавлять свойства).
Есть функция с аргументами:
f1(a, d, c, d)
Мы можем с помощью partial сделать из нее функцию с меньшим числом аргументов, заранее задав значения для нескольких из них, например:
var f2 = partial(f1, 1, 2); // фиксируем a = 1, b = 2
И вызов:
f2(x, y)
будет равносилен вызову:
f1(1, 2, x, y)
Кстати, имеющийся в новых версиях JS метод bind() тоже может делать частичное применение: http://frontender.info/partial-application-in-javascript-using-bind/ Но ты должен обойтись без его использования, и написать свой велосипед.
> не знаю как запилить проверку на близость к границе поля.
$leftDist = расстояние от клетки до левой границы
$rightDist = расстояние от клетки до правой границы
Наименьшее из этих 2 покажет расстояние до края по горизонтали. Если расстояние и по вертикали и по горизонтали равно 0 (или 1 в зависимости от того как считать), мы в углу. Если одно из расстояний равно 0, мы на краю карты.
Конечно, это вычисление стоит вынести в отдельную функцию, например, в объекте Карта.
> Это один ход в кошках-мышках:
Удобно хранить не номер хода, а координаты, куда ты хочешь встать. Тогда можно сделать метод canMoveTo($x, $y) кторый проверит можно ли сходить на эту клеточку.
> Тогда $this->nextstep = rand(1, 4); подходит только для первого случая,
Надо, как я написал выше, считать координаты клетки куда хотим встать, и проверять можно ли туда сходить. Можно даже сделать массив всех доступных для хода клеток и выбирать ход из него.
Это усложнение. Проще сделать массив всех возможных ходов и перед добавлением в него координат проверять, можно ли на эту клетку сходить.
>>368376
Вместо массива $point по моему удобнее сделать 2 отдельных свойства $x и $y.
А так, что-то пока сказать трудно. Можно попробовать написать код так:
- делаем массив с координатами всех возможных ходов (в том числе стоять на месте)
- удаляем из него клетки, на которые нельзя сходить
- каждому ходу ставим определенное число очков в зависимости от того, принесет он нам пользу ил вред
- выбираем ход с наибольшим числом очков
http://www.yiiframework.com/extension/image/
скажите через метод Yii::app()->image->load() можно ли загружать картинки которые временные (еще не сохранены и не имеют директорию)?
Пытаюсь разоюраться а документации никакой (сайт на котором она когда-то была распилен)
Видит ошибку там, где ее нет: http://ideone.com/MN75Bt
>>368397
Сравнивать удобнее, если сделать массив ходов и каждому проставить очки.
>>368461
Скорее всего понадобится больше вариантов, чем +1 и -1. Например, есть 3 клетки для хода:
- не видно кошек, но клетка в углу
- видно кошку, но до нее 3 клеточки
- кошка на соседней клеточке
Очевидно, что «кошка на соседней клеточке» гораздо важнее чем «видно кошку, но до нее 3 клеточки» - они должны добавлять/вычитать разное число очков. Более важный фактор, «весит» больше и влияет сильнее на принятие решения.
> $border = все координаты границ; //может быть только 0 и -1, т.к. профита никакого не приносит.
Вместо хранения координат проще сделать функцию
isCorner($x, $y)
которая будет по координатам определять, угол это или нет.
Кокой злой.
Алсо, хрен с тем определением, вписал cp866 руками.
https://github.com/Wiedzal/uppu/blob/master/module/Uppu/src/Uppu/Model/ArchiveUtil.php
Вроде всё поправил.
нахуй все съебали из моего треда
Ок, теперь все верно.
>>368530
> for ($i = 0; $i < $count; $i++) {
> $money -= $bill;
используй деление
> if (isset($error)) {
Плохо когда неизвестно есть переменная или нет. Лучше сделать чтобы она была всегда и проверять условием $error != ''
>>368543
Кодировка — это способ представить символ в виде одного или нескольких чисел. В разных кодировках одна и та же буква может иметь разные коды (отсюда и все проблемы). Кодировки делятся на 1-байтные (1 символ = 1 байт, максимум 256 символов возможны), 2/4 байтные (utf-16 и utf-32) и многобайтные с переменной длиной (utf-8 где символ кодируется от 1 до 6 байтами).
В 1-байтных кодировках и в utf-8 латинница и цифры (и некоторые символы из этого списка: http://ru.wikipedia.org/wiki/ASCII) кодируются одинаково. То есть латинская буква «A» почти везде обозначается кодом 65. В UTF-16 она обозначается кодами 0 65, а в UTF-32 кодами 0 0 0 65.
То есть, в однобайтных кодировках и utf-8 символы 0-127 имеют одинаковое значение, а вот 128-255 — разное, и именно ими кодируются русские буквы.
Про кодировки в тегах написано в вики: http://ru.wikipedia.org/wiki/ID3_(%D0%BC%D0%B5%D1%82%D0%B0%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5)
> ID3v1 ... утверждал, что все строки должны храниться в ISO 8859-1, но на практике пользователи часто используют национальную кодировку
> Текст хранится в кодировках UTF-16 [Для ID3v2.2, ID3v2.3, ID3v2.4] или UTF-8 [Для ID3v2.4]. Текстовые фреймы помечаются битом кодировки.
Тут неясен только момент с Idv3 и «на практике ...». Гугл находит такие ссылки:
http://rutracker.org/forum/viewtopic.php?t=4019853
http://help.ubuntu.ru/wiki/%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D1%82%D0%B5%D0%B3%D0%BE%D0%B2_%D0%B0%D1%83%D0%B4%D0%B8%D0%BE%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2
Во второй ссылке упомянуто, что (в нарушение стандарта) русские треки используют кодировку win-1251 в ID3v1.
Собственно, вот и решение:
- Для ID3v1 используется cp1251 в России и ISO-8859-1 на западных названиях (для европейских символов вроде Ä, Ö, Ø, Ő). Как отличить, какая именно? В западном тексте скорее большиство букв латинские: girügamesh (то есть большиство букв это ascii и имеют код символа < 128), а в русском — большиство русские и имеют коды больше 128.
- Для ID3v2 исплоьзуется Utf-16/8 причем в тегах явно указана какая именно.
Собственно, надо определять какая кодировка используется и преобразовывать в utf-8, если библиотека gitId3 не делает это сама.
Насчет костылей: кодировку действительно можно определить статическим анализом. Русские буквы в разных кодирвоках имеют разные коды. Ну а функции вроде mb_detect_encoding действительно использовать не стоит.
Ок, теперь все верно.
>>368530
> for ($i = 0; $i < $count; $i++) {
> $money -= $bill;
используй деление
> if (isset($error)) {
Плохо когда неизвестно есть переменная или нет. Лучше сделать чтобы она была всегда и проверять условием $error != ''
>>368543
Кодировка — это способ представить символ в виде одного или нескольких чисел. В разных кодировках одна и та же буква может иметь разные коды (отсюда и все проблемы). Кодировки делятся на 1-байтные (1 символ = 1 байт, максимум 256 символов возможны), 2/4 байтные (utf-16 и utf-32) и многобайтные с переменной длиной (utf-8 где символ кодируется от 1 до 6 байтами).
В 1-байтных кодировках и в utf-8 латинница и цифры (и некоторые символы из этого списка: http://ru.wikipedia.org/wiki/ASCII) кодируются одинаково. То есть латинская буква «A» почти везде обозначается кодом 65. В UTF-16 она обозначается кодами 0 65, а в UTF-32 кодами 0 0 0 65.
То есть, в однобайтных кодировках и utf-8 символы 0-127 имеют одинаковое значение, а вот 128-255 — разное, и именно ими кодируются русские буквы.
Про кодировки в тегах написано в вики: http://ru.wikipedia.org/wiki/ID3_(%D0%BC%D0%B5%D1%82%D0%B0%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5)
> ID3v1 ... утверждал, что все строки должны храниться в ISO 8859-1, но на практике пользователи часто используют национальную кодировку
> Текст хранится в кодировках UTF-16 [Для ID3v2.2, ID3v2.3, ID3v2.4] или UTF-8 [Для ID3v2.4]. Текстовые фреймы помечаются битом кодировки.
Тут неясен только момент с Idv3 и «на практике ...». Гугл находит такие ссылки:
http://rutracker.org/forum/viewtopic.php?t=4019853
http://help.ubuntu.ru/wiki/%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D1%82%D0%B5%D0%B3%D0%BE%D0%B2_%D0%B0%D1%83%D0%B4%D0%B8%D0%BE%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2
Во второй ссылке упомянуто, что (в нарушение стандарта) русские треки используют кодировку win-1251 в ID3v1.
Собственно, вот и решение:
- Для ID3v1 используется cp1251 в России и ISO-8859-1 на западных названиях (для европейских символов вроде Ä, Ö, Ø, Ő). Как отличить, какая именно? В западном тексте скорее большиство букв латинские: girügamesh (то есть большиство букв это ascii и имеют код символа < 128), а в русском — большиство русские и имеют коды больше 128.
- Для ID3v2 исплоьзуется Utf-16/8 причем в тегах явно указана какая именно.
Собственно, надо определять какая кодировка используется и преобразовывать в utf-8, если библиотека gitId3 не делает это сама.
Насчет костылей: кодировку действительно можно определить статическим анализом. Русские буквы в разных кодирвоках имеют разные коды. Ну а функции вроде mb_detect_encoding действительно использовать не стоит.
Вот этот код кстати выглядит адекватным, но он не определяет utf-8:
http://www.opennet.ru/base/dev/charset_autodetect.txt.html
Впрочем, определить utf-8 можно по характерным последовательностям байтов.
Улучшить распознавание можно, если сравнивать статистику букв или сочетаний (в русском вряд ли встречаются сочетания букв типа «щвы» и наоборот, часто встречаются какие-то другие сочетания).
>>368548
Это фигня какая-то неработающая. Ты код посмотри, и подумай, с чего он вообще работать должен?
Особенно вот это ужас:
if (md5($sample) == md5($string)) {
Как будто строки нельзя сравнить напрямую, это писал человек с md5 головного мозга.
>Ты код посмотри, и подумай, с чего он вообще работать должен
Ну мне всегда кажется, что чего-то не понимаю, а раз код в комментах на php.net - то всё норм, а до меня просто не доходит.
В код бы глянул.
>>368584
Тогда он тут http://ideone.com/8wiZue не видит пропущенной запятой.
>>368589
Это не я же написал, смотри трипкод, это тролли скучают.
> https://github.com/Wiedzal/uppu/blob/master/module/Uppu/src/Uppu/Model/ArchiveUtil.php#L39
Слишком длинные строки, переноси, разбивай на более котороткие или что-то еще делай.
> while (strlen(trim($result[$i])) !== 0) {
Зачем цикл внутри цикла? И вот это [^:] зачем кстати?
B что за странное условие? Я вообще не понимаю, что этот код делает.
Да видел же, что трипкод другой.
Ну принцип там какой: нахожу первую строку с "Path = чего-то там" и проверяю, не идет ли дальше абсолютный путь. Ничего умнее не придумал, чем проверять наличие двоеточия, в имени же его быть не может. Если там не абсолютный путь, то делаю массив с именем файла и дальше циклом запихиваю в него все значения, которые идут дальше, пока не натыкаюсь на пустую строку, т.е. инфа об этом файле кончилась, идем к следующему. Как-то так.
Проверял на нескольких архивах, всё норм.
Извлекаю всё это из массива такого вида, если что.
Есть вопросы нулевого уровня, почему я не могу скачать документацию с php.net ?
Есть ли такая функция в php, которая позволяет писать на SQL?
Есть много всяких. Самая распространенная mysql_query("Текст запроса, например: SELECT*FROM tablename или INSERT INTO и т.д")
http://www.php.net/manual/ru/ref.mysql.php
<h2 style = "color: red;">Тест</h2>
Хватит исплоьзовать mysql
Имей в виду, что этот код устарел. Лет так на 10. Сейчас для работы с БД используют расширение PDO: http://habrahabr.ru/post/137664/ — советую почитать.
Никак не комбинировать. mysqli_real_escape_string ты используешь при записи в базу, а nl2br при выводе.
Я просто линукс в глаза не видел, такие вещи не учитывал.
И сейчас не переделаю правильно, скорее всего, опять что-нибудь упущу. Как вариант можно будет потом добавить, хотя два отдельных парсера - идиотизм, конечно.
Теперь осталось подумать, как ограничить ввод до 5-ти абзацев (всё остальное вылезает за div т.к. он фиксированной высоты должен быть)..
В Windows абсолютный путь начинается с /^\w+:\\/, в UNIX - с /^\//
Там как бы одна файловая система, а диски монтируются внутрь специальных папок. И пути имеют вид:
/var/www/example.com/index.php
А корневой каталог соответственно обозначается как «/»
Думаю, надо просто разделять текст по линии из нескольких минусов, после которой идет список файлов.
Вот пример листинга архива под линукс: http://paste2.org/VhZ9Fy1G (битые символы — так и были).
Вот еще: http://paste2.org/yNJIhZ3E
Не совсем верно: http://ideone.com/l6gLE2
Не видит ошибку: http://ideone.com/Pj3Z7M
>>368629
Скачать можно тут например: http://ru2.php.net/download-docs.php
Есть расширение PDO, оно позволяет соединяться с базой данных и отправлять SQL-запросы.
В нём есть главная страница и система аутентификации, причём главная страница мимокрокодила и зашедшего сильно различаются.
Для проверки на то, зашёл ли пользователь используется булевская функция is_signed_in, читающая из сессии значение.
Как лучше отдавать страницу пользователю? Вот есть три варианта:
1) В коде главной страницы куча вызовов is_signed_in (для формы входа и подобных штук).
2) В коде главной страницы есть что-то вроде:
если человек зашёл, то отдаём один код, иначе отдаём другой код.
3) Тоже, что и 2), только проверка is_signed_in в контроллере и есть 2 представления (для зашедшего и мимокрокодила).
Если различия небольшие, то if/else в шаблоне.
Если очень большие то можно подключать блоки через if + require.
Алсо, если у тебя ООП и MVC-фреймворк, то не должно быть функций, а должна быть либо переменная в шаблоне, либо объект $user.
Спасибо
какой противный пузырёк
> посылаю с помощью XmlHttpRequest методом POST какие-то данные на сервер
> сохранить их в базу данных
> открыть консоль браузера
> xhr
на костёр этого колдуна
Очевидно что никак. Используй другие методы или сделай так, чтобы подделка запроса не давала никакой выгоды.
Если речь идет об накрутке результатов в игре, например, можно переиодически посылать информацию об ситуации в игре, и на сервере проверять, а мог ли этот игрок набрать столько очков или купить этот предмет.
Еще вариант — попробовать запутать запросы так, чтобы ничего было не понять, а данные были хитрым образом закодированы. Но тут есть риск, что кто-то их сможет распутать, а ты будешь думать что все надежно защищено. Для игры вконтакте это подойдет, для серьезных приложений — абсолютно нет.
Оп, проверь почту.
Знакомый вид. Не тот ли ты анон, который делал это несколько месяцев назад, и которому я еще советовал переделать плеер на плоский скин, и даже нарисовал кнопку воспроизведения, а ты так и не запилил это?
Алсо, валидатор ругается: http://validator.w3.org/check?uri=http%3A%2F%2Fdownloadme.lovetocode.ru%2Ff%2F14&charset=%28detect+automatically%29&doctype=Inline&group=0
То чтот касается тега meta, еще можно проигнорировать (или заменить его на header()), а вот остальное — ошибки.
http://downloadme.lovetocode.ru/f/14
> Исполнитель:girugmesh
Что-то у тебя теги не корректно кодируются. Алсо, у меня еще этот трек не воспроизводится в фаерфоксе. Возможно, из-за этого:
> GET http://downloadme.lovetocode.ru/jPlayer/js/Jplayer.swf [HTTP/1.0 404 Not Found 94ms]
Он точно тут нужен? Ты знаешь, что он делает?
Алсо, responsive.css ты подключил, но в при маленькой ширине окна все смотрится криво.
По слову alone не ищется трек с таким именем.
Алсо, вбрасывал бы в /b — тестирующих было бы больше (upd: не вбрасывай пока не пофиксишь дыру).
http://downloadme.lovetocode.ru/f/16 — скачивание не работает, часть имени файла потерялась, было такое:
http://paste2.org/ndWDmO6y
Алсо, у тебя там дыра, смотри
http://downloadme.lovetocode.ru/konnichiha.txt
А ведь кто-то нехороший может тебе закачать php-файл и выполнить. И сделать все, что угодно с твоим сервером. Срочно отключи загрузку файлов.
>Знакомый вид. Не тот ли ты анон, который делал это несколько месяцев назад, и которому я еще советовал переделать плеер на плоский скин, и даже нарисовал кнопку воспроизведения, а ты так и не запилил это?
Ага, это я. Тащемта про ajax-запрос тоже я спрашивал и да, тут дело в накрутке результатов игры, а именно http://arkanoid.lovetocode.ru/
>Алсо, у тебя там дыра, смотри
Не понял, как ты мне в корень сайта файл загрузил? Я так понял, мне надо чтобы все-все запросы даже на существующие файлы, перенаправлялись на index.php?
Ты из-за дырки что ли целиком загрузку файлов вырубил? Если нет, то у меня ничего не работает. Как и арканоид, впрочем.
Загрузку файлов закрой, у тебя можно закачать и выполнить любой php-файл и он выполнится. Может быть, ты забыл engine off, а может быть на хостинге в htaccess запрещен php_flag, а может в php запрещено менять настройки через htaccess.
> тут дело в накрутке результатов игры, а именно
1) шифруем данные, которыми обменивается. Это защитит от школоты, которая умеет только кнопки нажимать в программках вроде fiddler, но не понимает ничего в программировании.
2) ведем и периодически постим весь лог действий и событий на сервер так, чтобы его можно было автоматически сверять (тут тебе надо подумать, как это сделать без необходимости повторить всю логику на сервере). При этом фиксируем на сервере время и убеждаемся что на клиенте оно идет с примерно такой же скоростью. Поскольку мы защищаем число очков, то проверять надо что такое число очков набирается постепенно, число и стоимость разбтых кирпичей соответствует числу очков, что шарик двигается с правдоподобной скоростью и правдоподобно отскакивает.
Это защитит нас от тех, кто смог расшифровать протокол обмена, и пытается подделать данные о числе очков. Это не защитит от челоаека, который напишет внешнего бота, который будет мниторить ситуацию на экране и посылать команды нажатия клавиш в браузер (но и такого можно вывести на чистую воду).
Кстати, можно бы заодно сделать реплей для ручной проверки подозрительных типов (и чтобы можно было посмотреть как играют люди из топа). Если у тебя код написан праивльно, то переделать его на управление из лога будет несложно. Заметь, что генератор случаных чисел надо сделать повторяемым для реплея.
3) для защиты от продвинутых ботов есть такие способы:
- логгируем движение мыши. Некоторые авторы ботов забывают ей двигать, и она скачет по экрану мгновенно. На тач-устройствах соответственно надо логгировать прикосновения к экрану.
- логгируем нажатия клавиш, включая продолжительность. Может быть, бот глупый и держит кнопку нажатой фиксированное время.
- неожиданная смена протокола, добавление нового поля например. Боты вряд ли обновятся мгновенно, и могут спалиться
- для подозрительных игроков (показывающих хорошие результаты) делаем доп. проверки, например неожиданно после прохождения уровня появляется окошко, где надо нажать кнопку. При этом код отображения окошка не должен быть в основном коде, он должен подгружаться отдельно по команде с сервера. Человек нажмет кнопку, а бот, не обученный этому, не нажмет. Так можно ловить например тех, кто ботами фармит ресурсы в играх или играет в покер.
- твои идеи?
Загрузку файлов закрой, у тебя можно закачать и выполнить любой php-файл и он выполнится. Может быть, ты забыл engine off, а может быть на хостинге в htaccess запрещен php_flag, а может в php запрещено менять настройки через htaccess.
> тут дело в накрутке результатов игры, а именно
1) шифруем данные, которыми обменивается. Это защитит от школоты, которая умеет только кнопки нажимать в программках вроде fiddler, но не понимает ничего в программировании.
2) ведем и периодически постим весь лог действий и событий на сервер так, чтобы его можно было автоматически сверять (тут тебе надо подумать, как это сделать без необходимости повторить всю логику на сервере). При этом фиксируем на сервере время и убеждаемся что на клиенте оно идет с примерно такой же скоростью. Поскольку мы защищаем число очков, то проверять надо что такое число очков набирается постепенно, число и стоимость разбтых кирпичей соответствует числу очков, что шарик двигается с правдоподобной скоростью и правдоподобно отскакивает.
Это защитит нас от тех, кто смог расшифровать протокол обмена, и пытается подделать данные о числе очков. Это не защитит от челоаека, который напишет внешнего бота, который будет мниторить ситуацию на экране и посылать команды нажатия клавиш в браузер (но и такого можно вывести на чистую воду).
Кстати, можно бы заодно сделать реплей для ручной проверки подозрительных типов (и чтобы можно было посмотреть как играют люди из топа). Если у тебя код написан праивльно, то переделать его на управление из лога будет несложно. Заметь, что генератор случаных чисел надо сделать повторяемым для реплея.
3) для защиты от продвинутых ботов есть такие способы:
- логгируем движение мыши. Некоторые авторы ботов забывают ей двигать, и она скачет по экрану мгновенно. На тач-устройствах соответственно надо логгировать прикосновения к экрану.
- логгируем нажатия клавиш, включая продолжительность. Может быть, бот глупый и держит кнопку нажатой фиксированное время.
- неожиданная смена протокола, добавление нового поля например. Боты вряд ли обновятся мгновенно, и могут спалиться
- для подозрительных игроков (показывающих хорошие результаты) делаем доп. проверки, например неожиданно после прохождения уровня появляется окошко, где надо нажать кнопку. При этом код отображения окошка не должен быть в основном коде, он должен подгружаться отдельно по команде с сервера. Человек нажмет кнопку, а бот, не обученный этому, не нажмет. Так можно ловить например тех, кто ботами фармит ресурсы в играх или играет в покер.
- твои идеи?
Это просто демонстрация. Я могу у тебя на сервере выполнить любой php-код. Например, загрузить шелл, который дает доступ к файлам и выполнению команд.
Посмотри файл /uploads/0/19/34d1f91fb2e514b8576fab1a75a89a6b.php например.
Ладно, буду знать. Но мне нужен более простой способ.
Нет, не я.
два чаю, таже картина, тот же браузер.
И вообще, посмотри (на сервере) php-файлы последние загруженные и что в них.
Алсо, в арканоиде ошибка:
SyntaxError: missing ] after element list @ http://arkanoid.lovetocode.ru/src/Game.js:121
косноль открыть только один я тут умею? Ctrl + Shift + I
Делаем цикл меняя $i от 0 до (половина длины слова)
Берем $i-ю букву с начала и с конца (mb_substr) и сравниваем. Если буквы разные — не палиндром. Если все совпали — паоиндром.
Оп, процитирую с почты. Хочу услышать твое мнение.
Оп, ты здесь? Меня взяли на работу!!! Но в первый день посадили за интернет магазин и сказали вставлять изображения для каждого товара, а их там несколько сотен, поэтому работы на несколько дней. Но там движок webasyst, поэтому я просто сохраняю картинку и по одной загружаю к нужному товару. Может конечно это можно как-то автоматизировать, но я не знаю.
Но самое главное мне сказали, что нужно знать Joomla. Где-то через пару дней, я буду на нем делать сайт. А я могу просто писать html и css, и ничего не знаю о joomla. Оп, скажи мне реально освоить joomla за пару вечеров? Что мне важно сейчас о нем узнать, чтобы я не выглядел полным дауном? Посоветуй чего-нибудь годного. И как там сайт верстать?
Баг: если стрелять из лазера когда заканчивается уровень, то появляется новый уровень, а патрон (?) продолжает лететь, правда уже не задевая кирпичики.
Алсо, жизней что-то много, на первом уровне выпало 4 жизни, неужели так и должно быть?
Открываешь список загруженных файлов, скачиваешь go.php, получаешь в файле результат его выполнения. Там вызов phpinfo()
Учи джумлу, срочно ставь ее себе, потыкайся, посоздавай страницы и что там есть, затем найди сайт типа «20 лучших плагинов и тем для джумлы» и тоже их все скачай и изучи, и темы и плагины.
CMS вообще рассчитаны на создание сайта через админку, установку плагинов и тем и нажатие кнопочек, но от тебя наверно ждут блоее серьезные доработки, а именно:
- написание (или возможно копирование с другого сайта) темы оформления, чтобы сайт выглядел индиидуально. ну тут надо знание html/css и того, как устроены темы джумлы. Это тоже реально
освоить, хотя бы основы.
- написание плагинов. Тут нужен php
- исправление багов/правка плагинов и ядра. Ну тут надо понимание php и внутреннего устройства джумлы.
Алсо, что так долго-то вставлять картинки? 20 секунд на картинку, 3600/20 = 180 картинок в час. Алсо, картинки можно перетаскивать с диска на файловый инпут, если ты не знал.
И все бонусы по одному фурычат. Я беру тройной шарик и у меня исчезает увеличитель доски.
>Алсо, жизней что-то много, на первом уровне выпало 4 жизни, неужели так и должно быть?
какой-именно выпадет приз, определяется рандомно. Может быть конечно вообще призов много падает, ну да пофиг же.
Кнопку скачать нажал.
Вижу, кстати, что ты не все идеально сделал. Форму вокруг кнопки скачивания не убрал например. Наверняка я об этом писал, ты забыл видимо.
Сделай разную вероятность выпадения что ли.
Ну так я и задумывал, тащемта. А по поводу того что иногда шар пролетает я даже говорить не хочу я так наебался с детекцией столкновений что мама не горюй.
Так и есть, посмотри видео оригинальной игры (на автомате) на ютубе например. Призы могут отменять друг друга, плюс самоотменяться через какое-то время.
Алсо, ты видимо не оптимизировал отрисовку и по прежнему перерисовываешь все поле? Печалька. И по столкновениям тоже можно бы улучшить код, у меня тоже сквозь кирпичик пролетел одним большим скачком, видимо чуть притормозило что-то и пропустилось пара кадров.
$path = '...data/www/downloadme.lovetocode.ru/konnichiha.txt';
file_put_contents($path, "こんにちは");
Да, из верстки делается так называемая тема оформления. Обычно это сводится к
- разрезанию вертски на шапку/тело/подвал/меню
- вставку кода в нужные места, куда должны выводиться например заголовки или текст из базы
- тестирования и исправления всех найденных косяков. Самы долгий этап.
Читай (нашел в гугле)
http://joomla-book.ru/development/creating-templates
http://joomla-book.ru/development
ruseller.com/lessons.php?rub=41&id=1140
joomla-book выглядит вполне адекватно кстати. Если английский знаешь то читани и официальнй мануал
http://docs.joomla.org/Portal:Template_Development
>>368815
До этого я сделал ошибку в одном из php-файлов и в сообщении вывелся полный путь к файлу. А так, я бы мог написать код, выводящий
echo _ _ FILE _ _ ;
например и посмотреть. Имея возможность выполнять php-код, я могу прочесть любой файл на твоем сервере (к которому хватит прав доступа).
> $fstChar = mb_substr($text, $i, $i+1);
Третий параметр — это не до какого символа брать подстроку, а длина подстроки. Сделай var_dump($fstChar) и посмотри что там.
Там количество выводится? А, вот в чём дело. Я-то думал это позиции "от" и "до".
вообще засирать треды лучше с самого начала
тогда их более противно открывать, ибо говно всегда на виду когда открываешь тред
да, поря сьёбывать
А в Линуксе пустые строки между разными файлами не всегда будут выводиться, да? Полагаться на них не стоит? Пока сделал вот так,
preg_match_all("/(?:^|\n)Path = [\S\s]?[\n]Version = \d/", <листинг с обрезанной верхушкой>, $result);
только не уверен, что "\n" в Линуксе сработает так же. Хотя, можно добавить что-то вроде
<перевод строки в винде>|<перевод строки в линуксе>
"*" после "\d" отвалилась.
И еще подумываю над тем что стоит удалять все что было найдено только 1 раз. Потому что в том тексте что ты дал топ 3 для словосочетаний из 3 слов - 1 место встречается 3 раза, второе и третье по 1. В итоге получается вывод двух случайно попавших на первые места словосочетаний.
Так и не смог понять как запретить ходить сквозь стены, видимо у меня че-то не так в структуре программы.
Ощущаю чувство, что я чего-то не знаю, ибо все как-то через жопу получается, а ведь наверняка есть красивые решения. Может паттерны какие-нибудь тут нужно использовать? Я как посмотрю на них — страшно становится, не знаю с какой стороны подступиться.
В общем я запутался ПАМАГИ
Код: http://goo.gl/oD3SvY
Как работает: http://goo.gl/r7BZi8
спамфильтр не пускает
И почему ты советуешь использовать два бэкслеша для экранирования если прекрасно работает и 1? Мне тут просто оп который месяцок назад тред создавал что набирает на обучение по email задал вопрос - почему у меня везде 2 бэкслэша. Я оставил только по 1, но код работает как и раньше.
У тебя мышка бывает перепрыгивает через 4 клеточки сразу. А ходить она может только на одну клетку.
А реализовал ты неплохо.
Есть паста про основы ООП http://archive-ipq-co.narod.ru/l1/pasta.html и там есть отрывок про то, что нужно завернуть код создания вопросов в функцию и дан образец.
function createQuestions()
{
$questions = array();
$q = new Question;
$q->text = ...
...
// Кладем вопрос в массив
$questions[] = $q;
$q = new Question;
...
return $questions;
}
Но я настолько тупой, что не могу понять, как записать правильно.
http://ideone.com/lj7SkG
Я все правильно написал?
С меня очень много лучей добра за помощь :3
http://ideone.com/yTfkm7
Раскомментируйте любой вариант переменной $text
Добра!
Не совсем, если закомментировать, то не работает функция, заглавлениялол первой буквы предложения.
Вот отдельно функция:
http://ideone.com/EH1Hon
$str - коммент/раскоммент для разных вариантов.
А сделай, чтобы не надо было нажимать на Следующий ход, через некоторое время ход автоматически бы запускался.
Нет, они там были, просто видимо пока я копировал, они куда-то потерялись.
> только не уверен, что "\n" в Линуксе сработает так же.
Вообще, по идее в Windows принят формат конца строки из 2 символов \r \n (именно в таком порядке), а в Linux — просто \n. Но программа может и не соблюдать эти требования и использовать везде один формат.
Так что должно работать.
Насчет пустых строк, по моему лучше не заморачиваться с ними, в просто собрать все строки, начинающиеся с Path. Регулярные выражения тут тебе помогут.
>>369052
Сейчас-сейчас, скоро будет.
>>369070
Неплохо, но можно сделать еще проще. попробуй вместо нескольких if в строках 29-39 написать 1-2 строки на основе функции min().
>>369096
Да, это называется стоп-слова, можно нагуглить их список запросом «стоп слова русский».
>>369100
Да, можно.
>>369129
Скоро создадим.
Раз уж ты решил страницу сделать, стоило бы конечно запросы отправлять яваскриптом через аякс без перезагрузки. Но как у тебя тоже нормально, только постоянно мигание как-то напрягает.
У тебя само перемещение сделано странно:
> } elseif ($this->nextstep == self::UPRIGHT) {
> $this->x += 1;
Зачем делать 8 констант и 8 if когда можно просто передавать координаты новой клеточки:
$cat->move($newX, $newY);
Я думаю, это nextstep надо выпилить и использовать обычные координаты. Пользы от него никакой, а код усложняет.
Далее, этот код создает тебе же проблемы:
> if ($this->nextstep == self::UP) {
> $this->y -= 1;
Ты меняешь координаты, даже не проверив можно ли туда сходить. вот как должно быть:
новыеКоординаты = выбратьХод();
если (можно сходить в клеточку новыекоординаты) {
сходитьНаКлеточку(новыеКоординаты);
}
Кстати, нелогично константы движения объявлять на кошке. Что, двигаться может только кошка? Надо было их объявить на классе Карта, так как направление движения связано с картой.
Не переопределяй константы при наследовании. Это создает путаницу.
> $_SESSION['field']->spawn("cat");
Плохо смотрится, надо было в отдельную переменную положить кошку и на ней методы вызывать.
> echo "<div id='info'><p>{$this->getAnimalName($str)} повернула {$this->getDirection($int)} </p></div>";
Не пиши echo внутри классов (если только это не специальный класс для вывода чего-то — но у нас не тот случай).
> include_once 'Field.php';
Напиши-ка лучше автозагрузчик на основе spl_autoloader_register.
> nextStep();
> clearField(); // Полностью очищается поле
> updateField()
А не логичнее сделать одну функцию вместо трех? Ну представь, допустим ты написал этот класс и передал другому программисту. Как он догадается, что надо вызывать эти 3 функции, да еще и в определеном порядке?
Все данные в классе должны обновляться автоматически, то есть если мы что-то там передвинули, вызов разных методов карты должен возвращать актуальные обновленные значения.
> public function getAnimalName($str) {
> if ($str == "C") {
> return "Кошка";
Класс-предок (Animal) не должен ничего знать о своих наследниках (Кошке и мышке), по крайней мере в правильном ООП.
Почему? Потому что класс не знает, склоько у него наследников. Может завтра, кто-то другой напишет еще один класс-наследник, а ты в классе Animal его не учел.
Вместо этого ты можешь в классе Animal объявить абстрактную функцию getAnimalName(), а в наследниках переопределить. То, что она абстрактная, гарантирует что программист не забудет ее переопределить - иначе будет фатальная ошибка.
Нет, они там были, просто видимо пока я копировал, они куда-то потерялись.
> только не уверен, что "\n" в Линуксе сработает так же.
Вообще, по идее в Windows принят формат конца строки из 2 символов \r \n (именно в таком порядке), а в Linux — просто \n. Но программа может и не соблюдать эти требования и использовать везде один формат.
Так что должно работать.
Насчет пустых строк, по моему лучше не заморачиваться с ними, в просто собрать все строки, начинающиеся с Path. Регулярные выражения тут тебе помогут.
>>369052
Сейчас-сейчас, скоро будет.
>>369070
Неплохо, но можно сделать еще проще. попробуй вместо нескольких if в строках 29-39 написать 1-2 строки на основе функции min().
>>369096
Да, это называется стоп-слова, можно нагуглить их список запросом «стоп слова русский».
>>369100
Да, можно.
>>369129
Скоро создадим.
Раз уж ты решил страницу сделать, стоило бы конечно запросы отправлять яваскриптом через аякс без перезагрузки. Но как у тебя тоже нормально, только постоянно мигание как-то напрягает.
У тебя само перемещение сделано странно:
> } elseif ($this->nextstep == self::UPRIGHT) {
> $this->x += 1;
Зачем делать 8 констант и 8 if когда можно просто передавать координаты новой клеточки:
$cat->move($newX, $newY);
Я думаю, это nextstep надо выпилить и использовать обычные координаты. Пользы от него никакой, а код усложняет.
Далее, этот код создает тебе же проблемы:
> if ($this->nextstep == self::UP) {
> $this->y -= 1;
Ты меняешь координаты, даже не проверив можно ли туда сходить. вот как должно быть:
новыеКоординаты = выбратьХод();
если (можно сходить в клеточку новыекоординаты) {
сходитьНаКлеточку(новыеКоординаты);
}
Кстати, нелогично константы движения объявлять на кошке. Что, двигаться может только кошка? Надо было их объявить на классе Карта, так как направление движения связано с картой.
Не переопределяй константы при наследовании. Это создает путаницу.
> $_SESSION['field']->spawn("cat");
Плохо смотрится, надо было в отдельную переменную положить кошку и на ней методы вызывать.
> echo "<div id='info'><p>{$this->getAnimalName($str)} повернула {$this->getDirection($int)} </p></div>";
Не пиши echo внутри классов (если только это не специальный класс для вывода чего-то — но у нас не тот случай).
> include_once 'Field.php';
Напиши-ка лучше автозагрузчик на основе spl_autoloader_register.
> nextStep();
> clearField(); // Полностью очищается поле
> updateField()
А не логичнее сделать одну функцию вместо трех? Ну представь, допустим ты написал этот класс и передал другому программисту. Как он догадается, что надо вызывать эти 3 функции, да еще и в определеном порядке?
Все данные в классе должны обновляться автоматически, то есть если мы что-то там передвинули, вызов разных методов карты должен возвращать актуальные обновленные значения.
> public function getAnimalName($str) {
> if ($str == "C") {
> return "Кошка";
Класс-предок (Animal) не должен ничего знать о своих наследниках (Кошке и мышке), по крайней мере в правильном ООП.
Почему? Потому что класс не знает, склоько у него наследников. Может завтра, кто-то другой напишет еще один класс-наследник, а ты в классе Animal его не учел.
Вместо этого ты можешь в классе Animal объявить абстрактную функцию getAnimalName(), а в наследниках переопределить. То, что она абстрактная, гарантирует что программист не забудет ее переопределить - иначе будет фатальная ошибка.
Потому, что один бекслеш — это символ экранирования и не всегда он работает как надо:
\b -> вставляет в строку \b
\d -> вставляет в строку \d
\$ -> вставляет в строку что? Не \$, а просто $ если это строка в 2-х кавычках, и \$ если в одинарных.
\\ -> вставляет в строку один бекслеш \
Видишь, тут нет согласованности. Иногда один бекслеш сохраняется, иногда нет. Проще всегда ставить 2 (которые гарантированно вставляют в строку один бекслеш), чем сидеть час думать почему регуялрка не работает, перепроверять разные варианты.
Я видел конечно, многие не следуют этому правилу, но это их дело, если им нравится тратить время на поиск ошибок и помнить в уме все комбинации с бекслешем из мануала, это конечно их право.
Мануал, я советую внимательно прочесть его: http://www.php.net/manual/ru/language.types.string.php
Там по сути экранирование идет на 2 уровнях:
- экранирование на уровне php-строк, 2 бекслеша вставляют в строку один бекслеш в итоге
- экранирование на уровне регулярки
Чтобы записать в регулярке символ \, мы по правилам регулярных выражений дложны вписать \\. Но чтобы вставить в php-строку бекслеш, мы должны его написать 2 раза, а чтобы вставить \\ мы должны написать \\\\.
> если прекрасно работает и 1
Я написал выше несколько примеров когда не работает.
>>369151
Ты создаешь в функции 4 объекта класса Question и сохраняешь их в переменные, $q, $q1, $q2, $q3.
В массив $questions ты кладешь только первый объект. Остальные 3 никуда дальше не соохраняются и уничтожаются при выходе из функции (созданные в функции переменные уничтожаются при вызоде из нее, надеюсь ты помнишь). Думаю, это ошибка.
>>369190
Строка mb_internal_encoding должна быть раскомментирована.
> $text[0]
Это ошибка. Нельзя обращаться к отдельной букве в строке через скобки. Ты скажешь, но я прочел это в официальном мануале. Я отвечу, прочти более внимательно:
> Строки в PHP внутренне представляют из себя массивы байт. Как результат, доступ или изменение строки по смещению небезопасно с точки зрения многобайтной кодировки, и должно выполняться только со строками в однобайтных кодировках, таких как, например, ISO-8859-1
utf-8 — многобайтовая кодировка. В ней одна буква может состоять из нескольких байт. Меняя $str[0] ты меняешь не всю первую букву, а только первый байт из последовательности и скорее всего в итоге ты получишь неправильную последовательность байт, которая не соответствует никакому символу.
Потому не исплоьзуй обращение к символам через [0]. Используй mb_substr().
Прочитай:
http://www.php.net/manual/ru/language.types.string.php#language.types.string.substr
http://www.php.net/manual/ru/language.types.string.php#language.types.string.details
> если прекрасно работает и 1
Я написал выше несколько примеров когда не работает.
>>369151
Ты создаешь в функции 4 объекта класса Question и сохраняешь их в переменные, $q, $q1, $q2, $q3.
В массив $questions ты кладешь только первый объект. Остальные 3 никуда дальше не соохраняются и уничтожаются при выходе из функции (созданные в функции переменные уничтожаются при вызоде из нее, надеюсь ты помнишь). Думаю, это ошибка.
>>369190
Строка mb_internal_encoding должна быть раскомментирована.
> $text[0]
Это ошибка. Нельзя обращаться к отдельной букве в строке через скобки. Ты скажешь, но я прочел это в официальном мануале. Я отвечу, прочти более внимательно:
> Строки в PHP внутренне представляют из себя массивы байт. Как результат, доступ или изменение строки по смещению небезопасно с точки зрения многобайтной кодировки, и должно выполняться только со строками в однобайтных кодировках, таких как, например, ISO-8859-1
utf-8 — многобайтовая кодировка. В ней одна буква может состоять из нескольких байт. Меняя $str[0] ты меняешь не всю первую букву, а только первый байт из последовательности и скорее всего в итоге ты получишь неправильную последовательность байт, которая не соответствует никакому символу.
Потому не исплоьзуй обращение к символам через [0]. Используй mb_substr().
Прочитай:
http://www.php.net/manual/ru/language.types.string.php#language.types.string.substr
http://www.php.net/manual/ru/language.types.string.php#language.types.string.details
Ошибка была в чем-то другом. Эти выражения равносильны.
>>369254
Должно получиться 61270. Тысячи не хватает.
Если поставить маленькую сумму кредита, например 1000, твоя программа не учтет это и все равно в первый месяц выплатит 5000, хотя достаточно заплатить 2030.
Надо смотреть чему равен остаток долга и обрабатывать ситуацию, когда она маленький, а не выплачивать сразу же 5000 вот в этом месте: ... + $servicePayment - $monthlyPayment;
Попробуй переписать код внутри цикла примерно так:
- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
Если тебе трудно написать сразу, давай писать по частям:
- напиши код, который каждый месяц только увеличивает долг (и выводит его на экран)
- допиши к нему код, который каждый месяц пишет, большой сейчас долг (школьник не может его выплатить разом) или маленький (меньше 5000 и его можно выплатить за один раз)
- допиши код, который каждый месяц пишет, сколько надо заплатить в этом месяце (с учетом того что больше 5000 школьник заплатить не может)
- наконец, допиши код, который платит эту сумму, уменьшая долг и считает сколько всего выплачено
Но получается что в случае с '' можно юзать один бэкслеш, а в случае с "" двойной?
И прям все стоп слова использовать? Я бы например сказать, только и им подобные оставил, мне они кажутся нормальными словами количество которых стоит считать в нашей задаче
Спасибо, буду разбираться.
> Напиши-ка лучше автозагрузчик на основе spl_autoloader_register
А в чем суть, чем он лучше инклудов? Типа если в коде упоминается неизвестный класс, то он его пытается найти в файле с таким именем?
Ты называешь картой то, что у меня в классе Field? Или это должен быть еще один класс?
>>369265
> Ошибка была в чем-то другом. Эти выражения равносильны
Я вот щас опять откатил файл с классом Animal назад — мышка прыгает через несколько клеток через рандомное количество нормальных ходов. Вернул обратно — всё нормально
Все, разобрался, спасибо за подсказки.
>>369266
Не всегда. \\ в любой строке вставляет один бекслеш, а не два. Изучи внимательно мануал.
>>369267
Ну подумай сам, что надо игнорировать, а что нет. Необязательно все копировать как есть.
>>369269
> чем он лучше инклудов?
Экономит время на их написание и делает код чище.
> Типа если в коде упоминается неизвестный класс, то он его пытается найти в файле с таким именем?
При обращении к несуществующему классу, прежде чем упасть с ошибкой, php вызовет твою функцию и даст ей имя класса. Ты можешь подгрузить его и тем самым избежать ошибки.
> то он его пытается найти в файле с таким именем?
Тебе дается имя класса и ты можешь делать с ним что угодно. Но лучше использовать стандарты — PSR-2 или PSR-4. В PSR-2 подчеркивания заменяются на разделитель каталогов и приписывается .php:
My_Awesome_Class -> My/Awesome/Class.php
В PSR-4 используются неймспесы:
\My\Awesome\Class -> My/Awesome/Class.php
Свои стандарты придумывать не надо. Вариант «имя файла = имя класса + .php» вполне соотсветствует любому из этих стандартов.
>>369270
Посмотри внимательно:
> $this->y = $this->x - 1
>>369272
Теперь как раз верно. Вот тут можно немного упростить код:
$paymentTotal = ($paymentTotal + $monthlyPayment); записать через +=
>>369266
Не всегда. \\ в любой строке вставляет один бекслеш, а не два. Изучи внимательно мануал.
>>369267
Ну подумай сам, что надо игнорировать, а что нет. Необязательно все копировать как есть.
>>369269
> чем он лучше инклудов?
Экономит время на их написание и делает код чище.
> Типа если в коде упоминается неизвестный класс, то он его пытается найти в файле с таким именем?
При обращении к несуществующему классу, прежде чем упасть с ошибкой, php вызовет твою функцию и даст ей имя класса. Ты можешь подгрузить его и тем самым избежать ошибки.
> то он его пытается найти в файле с таким именем?
Тебе дается имя класса и ты можешь делать с ним что угодно. Но лучше использовать стандарты — PSR-2 или PSR-4. В PSR-2 подчеркивания заменяются на разделитель каталогов и приписывается .php:
My_Awesome_Class -> My/Awesome/Class.php
В PSR-4 используются неймспесы:
\My\Awesome\Class -> My/Awesome/Class.php
Свои стандарты придумывать не надо. Вариант «имя файла = имя класса + .php» вполне соотсветствует любому из этих стандартов.
>>369270
Посмотри внимательно:
> $this->y = $this->x - 1
>>369272
Теперь как раз верно. Вот тут можно немного упростить код:
$paymentTotal = ($paymentTotal + $monthlyPayment); записать через +=
> Посмотри внимательно:
> $this->y = $this->x - 1
От оно чо. А я думал магия какая.
> Неплохо, но можно сделать еще проще. попробуй вместо нескольких if в строках 29-39 написать 1-2 строки на основе функции min().
Done
http://ideone.com/jWcdRb
> Не всегда. \\ в любой строке вставляет один бекслеш, а не два. Изучи внимательно мануал.
А, все - понял что два исключения есть \' и \\. Ладно подожду что другой оп скажет и буду думать, но вообще да, кажется логичным юзать на всякий случай два, если от этого хуже не будет но может защитить от ошибки лишней.
> $issued = array(...
Надо бы его автоматом создавать из $bills, чтобы менять число и тип купюр было легче. Тебе наверняка в этом поможет функция array_fill_keys которая позволит сделать это в 1 строчку.
> $bills = array_reverse($bills, true);
Приавльнее сортировать массив по ключам по убыванию (krsort) — тогда можно указывать купюры в любом порядке что зазщищает нас от ошибок.
Сам алгоритм программы верный, считает правильно.
Поправил, но уже в задаче про айпад. Но мне не нравится это решение с кучей аргументов в функции.
http://ideone.com/txwtsj
Почитал мануал, попытался решить при помощи объявлений переменных глобальными и статичными но почему-то программа стала считать неверно. В чем проблема?
http://ideone.com/6O9Dgr
>Регулярные выражения тут тебе помогут.
Я понимаю, что от моей ереси наверняка уже тошнит, но погляди ещё, пожалуйста:
https://github.com/Wiedzal/uppu/blob/master/module/Uppu/src/Uppu/Model/ArchiveUtil.php
Парсер вроде стал лаконичней и понятней.
-Отрезаю верхушку листинга по -------
-Разбиваю всё остальное на строки 'Path ... Version = ...'(По идее Path и Version в имени не должны ничего поломать)
-Эти строки разбиваю по \n и потом по первому "=" на ключ=>значение
Пойдёт?
Оп, погляди на метод getDangers(). Сразу поясню:
$xClone и $yClone, $i и $j в начале вычисляются, т.к. мышь может стоять у стены, и тогда цикл будет считать неизвестные индексы (искать опасность за стеной).
http://ideone.com/BV9mUo
Оно выводит саму страницу, но без картинок и стилей. А можно вывести сайт полностью, как в оригинале?
Изначально я думал, что выведется html код сайта, как это сделать?
А можно не писать все эти html условности (html, head, body), когда я использую только один php код?
http://ideone.com/FDXYTQ
А тут ничего не выводит, хотя кое-где вычитал, что титл должен выводиться.
http://simplehtmldom.sourceforge.net/
Оп, глянь туда. $html стал уже объектом? Что за функция find? Не могу найти в мануале.
В общем все, что касается парсинга. А то на работе заходила об этом речь, а я ничего не знаю.
Ага, еще надо качать файл "simple_html_dom.php", инклудить и пользоваться. То есть это все не родное? Есть что не надо подключать для парсинга? Расскажи подробнее с ссылками.
Т.е. если я напишу скандир и там уже из_диром проверю на трушность папки, то найду папки, а как найти картинки?
Я, конечно, могу написать что-нибудь типа, стррпоз до точки и потом сабстр от стррпоз, а потом сделать проверку на все возможные форматы картинок, но это, по мне, костыль.
Тут вроде так и делали. Один анон регуляркой типа jpg|jpeg|png, другой через switch и что-то там дальше.
> от моей ереси наверняка уже тошнит
Совсем нет.
> (?:^|\n)
Есть такой флаг m (multiline), при его использовании ^ и $ соответствуют не только началу/концу текста, но и началу/концу любой строки. Подробности в мануале.
Алсо, не понимаю, зачем ты все усложняешь. Зачем тебе полe version?
Ты используешь preg_split по символу «=». А будет ли этот код правильно работать если в имени файла содержится знак «=»?
Проще пройти циклом по списку строк, если строка начинается с path = берешь с нее имя файла и кладешь в массив. Все.
Алсо, я нашел подвох. Если 7z выдает нам список файлов в cp866, это значит что многие символы не будут корректно отображаться (иероглифы например), так как cp866 — убогая 8-битная кодировка в которой есть только русские буквы и кой-какие знаки, и все. Печалька.
И еще:
> if ($err_code == 0) {
А если не равен нулю то что? Надо сделать оброаботку ошибок.
И оп, я загорелся написать какой-нибудь парсер. Я не доделал задачу кошки-мышки, но я ее параллельно по-тихоньку делаю. Оп, можешь написать задачу спарсить что-нибудь? Я хочу познать эту науку.
Как же меня раздражает мануал PHP после редизайна. Чем, спросите вы? Нереальнйо тормознутостью. Там мегабайт сторонних шрифтов, которые, я подозреваю, грузятся откуда-то с другого конца планеты, и пока эта дрянь загрузится, проходит минимум 3-4 секунды, в течение которых страница отображается без текста. При том, что это технический мануал, а не сайт студии Артемия Лебедева.
Я за 3-4 секунды могу придумать 2 поста с ценной информацией, но вынужден ждать пока загрузится эта страница. Это теперь сайт для людей с замедленным мышлением?
Сайт верстали идиоты (которыми в массе своей и являются современные верстальщики). Они конечно и раньше были не особо умнее, но раньше не было css3, html5, бледно-серых шрифтов и привычки лепить огромное квадратное меню слева.
> могу написать что-нибудь типа, стррпоз до точки и потом сабстр от стррпоз,
Если тебе нужно не тип файла, а расширение, то можно исплоьзовать
1) регулярные выражения
2) http://php.net/manual/ru/function.pathinfo.php
Если тебя интересует реальное содержимое файла, используй finfo или getimagesize().
>Зачем тебе полe version?
А там не только оно, я его со всем остальным вытаскиваю. Проще было бы пробежаться по "Path = ", да но нужен же ещё сжатый/не сжатый размер. Я просто хотел одним махом как-то привести все выводимые параметры к удобному виду, мало ли что потом понадобится.
Знаки "=" проверял, но с моими познаниями в регулярках надо бы ещё потестить, конечно.
Нет там особого искусства. Как правило, «парсингом» (который правильно называется web scraping, парсинг — это другое, смотри вики) занимаются школьники, которые толком языка не знают.
Но раз анон просит задачку, дадим ему задачку. Чтобы не быть как школьники, давай будем писать нормальный код и разбирать HTML с помощью DOM/XPath (это расширения PHP который поставляются вместе с ним).
Варианты такие:
- спарсить информацию о маршрутах общественного транспорта в БД с какого-нибудь сайта, например http://transport.orgp.spb.ru/Portal/transport/routes
- спарсить и сгруппировать информацию о последних раздачах с какого-нибудь торрент-трекера, например http://www.nyaa.se/
Для скачивания страниц удобно использовать не просто curl, а какую-нибудь библиотек-обертку, тысячи их: http://www.google.ru/search?newwindow=1&q=php+web+client
Надо корректно обрабатывать различные возможные ошибки.
Надо делать паузы после каждой страницы, чтобы не нагружать сайт.
Для тестирования лучше не скачивать страницу каждый раз заново, а сохранить ее на диск и брать с диска.
У меня есть в голове еще идея более глобальной задачки под названием «сделай свой собственный гугол», но наверно это будет сложновато для начала, лучше начинать с вещей попроще.
Алсо, спасибо за тык в multiline, вообще сейчас займусь задачами на регулярки. Следовало это раньше сделать, конечно.
Хотя я не очень понимаю, зачем знать сжатый размер и процент сжатия, ну ладно, пусть будет.
>>369307
5 аргументов — еще терпимо. А если больше то уже ООП нужен.
> if ($creditBalance - $monthlyPayment < 0) {
Почему не написать просто $a < $b ?
> $paymentTotal += $creditBalance + $acCost;
acCost надо прибавлять в самом начале, тогда на него тоже проценты набегать будут, банку же так выгоднее.
В остальном, все верно.
>>369319
Ну пусть так будет, ок. виду выглядит более-менее нормально.
> $chunks = preg_split("/([^=]+)=/", $line, null,
> PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
Тут обычного explode хватит, почитай мануал к нему. Там и ограничение на число частей есть.
Кстати, в использовании разархиватора есть определенный риск. Если в нем есть какая-то уязвимость, например из-за ошибки разбора какого-то значения в заголовке архива, злоумышленник может этим воспользоваться и загрузить спеиально сделанный архив. Например, в библиотеке работы с архивами libarchive было такое: http://www.linuxsecurity.com/content/view/161607/
Уязвимости позволяли злоумышленнику добиться выполнения своего кода.
В 7-zip вроде тоже одна уязвимость была с выполнением произвольного кода: http://xforce.iss.net/xforce/xfdb/41247
А вот тут есть пак архивов (включая спеиально поврежденные) для тестирования ошибок и уязвимостей в распаковщике: https://www.ee.oulu.fi/research/ouspg/PROTOS_Test-Suite_c10-archive − правда, на английском.
Хотя я не очень понимаю, зачем знать сжатый размер и процент сжатия, ну ладно, пусть будет.
>>369307
5 аргументов — еще терпимо. А если больше то уже ООП нужен.
> if ($creditBalance - $monthlyPayment < 0) {
Почему не написать просто $a < $b ?
> $paymentTotal += $creditBalance + $acCost;
acCost надо прибавлять в самом начале, тогда на него тоже проценты набегать будут, банку же так выгоднее.
В остальном, все верно.
>>369319
Ну пусть так будет, ок. виду выглядит более-менее нормально.
> $chunks = preg_split("/([^=]+)=/", $line, null,
> PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
Тут обычного explode хватит, почитай мануал к нему. Там и ограничение на число частей есть.
Кстати, в использовании разархиватора есть определенный риск. Если в нем есть какая-то уязвимость, например из-за ошибки разбора какого-то значения в заголовке архива, злоумышленник может этим воспользоваться и загрузить спеиально сделанный архив. Например, в библиотеке работы с архивами libarchive было такое: http://www.linuxsecurity.com/content/view/161607/
Уязвимости позволяли злоумышленнику добиться выполнения своего кода.
В 7-zip вроде тоже одна уязвимость была с выполнением произвольного кода: http://xforce.iss.net/xforce/xfdb/41247
А вот тут есть пак архивов (включая спеиально поврежденные) для тестирования ошибок и уязвимостей в распаковщике: https://www.ee.oulu.fi/research/ouspg/PROTOS_Test-Suite_c10-archive − правда, на английском.
Оп, я думал, ты напишешь с чего начать. Ну я curl использовал, когда у меня стоял линукс. И частенько я качал различные файлы через curl, т.к. wget у меня не было. Это оно? Это тот же curl?
> ($this->y + 4 > Field::HEIGHT) ? $this->y +
Лучше делать это через min()/max()
> for ($j; $j < $yClone; $j++) {
for (; $j < $yClone; $j++)
> $dangers[] = array($j, $i);
По моему гораздо удобнее класть в массив сам объект, который находится в этой клетке.
Ну и этот метод не у мыши должен быть. Мне кажется, надо вместо этого сделать у карты метод вроде «получить список всех кошек в радиусе R от такой-то точки».
> public function getPossibleSteps($field)
вариант «стоять на месте» рассматривается?
>>369330
> Оно выводит саму страницу, но без картинок и стилей
Ты делаешь все неприавльно. Смотри сам, у тебя там выводится шапка:
> <html>
> <head>
А потом шапка выводится еще раз, с встроенного сайта. при таком условии нельзя рассчитывать что страница отобразится верно так как ты делаешь невалидный html код.
> но без картинок и стилей
Открой отладчик в браузере и посмотри почему.
> А можно не писать все эти html условности
Зависит от ситуации. Пустой тег title писать точно не надо.
> А тут ничего не выводит
Поставь var dump проверь что в переменных и почему не работает.
> $html стал уже объектом? Что за функция find? Не могу найти в мануале.
А в каком мануале ты ищешь? Это сторонняя библиотека и надо читать ее мануал, а не мануал PHP (говорит капитан очевидность).
Эта библиотека — оберка, над DOM или чем-то аналогичным. Логично сначала изучить DOM/Xpath, а потом уже эту библиотеку. Иначе ты вряд ли толком что-то поймешь.
> ($this->y + 4 > Field::HEIGHT) ? $this->y +
Лучше делать это через min()/max()
> for ($j; $j < $yClone; $j++) {
for (; $j < $yClone; $j++)
> $dangers[] = array($j, $i);
По моему гораздо удобнее класть в массив сам объект, который находится в этой клетке.
Ну и этот метод не у мыши должен быть. Мне кажется, надо вместо этого сделать у карты метод вроде «получить список всех кошек в радиусе R от такой-то точки».
> public function getPossibleSteps($field)
вариант «стоять на месте» рассматривается?
>>369330
> Оно выводит саму страницу, но без картинок и стилей
Ты делаешь все неприавльно. Смотри сам, у тебя там выводится шапка:
> <html>
> <head>
А потом шапка выводится еще раз, с встроенного сайта. при таком условии нельзя рассчитывать что страница отобразится верно так как ты делаешь невалидный html код.
> но без картинок и стилей
Открой отладчик в браузере и посмотри почему.
> А можно не писать все эти html условности
Зависит от ситуации. Пустой тег title писать точно не надо.
> А тут ничего не выводит
Поставь var dump проверь что в переменных и почему не работает.
> $html стал уже объектом? Что за функция find? Не могу найти в мануале.
А в каком мануале ты ищешь? Это сторонняя библиотека и надо читать ее мануал, а не мануал PHP (говорит капитан очевидность).
Эта библиотека — оберка, над DOM или чем-то аналогичным. Логично сначала изучить DOM/Xpath, а потом уже эту библиотеку. Иначе ты вряд ли толком что-то поймешь.
Надо HTTP-клиент (для скачивания страниц) и DOM/Xpath (для разбора HTML и выделения нужных данных).
>>369351
Там еще флаг s есть который заставляет точку соотсветвовать абсолютно любому символу, тоже посмотри.
>>369356
То что ты исплоьзовал — это скорее всего команда curl (а не расширение PHP curl). Но внутри да, они использу.т одну и ту же библиотеку curl.
По curl достаточно прочесть мануал, но лучше не работать с ним, а взять любую библиотеку http клиент.
>Xpath — это язык запросов к элементам xml или xhtml документа.
Окей, но страница у меня не xhtml. Одиночные теги я не закрываю. Может это помешать?
Ладно, вопросов много, завтра напишу все в одном месте и параллельно почитаю что-нибудь.
Немного теории.
curl ты можешь изучить по мануалу PHP. HTTp-клиент ищется по запросу «php http client», посмотри, поизучай, возьми тот который понравится.
Про DOM. DOM — это библиотека для работы с XML и HTML. Она позволяет разобрать HTML-страницу и превратить ее в дерево элементов, по которому удобно перемещаться, искать элементы, читать их аттрибуты и текст в них. При этом не надо заморачиваться с кодировками и htmlspecialchars. DOM придуман не в PHP, это по сути стандарт, который поддерживается многими языками программирования.
Инфа:
http://php.net/manual/ru/intro.dom.php
http://www.keblog.ru/page/parsing-html-na-php
http://blog.ox2.ru/php/dom/
Про XPAth. XPath — это язык запросов, с помощью которого можно искать элементы в DOM по разным условиям. Он отдаленно напоминает CSS, только со слешами. Например, запрос
//a/strong
Ищет все элементы strong, у которых есть родитель элемент «a». Исплоьзование XPAth позволяет обойтись без написания рутинного кода по обходу и перебору элементов. Информация:
http://www.zvon.org/xxl/XPathTutorial/General_rus/examples.html
http://ru.wikipedia.org/wiki/XPath
http://habrahabr.ru/post/114772/
> Окей, но страница у меня не xhtml.
Xpath работает не со строкой или html-кодом, а с деревом DOM. А у дерева DOM есть метод loadHtml() который как раз может распарсить HTML, в том числе с ошибками. Так что проблемы нет.
Вот тебе кстати простая задачка на DOM: сделай программу, которая находит все css-файлы и js-скрипты на странице, и выводит их URL. Это строчек 10-20, не больше.
То есть нужно найти все подключенные скрипты и стили к этой странице? То есть в тегах <link> и <script> найти href и src соответственно? Или я опять не о том думаю?
<?php
$dom = new DomDocument();
$dom->loadHTML("http://example.com/");
$link = $dom->getElementsByTagName("link");
echo $link->item(0)->textContent;
?>
Что-то типа того?
>$dom = new DomDocument();
Тут я создаю объект для класса DomDocument.
>$dom->loadHTMLFile("http://example.com/");
Загрузка html из файла. А можно тут просто написать loadHTML?
>$link = $dom->getElementsByTagName("link");
getElementsByTagName, как я понял по мануалу, возвращает объект класса DOMNodeList. Окей, то есть внутри этого метода создается новый объект некого класса DOMNodeList. Вроде метод-фабрика такая, да?
А если тегов link несколько, то возвращается массив объектов?
>echo $link->item(0)->textContent;
Item в мануале встречается в DOMNodelist::item и в DOMNamedNodeMap::item. В чем отличие?
Итак, $link - объект класса DOMNodeList. Или массив объектов?
В нем есть метод item(0) с индексом 0. - Почему не что-то вроде $link[0]->item($link[0])?
Дальше textContent - это свойство класса DOMNode. Но мы были классе DOMNodeList в методе item, а теперь уже снова как-то обратились к классу DOMNode и к свойству textContent, которое даже не константа.
Значит внутри item() создается объект класса DOMNode?
Я пока писал сам запутался. В мануале по этим вещам подробно не расписано. Пару предложений и все.
Оп, объясни мне толково, как связываются друг с другом все эти классы вот здесь: http://php.net/manual/ru/intro.dom.php ? Предопределенные константы имеют отношение ко всему этому?
Мне кажется, если разобрать, как все эти классы работают, тогда и понимание придет, верно?
<?php
$dom = new DomDocument();
$dom->loadHTML("http://example.com/");
$link = $dom->getElementsByTagName("link");
echo $link->item(0)->textContent;
?>
Что-то типа того?
>$dom = new DomDocument();
Тут я создаю объект для класса DomDocument.
>$dom->loadHTMLFile("http://example.com/");
Загрузка html из файла. А можно тут просто написать loadHTML?
>$link = $dom->getElementsByTagName("link");
getElementsByTagName, как я понял по мануалу, возвращает объект класса DOMNodeList. Окей, то есть внутри этого метода создается новый объект некого класса DOMNodeList. Вроде метод-фабрика такая, да?
А если тегов link несколько, то возвращается массив объектов?
>echo $link->item(0)->textContent;
Item в мануале встречается в DOMNodelist::item и в DOMNamedNodeMap::item. В чем отличие?
Итак, $link - объект класса DOMNodeList. Или массив объектов?
В нем есть метод item(0) с индексом 0. - Почему не что-то вроде $link[0]->item($link[0])?
Дальше textContent - это свойство класса DOMNode. Но мы были классе DOMNodeList в методе item, а теперь уже снова как-то обратились к классу DOMNode и к свойству textContent, которое даже не константа.
Значит внутри item() создается объект класса DOMNode?
Я пока писал сам запутался. В мануале по этим вещам подробно не расписано. Пару предложений и все.
Оп, объясни мне толково, как связываются друг с другом все эти классы вот здесь: http://php.net/manual/ru/intro.dom.php ? Предопределенные константы имеют отношение ко всему этому?
Мне кажется, если разобрать, как все эти классы работают, тогда и понимание придет, верно?
Да.
>>369405
> Тут я создаю объект для класса DomDocument.
Объект класса DomDocument (то есть относящийся к классу DomDocument), без «для»
> Загрузка html из файла. А можно тут просто написать loadHTML?
Мануал:
http://php.net/manual/ru/domdocument.loadhtml.php
http://php.net/manual/ru/domdocument.loadhtmlfile.php
> getElementsByTagName, как я понял по мануалу, возвращает объект класса DOMNodeList. Окей, то есть внутри этого метода создается новый объект некого класса DOMNodeList.
DOMNodeList — это объект-коллекция. То есть он внутри хранит список найденных узлов (элементов). Обрати внимание, в мануале написано:
http://php.net/manual/ru/class.domnodelist.php
> DOMNodeList implements Traversable
Это значит, что объект класса DOMNodeList можно использовать в foreach.
> Вроде метод-фабрика такая, да?
Нет, это не фабрика, так как главная цель этой функции — поиск элементов по имени. Если бы она только создавала объект и ничего больше, может быть она бы и была фабрикой.
> А если тегов link несколько, то возвращается массив объектов?
Нет, всегда возвращается ровно один объект-коллекция. А в нем может быть от 0 до бесконечности элементов.
Кстати, интересная вещь. В Стандарте DOM ( http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-536297177 ) написано:
> NodeList objects in the DOM are live.
Это значит, что если ты сделал поиск, например, элементов с именем link, получил результат, а потом добавил в DOM еще пару элементов link (или удалил), то они добавятся/исчезнут из результатов поиска. Не знаю, реализовано ли это в PHP, можешь проверить.
Собственно, потому тут и используется объект для результатов поиска.
> Почему не что-то вроде $link[0]
Потому что $link[0] исплоьзуется для получения элеимента массива, а $link не массив, а объект. К нему нельзя обращаться через квадратные скобки.
> Значит внутри item() создается объект класса DOMNode?
Нет. Он не создает новый объект, а возвращает ссылку на один из существующих узлов дерева DOM. Таким образом, если ты в дереве например поменяешь значение аттрибута у элемента, оно поменяется и в результатах поиска.
> Я пока писал сам запутался.
А ты задавай вопросы. А вообще, лучший способ разобраться в DOM — написать свою реализацию DOM (упрощенную естественно). Если у тебя есть время и желание этим заняться, могу написать задание.
> В мануале по этим вещам подробно не расписано. Пару предложений и все.
Потому что DOM — это не изобретение авторов PHP, а (частичная) реализация стандарта W3C: http://www.w3.org/TR/DOM-Level-2-Core/ . Реализуют они его подключив библиотеку libxml2.
DOM — это способ представить HTML- или XML-документ в виде дерева узлов. HTML — это язык разметки веб-страниц, XML — это язык общего назначения (то есть каждый может придумать свои названия элементов и решать что они обозначают).
DOM поддерживается во многих языках: Ява, C++ и в браузере — в нем тоже есть реализация DOM (с которой можно взаимодействовать из программы на яваскрипте). То есть используется он повсеместно.
Это кстати, хорошо, что есть общий стандарт, а то каждый бы свой велосипед придумывал.
Да.
>>369405
> Тут я создаю объект для класса DomDocument.
Объект класса DomDocument (то есть относящийся к классу DomDocument), без «для»
> Загрузка html из файла. А можно тут просто написать loadHTML?
Мануал:
http://php.net/manual/ru/domdocument.loadhtml.php
http://php.net/manual/ru/domdocument.loadhtmlfile.php
> getElementsByTagName, как я понял по мануалу, возвращает объект класса DOMNodeList. Окей, то есть внутри этого метода создается новый объект некого класса DOMNodeList.
DOMNodeList — это объект-коллекция. То есть он внутри хранит список найденных узлов (элементов). Обрати внимание, в мануале написано:
http://php.net/manual/ru/class.domnodelist.php
> DOMNodeList implements Traversable
Это значит, что объект класса DOMNodeList можно использовать в foreach.
> Вроде метод-фабрика такая, да?
Нет, это не фабрика, так как главная цель этой функции — поиск элементов по имени. Если бы она только создавала объект и ничего больше, может быть она бы и была фабрикой.
> А если тегов link несколько, то возвращается массив объектов?
Нет, всегда возвращается ровно один объект-коллекция. А в нем может быть от 0 до бесконечности элементов.
Кстати, интересная вещь. В Стандарте DOM ( http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-536297177 ) написано:
> NodeList objects in the DOM are live.
Это значит, что если ты сделал поиск, например, элементов с именем link, получил результат, а потом добавил в DOM еще пару элементов link (или удалил), то они добавятся/исчезнут из результатов поиска. Не знаю, реализовано ли это в PHP, можешь проверить.
Собственно, потому тут и используется объект для результатов поиска.
> Почему не что-то вроде $link[0]
Потому что $link[0] исплоьзуется для получения элеимента массива, а $link не массив, а объект. К нему нельзя обращаться через квадратные скобки.
> Значит внутри item() создается объект класса DOMNode?
Нет. Он не создает новый объект, а возвращает ссылку на один из существующих узлов дерева DOM. Таким образом, если ты в дереве например поменяешь значение аттрибута у элемента, оно поменяется и в результатах поиска.
> Я пока писал сам запутался.
А ты задавай вопросы. А вообще, лучший способ разобраться в DOM — написать свою реализацию DOM (упрощенную естественно). Если у тебя есть время и желание этим заняться, могу написать задание.
> В мануале по этим вещам подробно не расписано. Пару предложений и все.
Потому что DOM — это не изобретение авторов PHP, а (частичная) реализация стандарта W3C: http://www.w3.org/TR/DOM-Level-2-Core/ . Реализуют они его подключив библиотеку libxml2.
DOM — это способ представить HTML- или XML-документ в виде дерева узлов. HTML — это язык разметки веб-страниц, XML — это язык общего назначения (то есть каждый может придумать свои названия элементов и решать что они обозначают).
DOM поддерживается во многих языках: Ява, C++ и в браузере — в нем тоже есть реализация DOM (с которой можно взаимодействовать из программы на яваскрипте). То есть используется он повсеместно.
Это кстати, хорошо, что есть общий стандарт, а то каждый бы свой велосипед придумывал.
Вообще, наглядно увидеть дерево DOM можно открыв инспектор в Хроме/ФФ на вкладке Elements. При парсинге HTML-документ разбивается на узлы, из которых составляется дерево DOM.
Узлы бывают таких типов: документ, элемент, текст, мнемоника (html-сущность), доктайп, комментарий и может быть что-то еще.
Что такое дерево: http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_(%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85)
Узлы могут быть вложенными друг в друга, соответственно у узла могут быть 1 родитель (parent), предки (ancestors), дети (children) и братья (siblings). Графически это изображено тут: http://javascript.ru/tutorial/dom/intro на примере реализации DOM в браузере. Например, свойство parentNode у элемента хранит его родителя, а свойство children — коллекцию детей.
> как связываются друг с другом все эти классы вот здесь
DOMNode — базовый класс для узлов дерева. От него наследуются:
- DOMElement — это элемент, который в HTML соответствует одному тегу вроде <p>
- DOMDocumentType — соответствует доктайпу (это штука которая идет в самом начале html кода <!DOCTYPE...>)
- DOMDocument
- DOMEntityReference — соответствует HTML-мнемонике: http://ru.wikipedia.org/wiki/%D0%9C%D0%BD%D0%B5%D0%BC%D0%BE%D0%BD%D0%B8%D0%BA%D0%B8_%D0%B2_HTML Не уверен что он используется в HTML-дереве.
- DOMAttr — соответствует аттрибуту элемента (например аттрибут href у ссылки). Родителем аттрибута может быть только элемент, у текста или комментария аттрибутов нет.
DOMCharacterData — абстрактный узел, который может содержать текст. От него наследуются:
- DOMText — это узел, представляющий блок текста, например: <p>Hello World</p> создает DOMElement с именем p, внутри которого находится DOMText с значением «Hello World». У текста очевидно детей быть не может.
- DOMComment — соответствует HTML-комментарию. У него тоже нет детей.
Эти узлы есть только в XML:
- DOMCdataSection — соответствует блоку CDATA
- DOMProcessingInstruction — соответствует Processign Instruction
DOMDocument — представляет собой документ (то есть целое дерево DOM), содержит внутри себя все узлы. Корневой узел (обычно это элемент <html>) можно получить как $doc->documentElement
DOMDocumentFragment — позволяет хранить в себе фрагмент документа, от 0 до бесконечности узлов, которые например можно вставить в документ одним разом. Редко исплоьзуется.
DOMEntity — это определение новой html/xml-мнемоники, вряд ли понадобится.
DOMImplementation, DOMNotation — не знаю зачем, посмотри в стандарте.
DOMNamedNodeMap, DOMNodeList - коллекции элементов. В DOMNodeLIst они под номерами, а в NodeMap могут еще иметь ключи-строки.
DOMXPath — класс для поиска узлов в дереве DOM с помощью Xpath-запросов.
Вот я нашел диаграмму, на которой показано наследование классов: http://www.falkhausen.de/en/diagram/html/org.w3c.dom.html
Вообще, наглядно увидеть дерево DOM можно открыв инспектор в Хроме/ФФ на вкладке Elements. При парсинге HTML-документ разбивается на узлы, из которых составляется дерево DOM.
Узлы бывают таких типов: документ, элемент, текст, мнемоника (html-сущность), доктайп, комментарий и может быть что-то еще.
Что такое дерево: http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_(%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85)
Узлы могут быть вложенными друг в друга, соответственно у узла могут быть 1 родитель (parent), предки (ancestors), дети (children) и братья (siblings). Графически это изображено тут: http://javascript.ru/tutorial/dom/intro на примере реализации DOM в браузере. Например, свойство parentNode у элемента хранит его родителя, а свойство children — коллекцию детей.
> как связываются друг с другом все эти классы вот здесь
DOMNode — базовый класс для узлов дерева. От него наследуются:
- DOMElement — это элемент, который в HTML соответствует одному тегу вроде <p>
- DOMDocumentType — соответствует доктайпу (это штука которая идет в самом начале html кода <!DOCTYPE...>)
- DOMDocument
- DOMEntityReference — соответствует HTML-мнемонике: http://ru.wikipedia.org/wiki/%D0%9C%D0%BD%D0%B5%D0%BC%D0%BE%D0%BD%D0%B8%D0%BA%D0%B8_%D0%B2_HTML Не уверен что он используется в HTML-дереве.
- DOMAttr — соответствует аттрибуту элемента (например аттрибут href у ссылки). Родителем аттрибута может быть только элемент, у текста или комментария аттрибутов нет.
DOMCharacterData — абстрактный узел, который может содержать текст. От него наследуются:
- DOMText — это узел, представляющий блок текста, например: <p>Hello World</p> создает DOMElement с именем p, внутри которого находится DOMText с значением «Hello World». У текста очевидно детей быть не может.
- DOMComment — соответствует HTML-комментарию. У него тоже нет детей.
Эти узлы есть только в XML:
- DOMCdataSection — соответствует блоку CDATA
- DOMProcessingInstruction — соответствует Processign Instruction
DOMDocument — представляет собой документ (то есть целое дерево DOM), содержит внутри себя все узлы. Корневой узел (обычно это элемент <html>) можно получить как $doc->documentElement
DOMDocumentFragment — позволяет хранить в себе фрагмент документа, от 0 до бесконечности узлов, которые например можно вставить в документ одним разом. Редко исплоьзуется.
DOMEntity — это определение новой html/xml-мнемоники, вряд ли понадобится.
DOMImplementation, DOMNotation — не знаю зачем, посмотри в стандарте.
DOMNamedNodeMap, DOMNodeList - коллекции элементов. В DOMNodeLIst они под номерами, а в NodeMap могут еще иметь ключи-строки.
DOMXPath — класс для поиска узлов в дереве DOM с помощью Xpath-запросов.
Вот я нашел диаграмму, на которой показано наследование классов: http://www.falkhausen.de/en/diagram/html/org.w3c.dom.html
Верно решено, но оформление страшноватое, пропусти-ка код через phpformatter.com
И $age++ надо бы поставить в шапку цикла:
for ($age=16; $age<=100; $age++)
>>369458
Неплохо, но где проверка на ничью (не даблы, а именно ничья).
>>369470
> [^а-яА-Я]здел
Сначала идет любой символ, кроме буквы, за ним «здел». В начале строки перед «здел» нет символа, потому не срабатывает.
Можно написать «начало строки или любой символ, кроме...» так: (^|[^...])
Ну и код через phpformatter пропусти, а то страшноват.
>А вообще, лучший способ разобраться в DOM — написать свою реализацию DOM (упрощенную естественно)
Давай, если конечно не займет у меня месяцы на решение.
А что там на пхп писать? Это просто статичные страницы, там не нужно ничего кроме хтмл.
>> phpformatter
> Щито это и для чего?
Прочти пост: >>365644
>>369495
Ну хорошо. Итак, сделай свой аналог DOMDocument со товарищи, только классы назовем по-другому, например, TinyDocument. Надо реализовать такие классы, методы и свойства:
Из DOMNode: $nodeName, $nodeValue, $nodeType, $parentNode, $childNodes, $firstChild, $lastChild, $previousSibling, $nextSibling, $ownerDocument, $textContent
Методы appendChild, cloneNode, getNodePath, hasAttributes, hasChildNodes, insertBefore, isSameNode, normalize, removeChild, replaceChild
Из DOMCharacterData: $data, $length, appendData, deleteData, insertData, replaceData, substringData
Из DOMDocumentType: $name
Из DOMElement: $tagName, getAttribute, getElementsByTagName, hasAttribute, removeAttribute, setAttribute,
Из DOMException: $code
Из DOMText: $wholeText, isWhitespaceInElementContent, splitText
Из DOMDocument: $doctype, $documentElement, $encoding, createComment, createElement, createDocumentFragment, createElement, createTextNode, getElementById, getElementsByTagName, importNode, saveHTML.
Из DOMComment, DOMDocumentFragment — только сами классы
Реализовать конструкторы там где они есть. Реализовать аналоги DOMNodeList/NamedMap если они понадобятся, если нет то не надо.
Метод setIdAttribute не нужен — аттрибутом-идентификатором можно жестко задать «id»
Если с этим справишься, можно попробовать взяться за часть2: реализовать метод loadHTML().
Если вопросы, задавай.
>> phpformatter
> Щито это и для чего?
Прочти пост: >>365644
>>369495
Ну хорошо. Итак, сделай свой аналог DOMDocument со товарищи, только классы назовем по-другому, например, TinyDocument. Надо реализовать такие классы, методы и свойства:
Из DOMNode: $nodeName, $nodeValue, $nodeType, $parentNode, $childNodes, $firstChild, $lastChild, $previousSibling, $nextSibling, $ownerDocument, $textContent
Методы appendChild, cloneNode, getNodePath, hasAttributes, hasChildNodes, insertBefore, isSameNode, normalize, removeChild, replaceChild
Из DOMCharacterData: $data, $length, appendData, deleteData, insertData, replaceData, substringData
Из DOMDocumentType: $name
Из DOMElement: $tagName, getAttribute, getElementsByTagName, hasAttribute, removeAttribute, setAttribute,
Из DOMException: $code
Из DOMText: $wholeText, isWhitespaceInElementContent, splitText
Из DOMDocument: $doctype, $documentElement, $encoding, createComment, createElement, createDocumentFragment, createElement, createTextNode, getElementById, getElementsByTagName, importNode, saveHTML.
Из DOMComment, DOMDocumentFragment — только сами классы
Реализовать конструкторы там где они есть. Реализовать аналоги DOMNodeList/NamedMap если они понадобятся, если нет то не надо.
Метод setIdAttribute не нужен — аттрибутом-идентификатором можно жестко задать «id»
Если с этим справишься, можно попробовать взяться за часть2: реализовать метод loadHTML().
Если вопросы, задавай.
Ты видишь только экспортированную версию. А версия для разработки у меня на PHP.
>>369505
Сделай тогда чтобы выводилась не первая, а все ошибки: http://ideone.com/MT5XpO
Тебе поможет preg_match_all. Ну и сайт phpformatter.
>>369495
Делать удобно в таком порядке:
- создай пустые классы и унаследуй их как положено
- создай методы типа appendChild(), которыми можно будет добавлять узлы в дерево
- потом все остальное
Оп, а можно для каждого класса свой файл? Мне кажется в одном трудно будет сориентироваться.
http://ideone.com/6TyXy6 сделал, чтобы выводил все ошибки. Кстати, почему когда выводишь элемент массива как строку echo "$matches[0][$i]" он выдаёт array вместо содержимого?
Ну да, надо инклудами наверное.
Я тут рефрешил поискработысайт и наткнулся на джунопхпвакансию, что бывает не так часто в моем городе. Причем эта вакансия уже пару недель бампается, ну решил отписать. Было задание-фильтр для отклика на вакансию, где нужно было написать функцию, которая на вход принимает конфиг-файл, со строками типа "session.server.0.host=127.0.0.1", и нужно было возвратить многомерныймассив с сохранением структуры, которая задается точками. В общем, убил много времени, но кое-как осилил %%Кому интересно: http://goo.gl/Rn8hMe%% не против почитать в чем и как сильно я обосрался
Короче, отправил я им это и получил новое задание, типа ознакомиться с технологиями, с которыми они работают.
Суть такова:
Необходимо написать простой аналог социальной сети, состоящий из нескольких страниц. Внешний вид может быть реализован по подобию популярных социальных сетей.
В проекте должны быть реализованы следующие возможности:
- Вход/регистрация
- Стена с возможностью оставлять сообщения и комментарии (все действия на странице должны выполняться с помощью ajax)
- Профиль пользователя
- Личные сообщения между пользователями
Для решения задачи необходимо использовать:
- MVC
- Yii фреймворк
- Twitter Bootstrap
- JQuery
База данных
- Mongo DB
Вопрос: сколько времени это должно занять, чтобы освоить самую суть на требуемом уровне? Twitter Bootstrap и Mongo DB даже не щупал и понятия не имею что из себя представляют.
Допустим сначала я выполняю $doc = new TinyDocument();
Затем выполняю $root = $doc->createElement('html');
Тут выполняется метод:
public function createElement($name)
{
$tagName = new TinyElement($name);
return $tagName;
}
Затем $root = $doc->appendChild($root);
Тут мануал говорит: "Функция добавляет дочерний узел к существующему списку потомков или создает новый список". А список объектов где хранится? Что он из себя представляет? Это массив объектов класса TinyElement? А где массив хранится?
некисло накуралесино, на вскидку вариант явно поменьше
$ar=array();$da=explode("\n",$s);
foreach($da as $d)if(!empty($d)){
$d2=explode('=',$d);
$d3=explode('.',$d2[0]);
$re=&$ar;
foreach($d2 as $k){
$re[$k]=array();
$re=&$re[$k];
}
$re=$d2[1];
}
Лол, и правда ведь explode есть, а я страдал зря
Почитал, почитал и понял, что этот NodeList виноват во всем. Пытаюсь вникнуть в итерацию и не могу понять ее смысл.
Зачем в NodeList свойство $length? Там что-то вне правил происходит. Как NodeList хранит узлы под индексами? Расскажи мне подробно про этот класс, он похоже мне все понимание портит.
Внизу написано:
> PHP Notice: Undefined offset: 3 in /home/mJJyhT/prog.php on line 10
Ты обращаешься к несуществующему элементу массива с индексом 3, надо исправить.
В остальном, выглядит верно.
> почему когда выводишь элемент массива как строку echo "$matches[0][$i]" он выдаёт array вместо содержимого?
Когда ты пишешь внутри кавычек переменную, не очень понятно где она заканчивается. PHP наверно берет в таких случаях первые скобки и получается $matches[0], а это массив. чтобы не было путаницы, используй фигурные скобки:
echo ".... {$matches[0][$i]} ... ";
Мануал: http://php.net/manual/ru/language.types.string.php#language.types.string.parsing
>>369560
Он встроен в php: http://php.net/manual/ru/class.exception.php
>>369576
Проект было логично назвать TinyDOM.
> Как их связать?
Для начала через require_once, потом сделать автозагрузчик.
> ?>
не ставь этот тег в конце файла, где только код. Это создаст тебе проблемы. Если за тегом окажется пробел, он выведется и может вызвать ошибки при работе с сессиями, куками, загловками (так как после вывода хотя бы одного символа, пусть даже пробела, нельзя отправлять заголовки).
> getElementsByTagName
2 раза подряд
Внизу написано:
> PHP Notice: Undefined offset: 3 in /home/mJJyhT/prog.php on line 10
Ты обращаешься к несуществующему элементу массива с индексом 3, надо исправить.
В остальном, выглядит верно.
> почему когда выводишь элемент массива как строку echo "$matches[0][$i]" он выдаёт array вместо содержимого?
Когда ты пишешь внутри кавычек переменную, не очень понятно где она заканчивается. PHP наверно берет в таких случаях первые скобки и получается $matches[0], а это массив. чтобы не было путаницы, используй фигурные скобки:
echo ".... {$matches[0][$i]} ... ";
Мануал: http://php.net/manual/ru/language.types.string.php#language.types.string.parsing
>>369560
Он встроен в php: http://php.net/manual/ru/class.exception.php
>>369576
Проект было логично назвать TinyDOM.
> Как их связать?
Для начала через require_once, потом сделать автозагрузчик.
> ?>
не ставь этот тег в конце файла, где только код. Это создаст тебе проблемы. Если за тегом окажется пробел, он выведется и может вызвать ошибки при работе с сессиями, куками, загловками (так как после вывода хотя бы одного символа, пусть даже пробела, нельзя отправлять заголовки).
> getElementsByTagName
2 раза подряд
Код ужасен. ну посмотри сам:
[\\s] равносильно просто \\s
Разбивать на строки нельзя по \\s так как если встроке есть пробел, то ее разобьет на две. Разбивать надо по символу конца строки \n
> array_pop($splitted);
Если после последней строки нет перевода строки или пробела, она потеряется
> function getRegexp($k) {
Это вообще какой-то кошмар, зачем там еще один файл читать, непонятно
> eval
eval is evil. Он тут, как и в 99% случаев, не нужен.
Формат, который тебе дали, кстати, называется ini: http://ru.wikipedia.org/wiki/.ini (стыдно не знать, именно в этом формате хранились конфиги в windows 3.11 и windows 95)
Есть вроде бы в ZF Zend_Config_Ini которы делает то же самое - http://framework.zend.com/manual/1.11/en/zend.config.adapters.ini.html — мог бы его использовать или посомтреть код.
> Вопрос: сколько времени это должно занять, чтобы освоить самую суть на требуемом уровне?
Чтобы изучить 2-3 недели уйдет легко.
Код ужасен. ну посмотри сам:
[\\s] равносильно просто \\s
Разбивать на строки нельзя по \\s так как если встроке есть пробел, то ее разобьет на две. Разбивать надо по символу конца строки \n
> array_pop($splitted);
Если после последней строки нет перевода строки или пробела, она потеряется
> function getRegexp($k) {
Это вообще какой-то кошмар, зачем там еще один файл читать, непонятно
> eval
eval is evil. Он тут, как и в 99% случаев, не нужен.
Формат, который тебе дали, кстати, называется ini: http://ru.wikipedia.org/wiki/.ini (стыдно не знать, именно в этом формате хранились конфиги в windows 3.11 и windows 95)
Есть вроде бы в ZF Zend_Config_Ini которы делает то же самое - http://framework.zend.com/manual/1.11/en/zend.config.adapters.ini.html — мог бы его использовать или посомтреть код.
> Вопрос: сколько времени это должно занять, чтобы освоить самую суть на требуемом уровне?
Чтобы изучить 2-3 недели уйдет легко.
Нет, это (и другие нарушения правил) можно только встроенными в PHP классам.
>>369610
> А список объектов где хранится?
У узла может быть список его детей. Он же должен знать кто его дети.
> Что он из себя представляет?
Это решаешь ты, если это не описано в стандарте. Скажу только, что список должен сохранять порядок, в котором идут дети.
> А где массив хранится?
Внутри объекта TinyNode наверно, где еще?
>>369641
NodeList — это коллекция (по сути чем-то похожа на массив). Ты можешь через length узнать сколько в ней элементов, можешь методом item() получить элемент с определенным номером, можешь обойти коллекцию с помощью foreach ($list as $node) — вроде все? На всякий случай в мануале проверь.
Как это сделать внутри — решаешь ты.
> Зачем в NodeList свойство $length?
Чтобы знать сколько в коллекции хранится элементов.
> Как NodeList хранит узлы под индексами?
Что, в объекте нельзя хранить массив с элементами в приватном свойстве?
> Расскажи мне подробно про этот класс, он похоже мне все понимание портит.
Задавай конкретные вопросы.
Нет, это (и другие нарушения правил) можно только встроенными в PHP классам.
>>369610
> А список объектов где хранится?
У узла может быть список его детей. Он же должен знать кто его дети.
> Что он из себя представляет?
Это решаешь ты, если это не описано в стандарте. Скажу только, что список должен сохранять порядок, в котором идут дети.
> А где массив хранится?
Внутри объекта TinyNode наверно, где еще?
>>369641
NodeList — это коллекция (по сути чем-то похожа на массив). Ты можешь через length узнать сколько в ней элементов, можешь методом item() получить элемент с определенным номером, можешь обойти коллекцию с помощью foreach ($list as $node) — вроде все? На всякий случай в мануале проверь.
Как это сделать внутри — решаешь ты.
> Зачем в NodeList свойство $length?
Чтобы знать сколько в коллекции хранится элементов.
> Как NodeList хранит узлы под индексами?
Что, в объекте нельзя хранить массив с элементами в приватном свойстве?
> Расскажи мне подробно про этот класс, он похоже мне все понимание портит.
Задавай конкретные вопросы.
Это копия, сохраненная 6 августа 2014 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.