Вы видите копию треда, сохраненную 18 августа 2014 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Это тред для начинающих. Не написал за свою жизнь ни одной программы? Ты наш человек.
Требуемые знания: умение читать. Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Netbeans PHP или PhpStorm (необязательно).
Предыдущий тред был тут: >>365643
У нас есть первые уроки по 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
Расскажи про поиск работы, фриланс etc Информация о фрилансе есть в /wrk . Также, походи по сайтам вроде hh.ru, hantim.ru, geekjob, fl.ru, посмотри, поизучай ситуацию. Имей в виду, кроме фриланса, где ты 2 дня ищешь заказ, полдня обсуждаешь за бесплатно суть работы, день делаешь и еще 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://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/
доска то у тебя зафаршмачена
> array_pop($splitted);
> Если после последней строки нет перевода строки или пробела, она потеряется
Средствами текстового редактора проверял наличие пустой строки в конце файла — ее не было, а код говорил что есть, почему так?
> Это вообще какой-то кошмар, зачем там еще один файл читать, непонятно
Это да, забыл объединить один и тот же кусок в разных функциях
> eval is evil. Он тут, как и в 99% случаев, не нужен.
По-другому никак не додумался изменять строку записи в итоговый массив. Да и тут вроде eval не может быть опасен
> Нет, это (и другие нарушения правил) можно только встроенными в PHP классам.
Разве? Мне казалось это делается с помощью приватной переменной и геттера.
Спасибо анон, как-то про события клавиатуры в JS я запамятовал...
>Как это сделать внутри — решаешь ты.
А как в оригинале не получится? Где можно под капот заглянуть?
> А где массив хранится?
>Внутри объекта TinyNode наверно, где еще?
Но в NityNode хранятся только: текущий узел, родительский узел, все потомки текущего узла. То есть получается, что все те узлы, которые выше текущего узла, недоступны.
Я считаю, что код написан плохо, с множеством замечаний, на двоечку. Если бы у меня в учебнике была такая задача и кто-то так ее решил, я бы попросил стереть все и переписать с нуля (ну и дал бы подсказку как решить правильно, разумеется).
> проверял наличие пустой строки в конце файла — ее не было, а код говорил что есть, почему так?
Допустим файл выглядит так:
1\n
2\n
Где \n — символ перевода строки (который вставляется при нажатии Enter в редакторе). При explode ты получишь: "1", "2", "" так как explode возвращает все части между, до, и после разделителя. там нет никакой пустой строки, это просто explode и split так работают.
Делая array_pop ты удаляешь последнюю пустую подстроку.
Допустим теперь, что у нас есть другой файл, в котором ты не нажимал Enter в последней строчке:
1\n
2
При explode получим "1", "2" и array_pop() удалит подстроку "2"
> По-другому никак не додумался изменять строку записи в итоговый массив.
Можно использовать references + цикл. Например:
$path = 'a.b.c.d';
$target = &$array;
$keys = explode('.', $path);
$lastKey = array_pop($keys);
foreach ($keys as $key) {
if (!isset($target[$key])) {
$target[$key] = array();
}
$target = &$target[$key];
}
Еще можно решить без ссылок, создавая массив в обратном порядке с конца и соединяя его с основным через array_merge_recursive().
> Да и тут вроде eval не может быть опасен
Проблема не в том, что он опасен, а в том что все запутано и непонятно как работает код. Можно было написать просто и понятно без eval, а ты усложнил все и запутал. Какой в этом смысл?
Так как код, который выполнит eval, явно нигде не написан, он формируется динамически, надо сидеть разгребать код, и пытаться разобраться, что там собирается, нет ли там уязвимости (наверняка есть), нет ли ошибок. Как ты думаешь, обрадуется ли этому тот, кто будет разбирать твой код?
eval не предназаначен для таких случаев, он нужен для случаев типа кодогенерации, а не для решения простых задач. А ты используешь eval только потому, что поленился прочесть главу в мануале про ссылки.
Я считаю, что код написан плохо, с множеством замечаний, на двоечку. Если бы у меня в учебнике была такая задача и кто-то так ее решил, я бы попросил стереть все и переписать с нуля (ну и дал бы подсказку как решить правильно, разумеется).
> проверял наличие пустой строки в конце файла — ее не было, а код говорил что есть, почему так?
Допустим файл выглядит так:
1\n
2\n
Где \n — символ перевода строки (который вставляется при нажатии Enter в редакторе). При explode ты получишь: "1", "2", "" так как explode возвращает все части между, до, и после разделителя. там нет никакой пустой строки, это просто explode и split так работают.
Делая array_pop ты удаляешь последнюю пустую подстроку.
Допустим теперь, что у нас есть другой файл, в котором ты не нажимал Enter в последней строчке:
1\n
2
При explode получим "1", "2" и array_pop() удалит подстроку "2"
> По-другому никак не додумался изменять строку записи в итоговый массив.
Можно использовать references + цикл. Например:
$path = 'a.b.c.d';
$target = &$array;
$keys = explode('.', $path);
$lastKey = array_pop($keys);
foreach ($keys as $key) {
if (!isset($target[$key])) {
$target[$key] = array();
}
$target = &$target[$key];
}
Еще можно решить без ссылок, создавая массив в обратном порядке с конца и соединяя его с основным через array_merge_recursive().
> Да и тут вроде eval не может быть опасен
Проблема не в том, что он опасен, а в том что все запутано и непонятно как работает код. Можно было написать просто и понятно без eval, а ты усложнил все и запутал. Какой в этом смысл?
Так как код, который выполнит eval, явно нигде не написан, он формируется динамически, надо сидеть разгребать код, и пытаться разобраться, что там собирается, нет ли там уязвимости (наверняка есть), нет ли ошибок. Как ты думаешь, обрадуется ли этому тот, кто будет разбирать твой код?
eval не предназаначен для таких случаев, он нужен для случаев типа кодогенерации, а не для решения простых задач. А ты используешь eval только потому, что поленился прочесть главу в мануале про ссылки.
Нет, я в смысле «использовать аттрибут readonly» можно только внутренним классам. Хотя конечно может там внутри через геттер и сделано.
>>369724
Неправльно формулируещь задачу. телепат во мне подсказывает, что тебе надо, чтобы при вводе отображалось число строк в тексте. Твое решение (и анонов ниже) непраивльное так как вставить перевод строки можно не только через Enter а например вставкой из буфера обмена. Также, строки можно удалять. Ты неверно сформулировал задачу, а анон неверно понял и неверно решил.
Ты думаешь: надо посчитать сколько раз нажали Enter.
А на самом деле: надо определить число строк, то есть просто взять значение в textarea и посчитать сколько раз там встречается символ перевода строки \n
Вот видишь, если правильно сформулировать что тебе надо, решение приходит гораздо быстрее.
> срабатывает метод alert,
Уже лет 5 есть console.log(), не надоело OK жать постоянно?
>>369725
зачем проверять фокус? Если на поле нет фокуса, то клавиатурные события в него не поступают.
Я сейчас погуглил, да: http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%D0%B5#.D0.97.D0.B0.D0.B4.D0.B0.D1.87.D0.B0_.D0.BE_.D1.80.D0.B0.D0.B7.D0.BC.D0.B5.D0.BD.D0.B5
(там такое объяснение решения, что понять что-то сложно)
Один анон решал жадным методом с бектрейсом (то есть берем по максимум купюр, наичная с крупных, если не получается, отходим назад, берем на одну меньшще и пробуем снова).
>>369754
Расширение DOM — это лишь переходник (адаптер) между PHP и кодом libxml2 на Си. Так что если ты знаешь Си, можешь заглянуть.
А в чем сложность то? Вот есть у нас узел, у него есть список его детей, и ссылка на родителя (у которого тоже есть родитель и список детей). Этого мало?
> То есть получается, что все те узлы, которые выше текущего узла, недоступны.
Берем родительский узел и спрашиваем кто его родитель или кто его дети — и получаем то, что нам надо.
Данные: Название книги, автор книги, артикул книги, фото книги, дата издания, название издательства, телефон издательства, адрес издательства
Задача:
1.Создать нормализованную базу данных.
2.Создать страницы сайта, для создания, редактирования, удаления, и вывод информации.
3.Использовать Smarty
4.Использовать технологию MVC
5.Желательно применить ООП
Вопросы:
-картинку с обложкой сохранять в БД или на диск? Хотел использовать наработки по файлообменнику, превьюшку выводить например, готовый класс для этого дела уже есть, потом засомневался.
-делать ли отдельные формы для загрузки картинки и самого поста? Помню, ты писал, что мешать пост с файлом опасно и неизвестно, насколько надежны зендовские проверки.
Алсо, я тот анон с файлообменником на зенде, да.
Похоже мне нужен будет NodeList. Как я понял, при запросе определенных узлов, например, $childNodes в NodeList активно создаются объекты (узлы), а потом удаляются, нет?
childNodes
Возвращает список DOMNodeList
Свойство может что-то возвращать?
public readonly DOMNodeList $childNodes ;
Что это значит? Это свойство NodeList? Почему оно в Node?
> картинку с обложкой сохранять в БД или на диск?
На диск конечно, так же проще.
> делать ли отдельные формы для загрузки картинки и самого поста? Помню, ты писал, что мешать пост с файлом опасно и неизвестно, насколько надежны зендовские проверки.
Они скорее всего этот факт проверять не будут. Но ты убедись что туда только картинки закачиваются, а php-файл допустим или htaccess — нет.
> Как я понял, при запросе определенных узлов, например, $childNodes в NodeList активно создаются объекты (узлы), а потом удаляются, нет?
Нет, они там постоянно хранятся.
> Свойство может что-то возвращать?
Имеется в виду что в этом свойстве хранится оюъект класса NodeList, а уже в нем — узлы-дети.
> Как я понял, при запросе определенных узлов, например, $childNodes в NodeList активно создаются объекты (узлы), а потом удаляются, нет?
Что в этом свойстве хранится объект класса DOmNodeList
То есть в конструкторе Node ты кладешь в childNodes пустой NodeList, а при вызов appendChild сораняешь новые узлы в него. Таким образом ты имеешь акутальный список всех детей элемента.
Тогда мне нужен еще один класс NodeFactory c методом, который создает объект класса Node, а Node в свою очередь кладет объект в NodeList, верно?
Нет. Чтобы создать NodeList вполне можно использовать new. Не надо тут городить абстрактные фабрики абстрактных фабрик.
Ну в принципе почти дошло. Только вот TinyElement мне зачем тогда? У меня есть TinyNode с именем узла, его значением и т.д. То есть createElement логичнее наверное создавать сразу TinyNode?
Node — это по сути абстрактный класс, который не предназанчен для создания объектов. От него можно только наследоваться.
Element — соответствует какому-то html-элементу например <p>, <a> и т.д. Кроме него, есть еще Comment, Text, Document и что-то еще.
Node и Element явно не одно и то же.
> Только вот TinyElement мне зачем тогда?
Твой вопрос логичнее сформулировать как «зачем мне Node если есть Element»? Ответ: Node нужен так как он содержит общие свойства и методы, что есть у всех видов узлов.
> То есть createElement логичнее наверное создавать сразу TinyNode?
Посмотри в мануале или стандарте DOM объект какого класса возвращает createElement.
createElement ( string $name [, string $value ] )
$value - это текстовый узел.
Если у меня $value != null; должен создаться объект класса textNode? А затем appendChild(textNode) в узел?
Ниже добавление узла и его содержимого. Они равнозначны?
TinyDocument::createElement('p', 'some text');
и
$p = TinyDocument::createElement('p');
$text = TinyDocument::createTextNode('some text');
$p->appendChild('some text');
ОП, возник небольшой затык. Вот сделал я БД с таблицами book, author, publish_house и с таблицей соответствий вида
book_id int ...
autor_id int ...
pb_house_id int ...
и не очень понимаю, как теперь правильно инсёртить в неё книги. Первое, что пришло в голову - вставить поля книги-вернуть id-вставить поля автора-вернуть id-вставить поля издателя-вернуть id-вставить все три id, но это как-то айс. И ещё: стоит ли здесь проверять, не существует ли уже в таблицах такого автора или издателя?
Вот кстати, ты спрашивал, где можно код посмотреть, исходный код расширения DOM: https://github.com/php/php-src/tree/master/ext/dom
$value — это дополнение от авторов libxml и PHP. В стандарте DOM: http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-2141741547 — этого аргумента у createElement нет.
Реализовано оно странно. С одной стороны, если ты попробуешь указать там символы < или >, они заменяется на html-сущности: https://ideone.com/1k4mIs
С другой строны, если ты вставишь туда символ & то он не заменится на сущность & amp; (в HTML чтобы вывести & надо писать & amp; так как этот символ имеет специальное значение). Мало того, что он не заменится, еще и вывалится ошибка: https://ideone.com/ZD9U3p
C третьей строны, корректные html-сущности вроде & copy; сохраняются: https://ideone.com/uJ8gYt
С четвертой стороны, у элементов вроде img (у которых не может быть содержимого) value игнорируется (не выдавая никаких ошибок): https://ideone.com/mLKIcJ
Бардак и путаница, в общем.
Я предлагаю не поддерживать второй аргумент у createElement, так как этого нет в стандарте.
>TinyDocument::createElement
Я надеюсь, ты нормальный метод делаешь, а не статический?
>>369812
Во-первых стоит прописать внешние ключи если их еще нет: http://denis.in.ua/foreign-keys-in-mysql.htm
Во-вторых, проверять стоит если ты не хочешь иметь в таблице 100 Пушкиных.
> Вот сделал я БД с таблицами book, author, publish_house и с таблицей соответствий вида
Какой кошмар. Видно, что MySQL и отношения в реляционных таблицах ты пропустил и не стал изучать. Зря. Срочно изучай: http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-3.html (там еще есть ссылки на 1- и 2 части, их тебе тоже надо прочесть).
>Видно, что MySQL и отношения в реляционных таблицах ты пропустил и не стал изучать
Целую книжку в мае прочитал. Совершенно безрезультатно, судя по всему.
Такой вопрос, чтобы не совершить ошибку.
В абстрактном классе есть свойство $childNodes. Его наследуют многие классы.
Если я в каком нибудь объекте меняю значение $childNodes, то оно меняется для всех классов, которые наследуют этот абстрактный класс?
Хотя не понимаю, в чём фейл: у книги же может быть несколько авторов, надо где-то это указывать, иначе таблица book будет перегружена одинаковыми записями. Или таблица author, смотря от чего плясать. А так есть таблица item, в которую всё это сливается.
Книга1 Автор1 Издатество1
Книга1 Автор2 Издатество1
#RewriteCond %{REQUEST_URI} ^(.*)/$
#RewriteRule ^(.*)$ http://www.адрес.сайта/$1 [R=301,L]
ведет к циклической переадресации. Поясню подробнее: я хочу, чтобы если пользователь ввел адрес.сайта/хуй/говно/муравей/ то mod_rewrite переадресовывал его на адрес.сайта/хуй/говно/муравей иначе слеш попадает в одну из переменных и рушит проверяющее условие. Как правильно это сделать?
> там такое объяснение решения, что понять что-то сложно
Вот что есть то есть, чувствую себя неполноценным читая решение этой задачи в сборнике олимпиадных задач, ведь школьники такое делают. Можешь объяснить человеческим языком? У тебя здорово получается, после твоего сайта и еще пары источников, когда во что то врубаюсь на простом языке, начинаю понимать смысл написанного на заумном, а вот сразу на заумном - хер, вообще не понятно.
Составь дерево возможных комбинаций купюр в решении и обойди его в ширину до первого совпадения.
> Если я в каком нибудь объекте меняю значение $childNodes, то оно меняется для всех классов,которые наследуют этот абстрактный класс?
Я не очень понял вопрос. В объекте любое свойство есть только в одном экземпляре (кроме приватных), так что наверно ответ «да, для всех».
>>369823
Прочти статью и используй одно из стандартных отношений, а не придумывай свои велосипеды.
>>369825
Нафига rewriteCond? Просто в RewriteRule написать не вариант? Вот статья в помощь: http://habrahabr.ru/company/sprinthost/blog/129560/
> иначе слеш попадает в одну из переменных и рушит проверяющее условие
Плохо что код такой кривой
> if (!$this->documentElement) {
> $this->documentElement = $newnode;
Это неверно. createElement не вызвыает добавление элемента в документ. Добавление происходит только через appendChild/insertBefore.
> class TinyElement extends TinyNode
> public function __construct(TinyDocument $tagName)
Почему имя tagName является объектом класса TinyDocument? Имя — это строка.
> array_push($this->childNodes->nodes, $newnode);
Надо сделать в NodeList метод для добавления узла, а не лезть в его потроха напрямую.
>>369841
Надо перебрать все возможные комбинации купюр и выбрать ту, которая даст нужную сумму. Перебирать можно в любом порядке, но некоторые способы дают ответ гораздо быстрее.
>>369843
Это не очень практично, дерево может быть огромным и занимать много памяти, можно без этого обойтись.
. | | д | | | | | | | | | | н | р |
| | е | | | | г | | | | | | е | у |
| | . | | | | л | | | | | | | к |
У тебя линии сбиваются в конце строк. Подумай, почему.
То, что в строках 22-25, можно записать в одну строчку через array_map.
> if ($letter == ' ') {
> echo "";
Этот код ничего не делает, вывод пустой строки через echo ничего не меняет.
> Это не очень практично, дерево может быть огромным и занимать много памяти, можно без этого обойтись.
Не обязательно его на самом деле хранить. Достаточно организовать очередь. Храниться одновременно будет только один уровень дерева.
http://ideone.com/TGH7u1
Оп, а реально уже после создания узлов их засунуть в тег html? Наверное есть трюк какой-нибудь?
> Надо перебрать все возможные комбинации купюр и выбрать ту, которая даст нужную сумму. Перебирать можно в любом порядке, но некоторые способы дают ответ гораздо быстрее.
Что за способы такие?
Это обычная ссылка. Неактивный элемент в меню:
<li class="cat-item"><a href="/yoba/">Йоба</a>
</li>
Это ссылка, когда я кликнул на категорию и нахожусь в ней:
<li><span style="color: blue;">Йоба</span></li>
Это ссылка, когда я нахожусь в самой новости:
<li><a style="color: blue !important; border-color: blue !important;" href="/yoba/">Йоба</a></li>
Во-первых, код не работает. Что значит «3»? Надо вывести вариант, как конкретно выдать эту сумму.
Алгоритм неэффективен, как я понимаю, он гегерирует огромный массив для всех врозможных сумм, не проверяя даже, будут ли использоваться значения из него или нет. Нельзя ли генерировать элементы лениво при первом обращении?
Добавь-ка также счетчик числа шагов в цикле, для оценки эффективности.
Например, есть купюры по 100, 200, 500, 1000 и надо выдать 25500. Набрать сумму иногда (если запас купюр достаточный) можно с первой попытки (25×1000 + 1×500), а твой алгоритм сделает 4 × 25500 ~ 100 000 шагов.
> coins_nom = variable_coins.keys()
> coins_nom.sort()
Это незачем делать на каждом шаге цикла
>>369847
Насчет обхода дерева, а какой размер дерева? У меня есть ощущение, что это будет число всех возможных перестановок, то есть O(что-то в степени W), в то время как вариант с динамическим программированием дает нам O(N×W). А если бы анон не копировал готовый алгоритм, а подумал своей головой и оптимизировал его, то для типичных случаев решение бы находилось за несколько шагов.
Ну смотри, есть у нас купюры 100, 200, 500, 1000 в большом количестве и сумма 25500. Если начать перебор с варианта 25×1000 + 1×500 то правильный и оптимальный ответ найдется с первой попытки.
Если говорить об обходе дерева, есть «глупые» алгоритмы, обходящие все узлы дерева подряд, а есть «умные», которые умеют исключать бесперспективные ветви, а также выбирать очередность проверки с помощью оценочной функции. Алгоритм размена должен в первую очередь проверять вариант, который я написал выше. И не проверять варианты, где сумма будет заведомо больше требуемой.
Посмотри например алгоритм A star http://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_A*
> Насчет обхода дерева, а какой размер дерева? У меня есть ощущение, что это будет число всех возможных перестановок
Это будет сумма возможных выборов из n по 1, 2, и.т.д до k, где n - суммарное число купюр всех номиналов, а k - количество купюр в минимальном решении. Худший вариант, если решения нет, тогда это становится полным перебором.
Я не разбираюсь в этом плагине, но у него наверно есть документация? А если что-то в ней не указано, то можно глянуть исходный код.
>>369863
«Трюк» заключается в том, чтобы добавлять новые узлы как дети в узел html, а не в документ:
$html->appendChild($head);
> $head = $doc->appendChild($head);
Зачем возвращенное значение записывать назадв head?
Не уверен, что ты посчитал правильно. Допустим купюры 100/200/500/1000 и сумма 25500. Тогда надо число купюр может быть:
100 — от 0 до 255
200 — от 0 до 127
500 — от 0 до 51
1000 — от 0 до 25
Причем если мы рассматриваем варианты где у нас есть 25×1000 то сотенных купюр там может быть не больше пяти.
Причем перебирать надо не с 0 до 25, а с 25 до 0 - так решение найдется быстрее.
Но все равно, это все число варинтов сопоставимо с NW, деленным на какое-то число, то есть быстро растет с ростом суммы. Правда, в реальных баноматах число видов купюр не может быть больше 4 (там только 4 кассеты с деньгами), а число выдаваемых купюр ограничено 30-40 что делает исполдзоваие этого алгоритма реальным. Плюс, в некоторых банкоматах используется простой жадный алгоритм.
А вот вариант с динамическим программированием у этого анона >>369853 имеет сложность N×W, если его оптимизировать, будет вообще хорошо.
Тут написано что может быть:
http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%D0%B5#.D0.92.D0.B0.D1.80.D0.B8.D0.B0.D0.BD.D1.82.D1.8B_.D1.80.D0.B5.D1.88.D0.B5.D0.BD.D0.B8.D1.8F
> Метод динамического программирования. Сложность - O(N×W).
http://ideone.com/TGH7u1
Оп, смотри, я через импорт сделал. Хотя если бы можно было менять значение documentElement, то было бы проще.
Ты сделал неправильно. Я же написал: не надо head и body добавлять в документ. Это неправильно. Надо в документ добавить только html, а head и body добавлять внутрь html.
У документа может быть только один ребенок — это html.
И еще, если не все теги поддерживаются некоторыми браузерами, например, <header>, <aside> и т.д., то можно сделать:
<script>
document.createElement('header');
document.createElement('aside');
</script>
<style>header, aside {display:block}</style>
Верно?
То есть по сути я могу создавать теперь любые теги? Что-то вроде
with(document) {
createElement('shapka');
createElement('kontent');
createElement('podval');
}
Я не понял тебя. Вообще я делал по примеру в мануале: http://php.net/manual/ru/domdocument.savehtml.php
http://habrahabr.ru/post/222577/
В комментариях объясняется, почему этот алгоритм не полиномиальный. Вкратце - поскольку сложность начинает зависеть от размера рюкзака, можно выкрутить условия так, что он будет не быстрее полного перебора.
Эту хуйню можно и в сайдбаре.php реализовать.
>используйте параметр current_category в wp_list_categories подставляя get_the_category( );
Получил ответ. Что теперь делать?
Давай тогда сравним. Мануал (я чуть упростил код убрав бессмысленные присваивания):
$root = $doc->createElement('html');
$doc->appendChild($root);
$head = $doc->createElement('head');
$root ->appendChild($head);
У тебя:
$html = $doc->createElement('html');
$doc->insertBefore($html, $head);
$head = $doc->createElement('head');
$doc ->appendChild($head);
По моему, разница очевидна. Ты взял правильный пример и зачем-то поменял его так, что он стал неправильным.
Не пихается. Пихается если только base64_encode() сделать, но тогда размер еще больше увеличивается. Если сжать 64 строку еще и gzcompress, то опять не пихается.
В чем может быть проблема? Это вообще кошерно, хранить пехопе массивы с информацией в бд, или лучше заморачиваться с другими таблицами и большим mysql-лингусом?
А, понял, ну я просто хотел создать соседние элементы. Понятно, что не может быть такого <html></html><head></head>, но я это сделал чтобы не переписывать на <div><p></p><div></div></div> например. Я акцентировал на том, чтобы изменить корневой элемент в уже созданном документе, что на самом деле оказалось нереально.
А почему корневой элемент должен меняться когда ты добавляешь head или что-то еще на верхнем уровне?
> Не пихается.
Так может сказать неграмотный пользователь-блондинка, но программист вместо «не пихается» скажет «при попытке выполнить запрос X Бд возвращает ошибку Y». В общем, без подробностей ничем помочь не смогу.
>>369981
Сомневаюсь, можно сделать огромный запас банкнот и огромную сумму для размена. Но в этом случае полный перебор займет еще больше времени. Не забывай, у нас задача о размене, а не о ранце.
Плюс, я уверен, что этот алгоритм можно еще оптимизировать для типичных ситуаций.
Ну да, тут непонятная ситуация. Если я создаю документ с такими элементами <div class=""root"><p></p><div></div></div>, то корневой элемент <div class="root">? А если я <div class="root"> хочу поменять на <header>?
Я еще подумал, может можно корневой элемент менять через Shadow DOM (сейчас нагуглил)? Но тут вроде нельзя http://html5-demos.appspot.com/static/shadowdom-visualizer/index.html
>«при попытке выполнить запрос X Бд возвращает ошибку Y». В общем, без подробностей ничем помочь не смогу.
А как можно отследить ошибку? У меня пока простой запрос:
$content = serialize($data);
$res = $mysqli->query("INSERT INTO post (title,content) VALUES ('$title','$content')");
var_dump($res); //выдает false
readonly значит что нельзя писать в свойство:
$doc->documentElement = $x; // нельзя
А удалять можно:
$doc->removeChild($doc->documentElement);
(хотя я не проверял)
>>370009
Включить отображение ошибок от базы данных. Не помню, как это делается в mysqli, и не понимаю, почему ты его не включил. А может у тебя просто display_errors стоит off, тоже не понимаю, зачем.
> VALUES ('$title','$content')");
А что если в $content будет одиночная кавычка, ты подумал?
Вообще это ужасный код. Где такому учат? Нельзя вставлять переменные в текст запроса напрямую. Я советую изучить PDO и с его помощью начать писать хороший код: http://habrahabr.ru/post/137664/ — уверен, с ним все заработает.
$doc->removeChild($doc->documentElement);
Он таким способом удаляет все элементы. Корневой вместе с дочерними.
Ну так и добавляет назад он их тоже вместе. Ты не можешь вырвать элемент их середины дерева, только целиком ветку с листьями.
Оп, а что по поводу этого? И тогда мои вопросы иссякнут.
В DOM на сервере ты можешь вообще делать что угодно и делать любые теги. В современных браузерах — тоже.
А код, который приведен, нужен для поддержки кастомных элементов в старых IE (IE8 и ниже). Он позволяет ипользовать новые теги в hTML разметки и вешать на них стили. Но они все равно не становятся полноценными тегами — при работе с DOM из яваскрипта, эти элементы ведут себя по-другому. То есть это по сути костыль, который позволяет получить частичную поддержку html 5 элементов.
Информация про эти особенности ИЕ, если ты понимаешь английский:
http://www.paulirish.com/2011/the-history-of-the-html5-shiv/
https://github.com/aFarkas/html5shiv (смотри README)
Я лично не сторонник костылей и считаю что проще не исопльзовать html 5 теги, если нужна поддержка более старых браузеров.
Ну почитай мануалы по вордпрессу. Пока ты не разбирешься в вордпрессе и его внутреннем устройстве, ты не сможешь заниматься программированием под него.
Ну или погугли, может кто-то с той же проблемой столкнулся и есть готовое решение.
А чем плох mysqli? Просто я посмотрел, разрабы советуют mysqli или PDO, ну я выбрал mysqli, т.к. он проще на первый взгляд. В PDO не хочу уже разбираться.
Как тогда вставлять переменные в запросы, относительно mysqli?
Там вроде тоже есть плейсхолдеры, смотри например функцию http://php.net/manual/ru/mysqli-stmt.bind-param.php.
Моя задача про кошку-мышку
http://apps.perfect-skin.com.ua/cat/
ОП, условия не помнил, делал по памяти. У тебя есть текст оригинальной задачи? Сделал кошку, мышку, кошка ходит во все стороны, мышь - как ладья.
Пробовал несколько вариантов для выбора хода мышке, если учитывать количество кошек, то мышь умирает чаще. Если убегать от ближайшей кошки - мышь живёт дольше.
ОП, я сделал вроде как задачку на исправление, хотя не совсем уверен, вернее совсем не уверен, что правильно.
Нашёл. Половину вспомнил. Можешь прокомментировать мою ООП-структуру? Например, я решил все данные о поле хранить в static-массиве, как можно иначе сделать это?
Есть какие-то серьёзные ошибки? Это пока первый, очень-очень сырой вариант, там много надо доделать ещё, интересно просто, не нафейлил ли я в самой логике приложения.
Таблицы БД в репозитории на всякий, но там тоже надо кое-что подправить.
Тестовое задание из одной конторы, которое пилю.
Вот что у нас за хуйня с CMS? Почему все используют джумлы и дле, и пытаются что-то на них писать, ну что за говноеды? Есть же божественный CMF - drupal. Всё, что нужно уже есть, чего нет - дописывай. Более гибкое API, наверное, придумать невозможно.
Всем просто лень освоить такой мощный и гибкий инструмент?
Из-за утиного рефлекса. Кто-то раз сделал сайт на джумле - всю жизнь будет пилить на этом говне. Сколько раз мне говорили, что джумла лучше, на вопрос "Почему?" - "Ну так я на ней уже писал".
Оп, я уже замучился искать исправление данной ошибки: Fatal error: Call to a member function addNode() on a non-object in ..\TinyNode.php on line 33
На 33 строке $this->childNodes->addNode($newNode);, но childNodes - объект класса NodeList, он создается конструктором при создании документа.
Оп, возникла проблема. Вот я создаю новый документ, автоматически создается и объект класса NodeList. Далее создаю узел (корневой узел), он добавляет с помощью метода appendChild объекта класса TinyDocument. А вот когда создаю следующий элемент, то она добавляется с помощью метода appendChild объекта класса TinyElement, где NodeList (он же childNodes) опять пустой.
Короче, клоню я к тому, что после создания объекта класса NodeList нужно сделать его доступным для всех. Не, не так. После создания объекта класса NodeList (он же свойство childNodes), нужно сделать свойство childNodes (он же объект класса NodeList) доступных для всех, чтобы это свойство передавалась и другим объектам других классов, в которых это свойство пустует.
Алсо я в тихом ужасе от smarty и от необходимости прикручивать его к зенду. Понимаю, что ещё дно не на том уровне, чтобы понять преимущества от его использования, о которых уже начитался, но всё равно от его шаблонов просто коробит. Как по мне, так обычный пхп в представлении вполне понятен, притом интуитивно.
Smarty очень хорош. Можешь даже через силу его использовать, чтобы привыкнуть. Я полгода писал на smarty шаблоны, потом вернулся к старому вордпресу - как небо и земля, хотя раньше вордпрес и подобные ему казался мне ок.
Есть же гугл, ну йобана.
"1. phpMyAdmin -> выбираете свою таблицу -> вкладка Операции -> auto_increment (задали нужный и кнопка "пошел")
2. Этот же метод покажет и SQL запрос:
ALTER TABLE table_name
PACK_KEYS =0 CHECKSUM =0 DELAY_KEY_WRITE =0 AUTO_INCREMENT =4"
Конечно, буду разбираться. Вот только сильно сомневаюсь, что за оставшиеся два дня успею его освоить настолько, чтобы правильно склепать нужные шаблоны. Или отредактировать уже имеющиеся зендовские.
Ну это уже твои проблемы :)
Вообще, неплохо сделана визуализация, хотя конечно для таких вещей лучше использовать другие методы, например засунуть в страницу JSON с информацией и отображать яваскриптом.
Там еще был вариант задачки, где мышь может сделать 2 хода, что повышает ее шансы. Ну и еще кошка должна спать после того, как съест мышку или сделает 8 ходов.
> 3 KB
Если ты считаешь сколько какой скрипт весит ради скорости загрузки, лучше скопировать скрипты на свой сервер. Пинг до США (где скорее всего находится s3.amazonaws.com) довольно-таки большой, то ли 10,
> public static $field = array();
Вот это нехорошо. У нас же ООП, а значит должен быть класс Карта, и мы не должны нигде лезть напрямую внутрь его свойств (field, units), а вызвать его методы вроде найтиВсехКошек() или свободнаЛиКлетка().
И плохо, что ты используешь статические поля. Это не дает возможности нам, например, сделать 2 игровых поля или использовать другой класс для хранения карты (так как в кошке/мышке прописано имя Game).
> $mark = str_replace('.', '<div class="empty"></div>', $mark);
По моему тут просто можно написать return '<div class="empty"></div>';
> public $coordinates;
Не удобнее ли сделать 2 свойства x и y?
> методы реализованы в наследуемых классах
> public function available_moves(){
Для того, чтобы заставить программиста реализовать эти методы, есть слово abstract: http://php.net/manual/ru/language.oop5.abstract.php думаю, стоит его использовать тут. Это гораздо надежнее, чем комментарий.
> public static function sort_by_distance
Функция написана неверно. Она должна возвращать не true/false, а число меньше/больше/равное нулю. Удобно для этого использовать вычитание:
return $a["distance"] - $b["distance"];
Учел ли ты возможность для мышки стоять на месте?
> if(isset(Game::$field[$y][$x]) && Game::$field[$y][$x]->mark == "."){
Лучше это делать так: if ($this->map->canGoTo($x, $y)) ...
> $this->available_moves()
Имена надо начинать с глагола, например, get_available_moves()
> public $possible_moves = array(
зачем делать это свойство общедоступным? Я думаю, тут стоит большинство свойств (если не все) сделать закрытыми.
> //занижение ценности ходов у края поля
Для углов надо занижать еще сильнее, так как из них вообще не выйти. Ну и раз у тебя есть препятствия, то это тоже надо учитывать. Можно например считать число возможных ходов из клетки, таким образом мышка будет избегать тупиков.
> usort($moves_values, array("Unit", "sort_by_distance"));
В новом PHP можно писать 'Unit::sort_by_dist' вместо массива. Но тут удобнее использовать анонимную функцию (так как она находится рядом с кодом):
usort($moves_values, function $a, $b) {
...
});
> public function move(){
копипаста в классах кошки и мышки. Думаю, ее смело можно перенести в базовый класс.
Вместо Empty_Cell наверно можно писать в массив null. Ну или надо сделать, чтобы у Empty_Cell и Unit был общий предок или общий интерфейс — логично, что все помещаемые на карту объекты имеют что-то общее.
Вообще, неплохо сделана визуализация, хотя конечно для таких вещей лучше использовать другие методы, например засунуть в страницу JSON с информацией и отображать яваскриптом.
Там еще был вариант задачки, где мышь может сделать 2 хода, что повышает ее шансы. Ну и еще кошка должна спать после того, как съест мышку или сделает 8 ходов.
> 3 KB
Если ты считаешь сколько какой скрипт весит ради скорости загрузки, лучше скопировать скрипты на свой сервер. Пинг до США (где скорее всего находится s3.amazonaws.com) довольно-таки большой, то ли 10,
> public static $field = array();
Вот это нехорошо. У нас же ООП, а значит должен быть класс Карта, и мы не должны нигде лезть напрямую внутрь его свойств (field, units), а вызвать его методы вроде найтиВсехКошек() или свободнаЛиКлетка().
И плохо, что ты используешь статические поля. Это не дает возможности нам, например, сделать 2 игровых поля или использовать другой класс для хранения карты (так как в кошке/мышке прописано имя Game).
> $mark = str_replace('.', '<div class="empty"></div>', $mark);
По моему тут просто можно написать return '<div class="empty"></div>';
> public $coordinates;
Не удобнее ли сделать 2 свойства x и y?
> методы реализованы в наследуемых классах
> public function available_moves(){
Для того, чтобы заставить программиста реализовать эти методы, есть слово abstract: http://php.net/manual/ru/language.oop5.abstract.php думаю, стоит его использовать тут. Это гораздо надежнее, чем комментарий.
> public static function sort_by_distance
Функция написана неверно. Она должна возвращать не true/false, а число меньше/больше/равное нулю. Удобно для этого использовать вычитание:
return $a["distance"] - $b["distance"];
Учел ли ты возможность для мышки стоять на месте?
> if(isset(Game::$field[$y][$x]) && Game::$field[$y][$x]->mark == "."){
Лучше это делать так: if ($this->map->canGoTo($x, $y)) ...
> $this->available_moves()
Имена надо начинать с глагола, например, get_available_moves()
> public $possible_moves = array(
зачем делать это свойство общедоступным? Я думаю, тут стоит большинство свойств (если не все) сделать закрытыми.
> //занижение ценности ходов у края поля
Для углов надо занижать еще сильнее, так как из них вообще не выйти. Ну и раз у тебя есть препятствия, то это тоже надо учитывать. Можно например считать число возможных ходов из клетки, таким образом мышка будет избегать тупиков.
> usort($moves_values, array("Unit", "sort_by_distance"));
В новом PHP можно писать 'Unit::sort_by_dist' вместо массива. Но тут удобнее использовать анонимную функцию (так как она находится рядом с кодом):
usort($moves_values, function $a, $b) {
...
});
> public function move(){
копипаста в классах кошки и мышки. Думаю, ее смело можно перенести в базовый класс.
Вместо Empty_Cell наверно можно писать в массив null. Ну или надо сделать, чтобы у Empty_Cell и Unit был общий предок или общий интерфейс — логично, что все помещаемые на карту объекты имеют что-то общее.
Ну и нормально, почему бы и нет?
>>370041
Более-менее верно, но вот небольшие замечания:
> $patterns = array();
> $patterns[0] = '/жы/ui';
Удобнее хранить паттерны так, чтобы поиск и замена были рядом друг с другом:
$patterns = array(
'/жы/ui' => 'жи',
'/шы/ui' => 'ши',
...
);
Слово «сдесь» программа не исправила.
>$patterns = array(
'/жы/ui' => 'жи',
'/шы/ui' => 'ши',
Ключ элемента - регулярное выражение, а сам элемент - замена ему? Но как сделать, чтобы preg_replace заменял в слова в тексте по ключу на их содержимое?
Вообще, это не очень правильно, тестовое задание должен проверять работодатель, а не я. Давай я лучше ответу на общие вопросы вроде «как принято делать такую штуку», если они у тебя есть.
Тем не менее, советую объединить все gitignore в один (а не разбрасывать по папкам) и сделать интерфейс на одном языке, а не смеси англорусского. Так, с виду код нормально выглядит.
«Обложка» по-английски будет cover. Для работы с картинками в ZF наверняка есть что-то стандартное.
>>370060
Да я не сказал бы, что друпал хороший. Функции и безликие массивы — не лучший подход для создания огромной CMS. Да и интерфейс у него не самый простой. И он тяжеловат. Я на нем делал пару сайтов, так себе.
На фреймворках лучше получается.
>>370075
У каждого узла свой список детей. То, что ты добавляешь ребенка к html, не значит что он должен появиться в списке детей у других элементов или документа.
> нужно сделать свойство childNodes (он же объект класса NodeList) доступных для всех, чтобы это свойство передавалась и другим объектам других классов, в которых это свойство пустует.
Нет. У каждого узла свой экземпляр childNodes, а не один на всех.
>>370076
Он экономит время на написание кода. Меньше букв -> быстрее писать, быстрее читать. Освоить его недолго, ничего сложного там нет.
Но мне он не особо нравится, twig по моему новее и лучше.
Вообще, это не очень правильно, тестовое задание должен проверять работодатель, а не я. Давай я лучше ответу на общие вопросы вроде «как принято делать такую штуку», если они у тебя есть.
Тем не менее, советую объединить все gitignore в один (а не разбрасывать по папкам) и сделать интерфейс на одном языке, а не смеси англорусского. Так, с виду код нормально выглядит.
«Обложка» по-английски будет cover. Для работы с картинками в ZF наверняка есть что-то стандартное.
>>370060
Да я не сказал бы, что друпал хороший. Функции и безликие массивы — не лучший подход для создания огромной CMS. Да и интерфейс у него не самый простой. И он тяжеловат. Я на нем делал пару сайтов, так себе.
На фреймворках лучше получается.
>>370075
У каждого узла свой список детей. То, что ты добавляешь ребенка к html, не значит что он должен появиться в списке детей у других элементов или документа.
> нужно сделать свойство childNodes (он же объект класса NodeList) доступных для всех, чтобы это свойство передавалась и другим объектам других классов, в которых это свойство пустует.
Нет. У каждого узла свой экземпляр childNodes, а не один на всех.
>>370076
Он экономит время на написание кода. Меньше букв -> быстрее писать, быстрее читать. Освоить его недолго, ничего сложного там нет.
Но мне он не особо нравится, twig по моему новее и лучше.
А что тут коробит? в PHP ты пишешь
<?= $this->escapeHtml($x->getY()); ?>
А в смарти
{ x->getY() | escape }
А в twig просто
{{ x.getY() }}
Так как там работат автоматический ескейпинг. Менбше букв — больше производительность программиста.
>>370085
Освоишь, документацию для template designers прочти и станет все ясно. Он гораздо проще, чем Зенд.
>>370101
Ты можешь получить список ключей и список значений из массива через array_keys/array_values, детали в мануале.
>Освоишь, документацию для template designers прочти и станет все ясно
Спасибо, почитаю. А то после документации ничего не прояснилось.
Вопросов в принципе нет, просто казалось, что опять всё не так.
Алсо, особых иллюзий насчет трудоустройства у меня нет. Задание взял больше для контрольной проверки.
>На фреймворках лучше получается.
Какой использовать для написания более-менее модульной cms?
Какой объективно лучше и проще в изучении/работе?
Ебать. Вы что, ебанутые? Нахуя вы учите эту загнивающую парашу? Есть же хаскель!
Проиграно.
Наговнокодил следующее, по мануалу http://ru2.php.net/manual/ru/mysqli-stmt.fetch.php, но это же уебанство! Неужели столько строк кода придется писать для каждой выборки, используя while? Или я что-то упускаю и есть решение гораздо проще?
$query = "SELECT name FROM keyws WHERE par_id=0";
if ($stmt = $mysqli->prepare($query)) {
$stmt->execute();
$stmt->bind_result($name);
$i = 0;
while ($stmt->fetch()) {
$menu[$i] = $name;
$i++;
}
$stmt->close();
}
var_dump($menu);
$query = "SELECT name FROM keyws WHERE par_id=0";
if ($stmt = $mysqli->prepare($query)) {
$stmt->execute();
$stmt->bind_result($name);
$i = 0; - не надо
while ($stmt->fetch()) {
$menu[$i] = $name; - просто $menu[] = $name
$i++; - не надо
}
$stmt->close();
}
var_dump($menu);
>Неужели столько строк кода придется писать для каждой выборки, используя while?
Две строчки всего, чего ты паникуешь.
Это всё можно уместить в:
$result = mysqli_query($link, "SELECT name FROM keyws WHERE par_id=0");
whire($result) ...
Zend, CI, Yii - все одинаково говняны/хороши/популярны. Бери любой.
Посему перешел с Notepad++ на Eclipse PDT.
Отсюда вопрос, как связать проект на удаленном веб-сервере(через ftp) с локальным проектом на компе? Т. е. синхронизировать их в автоматическом режиме. Remote System Explorer поставил, но вручную обновлять файлы как-то не очень удобно.
Годных ссылочек не дашь?
Я пока в этом плохо разбираюсь, немного представляю что это, но с чего начать не знаю.
http://www.sublimetext.com/3 - сам сублайм
https://sublime.wbond.net/installation - package manager
Дальше из него уже ставишь что тебе нужно, там и git есть, и svn, и синхронизация с фтп.
id|par_id|name
паста на тему: https://gist.github.com/codedokode/10539720
>>370107
Нормальный там код, не парься.
>>370116
Не знаю, про серверную часть — почитай что-нибудь про протокол http, начать можешь хоть с википедии.
Лучший источник информации по PHP — официальный мануал. Не хочешь его попробовать почитать?
Для начинающих — можешь почитать мой учеьник по ссылке в ОП-посте. Если слишком просто — то мануал или Мэтта Зандстру например.
Есть сайт phptherightway.
Ну и для не-начинающих (тех у кого есть базове знания PHP, HTML, CSS, SQL) у нас есть хорошее задание: https://gist.github.com/codedokode/9424217 — пишешь код, а я его проверю.
>>370134
Пока нормально, продолжай в том же духе. Вот только тут ужасный код:
> if (get_class($this) == TinyDocument) {
(кстати ошибка, надо название класса брать в кавычки). В мире ООП так не принято делать, проверять какой это класс через if. Это неправильно. Если ты хочешь поменять поведение appendChild в каком-то классе, просто переопредели его там.
Тем более, класс-предок не должен ничего знать о своих потомках.
паста на тему: https://gist.github.com/codedokode/10539720
>>370107
Нормальный там код, не парься.
>>370116
Не знаю, про серверную часть — почитай что-нибудь про протокол http, начать можешь хоть с википедии.
Лучший источник информации по PHP — официальный мануал. Не хочешь его попробовать почитать?
Для начинающих — можешь почитать мой учеьник по ссылке в ОП-посте. Если слишком просто — то мануал или Мэтта Зандстру например.
Есть сайт phptherightway.
Ну и для не-начинающих (тех у кого есть базове знания PHP, HTML, CSS, SQL) у нас есть хорошее задание: https://gist.github.com/codedokode/9424217 — пишешь код, а я его проверю.
>>370134
Пока нормально, продолжай в том же духе. Вот только тут ужасный код:
> if (get_class($this) == TinyDocument) {
(кстати ошибка, надо название класса брать в кавычки). В мире ООП так не принято делать, проверять какой это класс через if. Это неправильно. Если ты хочешь поменять поведение appendChild в каком-то классе, просто переопредели его там.
Тем более, класс-предок не должен ничего знать о своих потомках.
> Лучший источник информации по PHP — официальный мануал. Не хочешь его попробовать почитать?
Его и начал вчера читать, продолжу.
Вот на рельсах фитча есть с локальным сервером, одной коммандой все за меня делает. Я поэтому нихрена не знаю как самому запилить локальный сервер, точнее примерно помню, но возился много, наверняка можно и проще. Или имеет смысл просто поставить бессплатный хост на каком-нибудь хостингере и через фтп-клиент синхронизировать постоянно?
> В мире ООП так не принято делать, проверять какой это класс через if.
А как иначе можно полиморфизм организовать?
мимопроходил
> еужели столько строк кода придется писать для каждой выборки, используя while?
Используй функции, чтобы не писать повторяющийся код.
Алсо, у тебя код какой-то ненормальный, зачем делать bind_result, когда можно сделать fetch_row или fetch_all?
Если ты не знаешь, что такие функции есть, я советую, полистать мануал по mysqli: http://php.net/manual/ru/book.mysqli.php
>>370229
1) найти программу, которая умеет это делать (копировать файлы при нажатии на кнопку или при изменении). Я таких не знаю, но наверняка что-то есть.
2) написать деплой-скрипт на bash, например на основе утилиты rsync (мой вариант). при желании этот скрипт можно прикрутить к inotify чтобы запускать автоматически при изменении файлов.
3) как-то заморочиться с гитом, чтобы пушить изменения на сервер, но по сути это придет в итоге к вариант 2.
Для вариантов 2 и 3 необходимо знание bash и линукс-утилит, для варианта 1 необходимо умение гуглить. Гит все же это cvs а не система деплоймента.
4) В многих IDE есть возможность автоматически выкачивать файлы с FTP, править и закачивать. В eclipse наверняка есть плагины для этого. Наверно, тебе это подойдет, хотя мне такой подход не нравится. Гораздо лучше иметь у себя репозиторий и закачивать файлы только в одну сторону.
>>370232
Вот тут есть неебольшой сборник ссылок: https://gist.github.com/codedokode/10539213
Вот еще годные статьи:
http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix.html
http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-2.html
http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-3.html
>>370235
git — система контроля версий, ее надо знать любому программисту, читай сайт git-book (есть русская версия).
ST = Sublime Text — простенький текстовый редактор.
>>370236
Верно. Людям, которые хотят заниматься программированием, а не перебором плагинов, лучше брать IDE. Даже с плагинами качество автодополнения, проверки кода и прочего в ST несравнимо ниже.
>>370237
Анон наверно хочет программированием заниматья, а не перебором сотен сомительных плагинов (которые еще иногда мешают друг другу).
4) В многих IDE есть возможность автоматически выкачивать файлы с FTP, править и закачивать. В eclipse наверняка есть плагины для этого. Наверно, тебе это подойдет, хотя мне такой подход не нравится. Гораздо лучше иметь у себя репозиторий и закачивать файлы только в одну сторону.
>>370232
Вот тут есть неебольшой сборник ссылок: https://gist.github.com/codedokode/10539213
Вот еще годные статьи:
http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix.html
http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-2.html
http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-3.html
>>370235
git — система контроля версий, ее надо знать любому программисту, читай сайт git-book (есть русская версия).
ST = Sublime Text — простенький текстовый редактор.
>>370236
Верно. Людям, которые хотят заниматься программированием, а не перебором плагинов, лучше брать IDE. Даже с плагинами качество автодополнения, проверки кода и прочего в ST несравнимо ниже.
>>370237
Анон наверно хочет программированием заниматья, а не перебором сотен сомительных плагинов (которые еще иногда мешают друг другу).
В php есть что-то похожее, примитивный сервер: http://php.net/manual/ru/features.commandline.webserver.php Это годится для запуска простых скриптов.
Но обычно PHP работает вместе с сервером, например:
Apache + mod_php
Nginx + php_fpm
Для разработки удобнее всего поставить Апач + PHP себе на комп, так как большинство приоложений рассчитано на такое окружение. Если ты под линуксом debian/ubuntu, то установка сводится к:
sudo apt-get install apache2 php5 + расширения вроде curl, dom, mbstring, xdebug. Мой список пакетов:
apache2, php5, php5-curl, php5-gd, php5-gmp, php5-imap, php5-intl, php5-mcrypt, php5-mysqlnd, php5-xdebug, php5-xsl.
Под мак есть MAMP. Под Windows надо поставить Апач + Php и настроить. Вот паста: https://gist.github.com/codedokode/10774100
Не забудь что Апач, PHP и расширения должны быть все 32- или 64-битными и соответствовать битности ОС.
Насчет хостинга — он нужен, если ты хочешь другим свой сайт показывать, иначе локальный сервер удобнее.
Переопрделением (overloading) метода:
class A {
public function doSmth() { код ... }
}
class B extends A {
public function doSmth() { другой код ... }
}
Это и ест полиморфизм: объекты разных классов могут вести себя по-разному.
>Анон наверно хочет программированием заниматья, а не перебором сотен сомительных плагинов (которые еще иногда мешают друг другу).
Никогда не было проблем с плагинами ST, да и вообще проблем с ST. Зато в IDE есть постоянно куча ненужных топорных фич. Лично мне в них просто неудобно. В ST можно самому прикрутить любой, самый извращенный функционал, чем я постоянно и пользуюсь, собственно.
Aptana+ST-кун
Как например заставить функцию делать разные вещи в зависимости от класса переданного ей в аргументах объекта?
Независимые плагины не могут взаимодествовать так хорошо, как цельная IDE.
> В ST можно самому прикрутить любой, самый извращенный функционал
Нет ни нормального автодоплнения (есть какое-то intellicode, но неизвестно как оно себя поведет на больших проектах), ни анализа/проверки кода.
Например, есть какой-то плагин для проверки php кода по мере набора, так он сделан на костылях, он на каждый чих вызывает внешнюю программу (php + скрипты), и процессор грузится очень сильно. То же и с поддержкой jshint — там зпаускается внещний js-скрипт на ноде. Иначе, как набором костылей, склеенных изолентой, я назвать это не могу.
Опиши конктертный пример. В общем случае, мы выносим различающийся функционал в сами передаваемые объекты.
Соответственно, либо делаем передаваемые бъекты чтобы они были унаследованы от общего предка либо реализовали интерфйес.
Вот мой пример. Допустим у нас есть объекты класса Робот и Машина. И есть функция активировать() которая принимает либо Робота либо Машину и делает с ними разные действия. В этом случае мы делаем так, объединиив эти классы интерфейсом:
interface Activatable
{
public function activateThing();
}
function activate(Activatable $thing)
{
$thing->activateThing();
}
Соответственно Робот и Машина должны реализовать этот интерфейс, например:
class Robot implements Activatable
{
public function activateThing()
{
$this->setLightOn();
$this->say('hello');
$this->setLightoff();
}
...
Вот как-то так.
Вот мой пример. Допустим у нас есть объекты класса Робот и Машина. И есть функция активировать() которая принимает либо Робота либо Машину и делает с ними разные действия. В этом случае мы делаем так, объединиив эти классы интерфейсом:
interface Activatable
{
public function activateThing();
}
function activate(Activatable $thing)
{
$thing->activateThing();
}
Соответственно Робот и Машина должны реализовать этот интерфейс, например:
class Robot implements Activatable
{
public function activateThing()
{
$this->setLightOn();
$this->say('hello');
$this->setLightoff();
}
...
Вот как-то так.
Я вел к тому, что нам потребуется проверка на конкретный класс, если например понадобится посчитать, сколько раз вызвали activate для каждого из возможных объектов, но я что-то не могу придумать примера с практическим применением.
Оп, целый день вникаю в алгоритм A* который ты посоветовал. Вроде более менее разобрался что к чему благодаря этой статье http://www.policyalmanac.org/games/aStarTutorial_rus.htm
Но вот с тем что бы применить это к задаче с банкоматом затык.
Пока двигаюсь в таком направлении - сумма которую надо выдать, это стартовая точка. Конечная точка к которой надо прийти это 0. Наши купюры это возможные пути движения. Если остаток к выдаче - купюра < 0 значит это клетка тупик.
Сам еще сдаваться не планирую, просто решил пока ты тут сидишь, почему бы и не проконсультироваться.
1) 1 SQL запрос, соберет данные с N тысяч полей, потом их обработать в скрипте.
2) 3-4 SQL запроса, на выходе получим нужные данные из ~50 полей.
А, хотя сам придумал. Нужно просто вынести общий код в родительский класс, а из дочерних увеличивать счетчик и вызывать родительский метод
Оп, у вас тут зашла тема разговора про IDE и редакторы кода. Пользуюсь пока Sublime Text. Вот мне не хватает структуры файлов, которая перед глазами будет как в Php Storm. А php storm много жрет ресурсов. Закрывая sublime, вкладки сохраняются и копятся постепенно, приходится вручную закрывать. Я в этом плохо разбираюсь, сбоку такая структура файлов проекта, а вкладок нет - вот это удобно. Оп, ты чем пользуешься? Есть ли у тебя какие файлы конфигов и плагины необходимые, чтобы время не терять и не тратить весь вечера на настройку.
Не знаю, оба варианта имеют право на жизнь.
>>370272
A star — это алгоритм поиска не только на 2-мерной карте, а на любом графе (что такое граф? в википедии глянь).
Тут надо в первую очередь определиться, что у нас будет графом и ребрами на нем. Наверно, точками на графе должны быть суммы денег, а ребрами — способы перехода от одной суммы к другой за счет добавления купюр.
Соответственно, тогда станет понятнее, как искать решние — искать путь, который ведет из точки 0 в точку с искомо суммой, или наоборот.
>>370268
Делаем у объектов метод getCounterName(), чтобы он возвращал разные значения для разных типов объектов и говорил какой счетчик увеличить.
Не люблю я википедию для первого прочтения. Обычно вбиваю в гугол %предмет_нейм% для чайников/нубов/новичков.
Из того что я понял про графы выходит что вершины это промежуточные суммы. Стартовая в нашем случае будет 0, а конечная 6600(ну или наоборот, я если честно не вижу разницы, просто заменяем сложение на вычитание). Ребра это имеющиеся в наличии купюры для данной ветки.
Я это как то более менее представляю в голове, но в первые сталкиваюсь с такой проблемой что не знаю как такое написать на php, до этого была обратная проблема - придумать алгоритм, а уж написать его пустяк.
$email_to = 'random@mail.ru';
$name = $_POST['name'];
$email = isset($_POST['email']) ? $_POST['email'] : 'site';
$subject = isset($_POST['subject']) ? $_POST['subject'] : 'Заявка';
$message = $_POST['name'].','.$_POST['tell'];
$headers = "From: $email\r\n";
$headers .= "Reply-To: $email\r\n";
if(mail($email_to, $subject, $message, $headers, $name)){
echo json_encode(array('res' => 'ok'));
}else{
echo json_encode(array('res' => 'false'));
}
?>
Пацаны, есть вот такой скрипт отправки письма. На mail.ru приходят крякозябры. Помогите, как тут настроить кодировку чтоб на русском приходило? Сам в пхп нуб.
Ну ты алгоритм решения сначла придумай в детялях, а только потом реализуй.
Вообще, есть еще такая статья: http://informatics.mccme.ru/mod/book/view.php?id=815 — там то же самое динамическое программирование используется, хотя я не увреен что алгоритм эффективно реализован.
>>370324
Он и так фактически закреплен вверху первой страницы. Мы — второй по популярности тред в этом разделе.
https://github.com/fxsloker/TinyDOM
Теперь firstChild и lastChild определяет.
Осталось самое сложное nextSibling и previousSibling. Я попытался, и у меня слишком сложный и запутанный код получился (убрал его). Может можно добавить свойство $number, чтобы у каждого элемента-соседа был свой порядковый номер начиная с 0? Ну и соответственно с insertBefore тоже ничего не получилось, сам алгоритм понятен, но реализовать не могу.
Еще вот эта копипаста мне не нравится:
if ($this->childNodes->length > 1) {
$this->lastChild = $this->childNodes->getNode($this->childNodes->length - 1);
} else {
$this->lastChild = $this->firstChild;
}
в TinyNode и TinyDocument.
Находил я подобные задачки, проблема в том что у них количество купюр не ограничено, что упрощает задачу. Ну ладно, сейчас допиливаю вывод часто встречающихся слов и словосочетаний, а завтра продолжу штурм банкомата.
> Осталось самое сложное nextSibling и previousSibling.
А что тут сверхсложного? Изначально у узла они равны null, а когда у родителя вставляется/удаляется элемент-ребенок, то у него и его соседей надо обновить эти свойства.
> Может можно добавить свойство $number,
Ты его обновлять замучаешься. При удалении или вставке в начало списка придется у всех, кто идет за ним обновлять номер.
> Еще вот эта копипаста мне не нравится:
Так не надо полностью заменять метод appendChild. Вызови родительский appendChild, а после допиши манипуляцию с decumentElement.
>Вызови родительский appendChild, а после допиши манипуляцию с decumentElement.
Так?
public function appendChild()
{
тут доп. код
appendChild();
}
parent::appendChild();
Я тут что подумал. Может мне сначала сделать версию с бесконечными купюрами, а потом её уже доделать до требований задчи?
С бесконечными купюрами эта задача превращается в задачу о рюкзаке со сверхвозрастающей последовательностью. А она решается жадным алгоритмом.
Как избавиться от ". " в начале строки? mb_substr не помогла.
А, дошло, надо было . ". " вконец пихнуть. Как же это было просто.
По моей логике, там в конце должно писать
n-й месяц спустя: долг = 0 руб
Если неправильно, то что?
код не читал, кажется, в break в блоке else дело.
Подскажи статейку с дельным описание работы с гидхабом.
Буду крайне признателен.
расчёты на динамико-дрисне - примерно в 75 раз быстрее расчётов в уме
if (in_category) {
echo "это категория";
} elseif (is_single) {
echo "это статья";
} else {
echo "нихуя";
}
?>
Почему в wp не работает? Как определить, где я нахожусь?
https://github.com/fxsloker/TinyDOM
Оп, посмотри на код. Мне кажется, я опять усложнил все.
И главный вопрос: через array_splice создается массив в массиве? Посмотри на вывод http://ideone.com/Hghv6F По-моему $img здесь вообще не воспринимается как объект?
Наверное нужно сделать отдельные функции для addFirstSecondChilds() и addSiblings? Я создавал уже строк на 100 примерно, но запутался и удалил код.
Оп как тебе разбивка? Сейчас еще для 3-х сделаю. Писал я тут писал и понял что надо переписать дабы стоп слова отсеивать на этапе составления словосочетаний, так как если после то уже херня получается. Может еще стоит добавить разделение по запятой, а не только точке. Сегодня подумал что не правильно брать слова находящиеся по разные стороны от точки. Уже несколько дней переписываю, вроде начал в верном направление двигаться, хотелось комментариев вот пощу заготовку.
Короче пока пилю так что бы слова по обе стороны и запятой не лепило в одно словосочетание.
http://ideone.com/ORAZtr
В общем вот финальный вариант генерации списка слов и словосочетаний для дальнейшего подсчета. Что еще пофиксить допилить?
> $text = preg_replace('/[!?]/u', '.', $text);
> $parts = preg_split('/[.]/u', $text, 0, PREG_SPLIT_NO_EMPTY);
Не прощее ли вместо замены просто разбивать на предложения по любому из символов [.?!] ?
> $length = mb_strlen($result);
> $result = mb_substr($result, 0, $length-1);
Вообще. если надо взять все символы кроме последнего можно писать
$result = mb_substr($result, 0, -1);
Но в данном случае, непонятно зачем это делаетя. Что-то странно выглядит.
Если сделать, чтобы makeFirstLetterUppercase работала только с одним предложением, то от preg_split и цикла в ней можно будет избавиться.
В остальном выглядит верно.
>>370394
Да, должно рассчитывать кредит до самого конца и писать сколько всего выплачено. Должно получиться около 61270.
В твоем случае, оно может и рассчиывается, но не выводится, так как ты выходишь из цикла, а после него echo нету.
>>370413
Это тут при чем?
> $text = preg_replace('/[!?]/u', '.', $text);
> $parts = preg_split('/[.]/u', $text, 0, PREG_SPLIT_NO_EMPTY);
Не прощее ли вместо замены просто разбивать на предложения по любому из символов [.?!] ?
> $length = mb_strlen($result);
> $result = mb_substr($result, 0, $length-1);
Вообще. если надо взять все символы кроме последнего можно писать
$result = mb_substr($result, 0, -1);
Но в данном случае, непонятно зачем это делаетя. Что-то странно выглядит.
Если сделать, чтобы makeFirstLetterUppercase работала только с одним предложением, то от preg_split и цикла в ней можно будет избавиться.
В остальном выглядит верно.
>>370394
Да, должно рассчитывать кредит до самого конца и писать сколько всего выплачено. Должно получиться около 61270.
В твоем случае, оно может и рассчиывается, но не выводится, так как ты выходишь из цикла, а после него echo нету.
>>370413
Это тут при чем?
const int INF=1000000000; // Значение константы }бесконечность}
int F[n+1];
F[0]=0;
int m, i;
for(m=1; m<=n; ++m) // заполняем массив F
{ // m - сумма, которую нужно выдать
F[m]=INF; // помечаем, что сумму m выдать нельзя
for(i=0; i<k; ++i) // перебираем все номиналы банкнот
{
if(m>=a[i] && F[m-a[i]]+1<F[m])
F[m] = F[m-a[i]]+1; // изменяем значение F[m], если нашли
} // лучший способ выдать сумму m
}
Оп помоги понять пример кода для задачи о банкомате. Ты мне ссылку кидал вчера кажись. http://informatics.mccme.ru/mod/book/view.php?id=815
int F[n+1] - это что вообще такое? int же integer. А по ссылке пишут - "Теперь заведем массив F[n+1]"
Ничего не понимаю, мало того что у массива int, так еще и ключ какой то непонятный.
А в документации на codex.wordpress.com что-нибудь написано по этому поводу?
>>370562
> через array_splice создается массив в массиве?
Ничего не создается. Эта функция просто вырезает из массива серединку и если надо вставляет туда другой кусочек массива.
То есть был массив например с элементами
a b с d e f
Мы можем из середины вырезать несколько и несколько вставить взамен, будет
array_splice($array, 2, 3, array('i', 'j'))
a b i j f
> public 'tagName' =>
> array (size=2)
> 0 => string '<div>' (length=5)
А что это такое? В tagName просто хранится название элемента, а не html-код.
> array_splice($this->childNodes->nodes, $index, 0, $newNode);
Ты нарушаешь принципы инкапсуляции. Ты не должен лезть внутрь другого объекта, а обращаться к нему через вызов методов. Чтобы такого не было, давай сделаем все свойства, которые не описаны в задании, private или protected. В том числе свойство nodes.
>>370563
Да, наверно стоит. Только зачем там 100 строк? Это же просто указатели на соседние элементы. Проходишься по изменившимя жлементам циклом и обновляешь ссылки.
>>370565
А зачем вообще сохранять знаки препинания? Нам же нужны только слова и их сочетания.
И тут было бы удобнее сделать цикл не foreach, а for и тогда можно было бы писать:
$pair = $words[$i].' '.$words[$i + 1];
>>370569
> if (array_search($word, $stopWords)
Тут лучше использовать in_array
Опять же, тут лучше бы цикл for подошел.
Насчет стоп-слов — самый простой способ это удалить их из массива слов. Или делать каждый раз 3 проверки, находится ли хоть одно из 3 слов в списке.
>>370583
Код — большая простыня. Думаю, надо его упростить, и наверно часть вынести в функции. например, удаление вхходящих друг в друга сочетаний точно стоит вынести в функцию.
Ну и цикл на for заменить.
> if (!empty($countThreeWords)) {
Эта проверка лишняя, foreach нормально обработает пустой массив. Другой вопрос, что у тебя нет инициализации это йпеременнйо и она может не существовать. Это абсолютно недопустимо, все переменные надо правильно создавать, даже если они пустые.
> mb_strpos($words2, $word) !== false)
Тут есть подвох: а что если
$word2 = 'скотный двор';
$word = 'кот';
? Надо наверно усложнить проверку. Например, можно хранить сочетание как массив слов и проверять их на пересечение через array_intersect
А в документации на codex.wordpress.com что-нибудь написано по этому поводу?
>>370562
> через array_splice создается массив в массиве?
Ничего не создается. Эта функция просто вырезает из массива серединку и если надо вставляет туда другой кусочек массива.
То есть был массив например с элементами
a b с d e f
Мы можем из середины вырезать несколько и несколько вставить взамен, будет
array_splice($array, 2, 3, array('i', 'j'))
a b i j f
> public 'tagName' =>
> array (size=2)
> 0 => string '<div>' (length=5)
А что это такое? В tagName просто хранится название элемента, а не html-код.
> array_splice($this->childNodes->nodes, $index, 0, $newNode);
Ты нарушаешь принципы инкапсуляции. Ты не должен лезть внутрь другого объекта, а обращаться к нему через вызов методов. Чтобы такого не было, давай сделаем все свойства, которые не описаны в задании, private или protected. В том числе свойство nodes.
>>370563
Да, наверно стоит. Только зачем там 100 строк? Это же просто указатели на соседние элементы. Проходишься по изменившимя жлементам циклом и обновляешь ссылки.
>>370565
А зачем вообще сохранять знаки препинания? Нам же нужны только слова и их сочетания.
И тут было бы удобнее сделать цикл не foreach, а for и тогда можно было бы писать:
$pair = $words[$i].' '.$words[$i + 1];
>>370569
> if (array_search($word, $stopWords)
Тут лучше использовать in_array
Опять же, тут лучше бы цикл for подошел.
Насчет стоп-слов — самый простой способ это удалить их из массива слов. Или делать каждый раз 3 проверки, находится ли хоть одно из 3 слов в списке.
>>370583
Код — большая простыня. Думаю, надо его упростить, и наверно часть вынести в функции. например, удаление вхходящих друг в друга сочетаний точно стоит вынести в функцию.
Ну и цикл на for заменить.
> if (!empty($countThreeWords)) {
Эта проверка лишняя, foreach нормально обработает пустой массив. Другой вопрос, что у тебя нет инициализации это йпеременнйо и она может не существовать. Это абсолютно недопустимо, все переменные надо правильно создавать, даже если они пустые.
> mb_strpos($words2, $word) !== false)
Тут есть подвох: а что если
$word2 = 'скотный двор';
$word = 'кот';
? Надо наверно усложнить проверку. Например, можно хранить сочетание как массив слов и проверять их на пересечение через array_intersect
> int F[n+1] - это что вообще такое?
Си — строго типизированный язык. У каждой переменной есть свой тип и нельзя например в переменную для хранения чисел записать строку. В Си ты должен заранее объявить переменную и задать ее тип, преде чем использовать, а также там массивы фиксированного размера (который тоже задается заранее и нельзя поменять).
int — это тип для хранения целых чисел.
Объявление переменной выглядит как
тип имя, имя...;
В данном случае мы создаем массив F размером n + 1 с индексами от 0 до n.
> int m, i;
Соответственно создаем 2 переменных для хранения целых чисел.
В С++ разве можно объявлять массивы с размером в виде выражения? Мне казалось, что только константами.
> А зачем вообще сохранять знаки препинания? Нам же нужны только слова и их сочетания.
Знаки препинания я сохраняю дабы не склеить в словосочетание слово слева и справа от запятой/точки(ну или любого другого знака). Имхо это как то не правильно. Точно так же как и склеивать слова после удаления между ними союза "и" например.
Буду фиксить. Спасибо за разъяснение кода на C, понятнее стало. Пока ждал ответа лилечку написал
http://ideone.com/6XChXD
Минут 5-10 ушло. Не совсем понятно что это задание делает среди таких задач как банкомат и поиск пути. Ёба алгоритмы всякие и т.д. А тут легкотня такая.
> Насчет стоп-слов — самый простой способ это удалить их из массива слов. Или делать каждый раз 3 проверки, находится ли хоть одно из 3 слов в списке.
Их я удаляю из массива слов только после того как создал массивы с словосочетаниями по той же причине что и сохраняю знаки препинания - что бы не получилось такой истории - вот это прикол.
Если внести слово это в стоп лист, то получится словосочетание вот прикол, но его то нет. Поэтому я и храню все это дело, что бы составить действительно существующие словосочетания не разделенные стоп словами и знаками препинания.
В твоей задаче например есть - ключами и значениями. Если я удалю стоп слово, сразу то в массив попадет - ключами значениями
Нет. Даже на английском гуглил. Походу все правильно и нихуя не правильно. То и друге —
true
. Когда я в самой новости и в категории, эти два тега true
. Мне нужно сделать, чтобы либо это, либо то. Пиздец.is_category();
// Когда отображается любая страница категорий.
in_category()
// Проверяет принадлежит ли текущий (или указанный) пост к указанной категории.
> И тут было бы удобнее сделать цикл не foreach, а for и тогда можно было бы писать:
> $pair = $words[$i].' '.$words[$i + 1];
Почему удобнее? Я ведь 1 раз создаю переменные prevKey и nextKey и потом их использую далеко не один раз. Мне не кажется что вместо них писать везде $key + 1 или $key - 1 такое уж удобство.
$prevKey = $key - 1;
if ($prevKey < 0) {
continue;
} elseif (array_search($words[$prevKey], $stopWords) !== false) {
continue;
}
$threeWords[] = $words[$prevKey] . ' ' . $word . ' ' . $words[$nextKey];
> Код — большая простыня. Думаю, надо его упростить, и наверно часть вынести в функции. например, удаление вхходящих друг в друга сочетаний точно стоит вынести в функцию.
Функция будет принимать 3 массива и возвращать 1 в котором только уникальные слова и словосочетания?
>А что это такое? В tagName просто хранится название элемента, а не html-код
Ага, причем у меня есть еще nodeName. Чем они различаются не знаю. А где собирать тег тогда?
>Ты нарушаешь принципы инкапсуляции. Ты не должен лезть внутрь другого объекта, а обращаться к нему через вызов методов. Чтобы такого не было, давай сделаем все свойства, которые не описаны в задании, private или protected. В том числе свойство nodes.
Ок, но array_splice тут подходит?
array_splice мне не нравится. Думаю, нужно что-то другое.
Проблема решена. Проблема была со скобочками if ((is_category)).
То есть я все свойства ставлю private, а доступ к ним через геттеры, которые protected в свою очередь?
github.com/fxsloker/TinyDOM
Принимай, insertBefore работает (по-моему это самая сложная функция из всех).
http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html
> Variable-length automatic arrays are allowed in ISO C99, and as an extension GCC accepts them in C90 mode and in C++. These arrays are declared like any other automatic arrays, but with a length that is not a constant expression.
Если локальная переменная то можно. Но в любом случае. там скорее всего имеется в виду похожий на Си псевдокод.
>>370621
> Знаки препинания я сохраняю дабы не склеить в словосочетание слово слева и справа от запятой/точки
Насчет точки может быть, но насчет запятой не уверен. Чтобы исключить разделенные точкой сочетания, можно поступить так:
- разбиваем текст на массив предложений
- каждое предложение отдельно разбиваем на слова и строим словосочетания
Насчет стоп-слов, я тоже не уверен. «Глупость и отвага» — вполне себе сочетание, хоть и содержит стоп-слово. Так что я бы оставил такие сочетания.
> Лиличка
> ('/\n\s/', $text);
Если после перевода строки не будет пробела, то она не разобьется. Лучше разбивать по \n, а потом удалять пробелы через trim().
Строки 24-30 (нахождение макс. длины), кстати, можно записать в одну строчку с помощью array_map.
А так, в остальном верно.
> Не совсем понятно что это задание делает среди таких задач как банкомат
Нормальная задача, почему, надо немного подумать головой чтобы повернуть строки вертикально.
http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html
> Variable-length automatic arrays are allowed in ISO C99, and as an extension GCC accepts them in C90 mode and in C++. These arrays are declared like any other automatic arrays, but with a length that is not a constant expression.
Если локальная переменная то можно. Но в любом случае. там скорее всего имеется в виду похожий на Си псевдокод.
>>370621
> Знаки препинания я сохраняю дабы не склеить в словосочетание слово слева и справа от запятой/точки
Насчет точки может быть, но насчет запятой не уверен. Чтобы исключить разделенные точкой сочетания, можно поступить так:
- разбиваем текст на массив предложений
- каждое предложение отдельно разбиваем на слова и строим словосочетания
Насчет стоп-слов, я тоже не уверен. «Глупость и отвага» — вполне себе сочетание, хоть и содержит стоп-слово. Так что я бы оставил такие сочетания.
> Лиличка
> ('/\n\s/', $text);
Если после перевода строки не будет пробела, то она не разобьется. Лучше разбивать по \n, а потом удалять пробелы через trim().
Строки 24-30 (нахождение макс. длины), кстати, можно записать в одну строчку с помощью array_map.
А так, в остальном верно.
> Не совсем понятно что это задание делает среди таких задач как банкомат
Нормальная задача, почему, надо немного подумать головой чтобы повернуть строки вертикально.
> то получится словосочетание вот прикол, но его то нет.
Гм. Ну лучше разршить стоп-слова в сочетаниях тогда, чем вообще выкидывать их.
> Если я удалю стоп слово, сразу то в массив попадет - ключами значениями
А если удалять такие сочетания то мы его вообще не увидим в списке.
>>370624
Переменных надо меньше заводить, и условий будет меньше.
>>370628
Не, лучше 2 массива на входе и 1 на выходе.
>>370659
В приватных полях. Хотя зачем вообще хранить html-код, если его можно собирать только при вызове saveHtml() ? Не надо его хранить нигде.
> Ок, но array_splice тут подходит?
Да.
>>370798
Просто заведи переменную, положи в нее 0. Когда встречаешь высокого школьника — увеличивай на 1. В итоге в ней будет число высоких школьников.
>>370799
Да, это называется инкапсуляция когда доступ к данным объекта можно получить только через вызов методов, а не напрямую. Это делает код более надежным и защищенным от ошибок.
Там еще есть магический метод _ _ get(), посмотри документацию, ты можешь сделать чтобы при обращении к свойству length например вызывалась функция getLength(). То есть выглядеть снаружи это будет как обычное свойство на на самом деле используется вызов геттера.
> for ($i = 0; $i <= $this->childNodes->getLength(); $i++)
Что-то не очень оптимально. Потом надо будет подумать, как перессчитывать только те значения, которые изменились.
У первого и последнего элемента next/previousSibling должны сдержать null. Если детей нет, last/firstChild тоже должны равняться null.
> $this->childNodes->setNodesList($nodesListCopy);
Сомнительный какой-то код. Лучше сделать метод для вставки у nodeList, а в нем делать array_splice()
> то получится словосочетание вот прикол, но его то нет.
Гм. Ну лучше разршить стоп-слова в сочетаниях тогда, чем вообще выкидывать их.
> Если я удалю стоп слово, сразу то в массив попадет - ключами значениями
А если удалять такие сочетания то мы его вообще не увидим в списке.
>>370624
Переменных надо меньше заводить, и условий будет меньше.
>>370628
Не, лучше 2 массива на входе и 1 на выходе.
>>370659
В приватных полях. Хотя зачем вообще хранить html-код, если его можно собирать только при вызове saveHtml() ? Не надо его хранить нигде.
> Ок, но array_splice тут подходит?
Да.
>>370798
Просто заведи переменную, положи в нее 0. Когда встречаешь высокого школьника — увеличивай на 1. В итоге в ней будет число высоких школьников.
>>370799
Да, это называется инкапсуляция когда доступ к данным объекта можно получить только через вызов методов, а не напрямую. Это делает код более надежным и защищенным от ошибок.
Там еще есть магический метод _ _ get(), посмотри документацию, ты можешь сделать чтобы при обращении к свойству length например вызывалась функция getLength(). То есть выглядеть снаружи это будет как обычное свойство на на самом деле используется вызов геттера.
> for ($i = 0; $i <= $this->childNodes->getLength(); $i++)
Что-то не очень оптимально. Потом надо будет подумать, как перессчитывать только те значения, которые изменились.
У первого и последнего элемента next/previousSibling должны сдержать null. Если детей нет, last/firstChild тоже должны равняться null.
> $this->childNodes->setNodesList($nodesListCopy);
Сомнительный какой-то код. Лучше сделать метод для вставки у nodeList, а в нем делать array_splice()
Не выходит с array_splice. Не помню то ли он все объекты начинает воспринимать как массивы, а свойства элементами этих массивов, то ли добавляемый объект начинает воспринимать как массив со свойствами (элементами).
С array_merge тоже добавляемый объект в массив воспринимается как еще один массив.
Путаница получается, выводит не то, что нужно.
>У первого и последнего элемента next/previousSibling должны сдержать null. Если детей нет, last/firstChild тоже должны равняться null.
Это учтено, и все выводится правильно.
>Сомнительный какой-то код. Лучше сделать метод для вставки у nodeList, а в нем делать array_splice()
Но insertBefore отвечает за правильную вставку объекта в массив. Зачем тогда он нужен? Чтобы вызвать сторонний метод? Тогда название метода не говорит само за себя.
Сейчас нужно понять, что сделать в первую очередь нужно.
да.
>>370659
Согласись, хорошо бы сделать, чтобы NodeList работал с foreach, то есть чтобы можно было написать:
foreach ($node->childNodes as $child) { ... }
Для этого надо в NodeList запилить поддержку интерфейса Traversable: http://php.net/manual/ru/class.traversable.php (точнее, интерфейса Iterator).
Было бы неплохо если бы NodeList поддерживал count(), то есть можно было писать:
count($node->childNodes)
Для этого надо реализовать в нем интерфейс Countable: http://php.net/manual/ru/class.countable.php
Было бы замечательно, если бы NodeList поддерживал обращение через индекс, по типу:
$node->childNodes[0]
Для того, чтобы объект поддерживал такое, надо запилить поддержку http://php.net/manual/ru/class.arrayaccess.php
Также, для всех узлов (Node и потомков) давай запилим поддержку волшебного метода _ _ toString(), чтобы при вызове
echo $node;
Выводился бы HTML-код ноды, например:
<b>Hello World</b>
Сделать все это полезно, чтобы изучить соответствующие интерфейсы из SPL.
Обрати внимание, в PHP в SPL (встроенной библиотеке полезных классов) есть класс AraryObject: http://php.net/manual/ru/class.arrayobject.php , который годится как основа для объектов-коллекций, в котором много чего уже реализовано.
Вообще, если ты хочешь быть не быдлокодером, а хорошим программистом, то стоит познакомиться с этой SPL, хотя бы в общих чертах ( http://php.net/manual/ru/book.spl.php ). Там есть котовые классы для разных структур данных и паттернов, например:
- ArrayObject для содания коллекций
- SplSubject/SplObserver для реализации паттерна Observer (это когда объект A может подписаться на уведомления от объекта B и объект B будет уведомлять его (и всех кто подписался), что с ним что-то произошло).
- SplPriorityQueue для организации очереди с приоритетами
- RecursiveDirectoryIterator для обхода файлов во вложенных папках
- итераторы, на которых можно сломать мозг с непривычки
да.
>>370659
Согласись, хорошо бы сделать, чтобы NodeList работал с foreach, то есть чтобы можно было написать:
foreach ($node->childNodes as $child) { ... }
Для этого надо в NodeList запилить поддержку интерфейса Traversable: http://php.net/manual/ru/class.traversable.php (точнее, интерфейса Iterator).
Было бы неплохо если бы NodeList поддерживал count(), то есть можно было писать:
count($node->childNodes)
Для этого надо реализовать в нем интерфейс Countable: http://php.net/manual/ru/class.countable.php
Было бы замечательно, если бы NodeList поддерживал обращение через индекс, по типу:
$node->childNodes[0]
Для того, чтобы объект поддерживал такое, надо запилить поддержку http://php.net/manual/ru/class.arrayaccess.php
Также, для всех узлов (Node и потомков) давай запилим поддержку волшебного метода _ _ toString(), чтобы при вызове
echo $node;
Выводился бы HTML-код ноды, например:
<b>Hello World</b>
Сделать все это полезно, чтобы изучить соответствующие интерфейсы из SPL.
Обрати внимание, в PHP в SPL (встроенной библиотеке полезных классов) есть класс AraryObject: http://php.net/manual/ru/class.arrayobject.php , который годится как основа для объектов-коллекций, в котором много чего уже реализовано.
Вообще, если ты хочешь быть не быдлокодером, а хорошим программистом, то стоит познакомиться с этой SPL, хотя бы в общих чертах ( http://php.net/manual/ru/book.spl.php ). Там есть котовые классы для разных структур данных и паттернов, например:
- ArrayObject для содания коллекций
- SplSubject/SplObserver для реализации паттерна Observer (это когда объект A может подписаться на уведомления от объекта B и объект B будет уведомлять его (и всех кто подписался), что с ним что-то произошло).
- SplPriorityQueue для организации очереди с приоритетами
- RecursiveDirectoryIterator для обхода файлов во вложенных папках
- итераторы, на которых можно сломать мозг с непривычки
Ты не можешь применить array_splice на объекте, только на массиве (то есть на свойстве nodes).
> то ли добавляемый объект начинает воспринимать как массив со свойствами
Можешь маленький кусочек кода, демонстрирующий это, на ideone выложить?
Ну и чтобы не было неоднозначности, можно явно объект в массив класть:
array_slice(..., array($node));
> С array_merge тоже добавляемый объект в массив воспринимается как еще один массив.
Ну так array_merge вроде и принимает только массивы на вход.
> Зачем тогда он нужен? Чтобы вызвать сторонний метод? Тогда название метода не говорит само за себя.
Он нужен для добавляния ребенка к узлу и описан в стандарте. Как именно узел это делает — это детали реализации, в стандарте не описаны, значит можно делать как угодно. В данной ситуации удобно поместить код внутрь NodeList чтобы не нарушать инкапсуляцию.
И наверно одна строчка с array_splice короче и удобнее, чем написать целый цикл, перетасовывающий элементы с дополниетльным массивом, разве нет?
> Сейчас нужно понять, что сделать в первую очередь нужно.
Ну что хочешь, то и делай. Там вроде не так и много остается. removeChild например можешь сделать.
>Можешь маленький кусочек кода, демонстрирующий это, на ideone выложить?
Покажу так:
добавил array_splice($nodesList, $index-1, 0, $newNode); вместо того цикла, где перетасовываются элементы массива в insertBefore.
Вывод такой: http://ideone.com/McLKWh
То есть объект (узел) $p стал массивом и все его свойства пронумерованы индексами начиная от 0. А вот div так и остался объектом.
>Ну так array_merge вроде и принимает только массивы на вход.
В документации написано, что в ранних версиях php можно было добавлять строки, а теперь, чтобы добавить строку нужно указывать тип (array), например:
<?php
$beginning = 'foo';
$end = array(1 => 'bar');
$result = array_merge((array)$beginning, (array)$end);
print_r($result);
?>
Я как понял, строка $beginning преобразуется в массив? Но на выводе вот что:
Array
(
[0] => foo
[1] => bar
)
А у меня почему-то так не сработало, представляя объект (array)$newNode.
>то стоит познакомиться с этой SPL
Натыкался на SPL много раз пока про DOM читал. Надо будет познакомиться. С Traversable уже много встречался в DOMNodesList.
А, это видимо сработало автомтичсекое преобразование объекта в массив ( http://php.net/manual/ru/language.types.array.php#language.types.array.casting )
Значит надо явно передавать массив из 1 ноды.
Я вообще не люблю такие функции, которые могут принимать и массив, и не массив, и что угодно, по моему это плохо и ведет к проблемам, аргументы и результат функции должны иметь один заранее определенный тип.
>>370884
> Я как понял, строка $beginning преобразуется в массив?
Да, тут описано: http://php.net/manual/ru/language.types.array.php#language.types.array.casting
> А у меня почему-то так не сработало, представляя объект (array)$newNode.
Прочти мануал по ссылке.
Вообще, код дурной. Писать надо так:
$result = array_merge(array($beginning), array($end));
и проблем никогда не будет. То же касается и array_splice, явно делай массив из 1 элемента и проблем не будет.
> или НАРОДный сайт, где применение языка не связанное с вебом
Ну так прожде чем в веб лезть, надо наверно сам язык выучить, не? Нельзя же сайты делать, не понимая как работают массивы или функции? Если учебник для тебя очень простой, так ты задачи за 2 дня прорешаешь все.
> аутично разбирается
Гм? А что значит «аутично»? Просто интересно.
Помоги составить план обучения пхп, хранитель пхп-треда.
Сначала хочу чуть получше разобраться в "чистом" пыхе.
А дальше что? Разбирать движки, кмсы?
http://www.youtube.com/playlist?list=PLz-yurM08Pgr7EQC6KS3W4-HGKJsQNj1L
Так вот я не пойму как потом его совмещать со всем остальным. Собственно придавать динамику страницам. Взаимодействие пхп с хтмлом и все остальное что может понадобится для воплощений.
Конечно нужно понимать как работает пхп, но я бы хотел сначала наметить путь, прежде чем идти. Возможно сначала узнав о взаимодействии и базовых знаниях как применять пхп, я бы смог последовательно его изучая воплощать все более сложные задумки. Так ведь на много легче запоминается и понимается. А все эти неведомые задачки, я в школе из-за этого перехотел программировать, потому что не мог понять цель. Они круты, и я бы не прочь их порешать, но я хочу видеть долбанную картину в целом. В ЦЕЛОМ. Да, я тот еще быдлан, как можно догадаться.
> Гм? А что значит «аутично»? Просто интересно.
без понятия. но я имел ввиду, что отстраненно, от всего остального. Пхп же не используют без остального, по этому когда я ддолго читаю изолированно про пхп, я теряю нить вообще. утрированно, я хочу изучить бэк-энд, а не пхп в частности. хтмл и ксс я читать могу и делал пару статичных страниц, в целом там дело гугла(справочника).
Спасибо что отвечаете, пацаны
Попробуй codecademy.com, там объясняется первоначальная суть пхп - встраиваемость в странички для динамики.как в руби вставлял код в представления через <%= %> Далее автоматизация уровня пыхофреймворков и цмс.
Ты, конечно, молодец, но курсов по пхп хоть жопой жуй. А денвер, и написание кода в ворде - преступления против зк и всего человечества.
Лучше бы рассказывал про xss, csrf и sql-инъекции. Этого говна на ютубе меньше.
>советует w3schools
Что не так, фраерок?
Консо́рциум Всеми́рной паути́ны (англ. World Wide Web Consortium, W3C) — организация, разрабатывающая и внедряющая технологические стандарты для Всемирной паутины. Консорциум возглавляет сэр Тимоти Джон Бернерс-Ли, автор множества разработок в области информационных технологий.
http://ru.wikipedia.org/wiki/%CA%EE%ED%F1%EE%F0%F6%E8%F3%EC_%C2%F1%E5%EC%E8%F0%ED%EE%E9_%EF%E0%F3%F2%E8%ED%FB
Даже двач, даже аллах работают по стандарту от этих ребят.
> Насчет стоп-слов, я тоже не уверен. «Глупость и отвага» — вполне себе сочетание, хоть и содержит стоп-слово. Так что я бы оставил такие сочетания.
>>370863
> А если удалять такие сочетания то мы его вообще не увидим в списке.
С этим согласен, но ведь тогда у нас еще и получаться словосочетания из 2-х слов - глупость и, и отвага. И из 3 слов(реальная картинка, которая меня заставила так сделать) - самое частое словосочетание в нашем задании - сохраняют отношения и.
Хотя, пока писал, подумал что можно прикрутить проверку но то, является ли стоп слово первым или последним в словосочетании из 3 слов.
Но это опять же проверки, от которых ты предлагаешь отказаться и я не представляю как. Ведь для того что бы убедится что в словосочетании из 3 слов первое и последние не будет стоп словом надо сначала проверить эти два слова, а после уже, если все окей, сохранять. Уже как минимум два применения prevKey и nextKey. Перед этим еще надо проверить что следующее или текущее слово не является стопсловом, что бы не делать словосочетание из двух слов аля "и отвага", что уже 3 применение nextKey.
> Насчет точки может быть, но насчет запятой не уверен. Чтобы исключить разделенные точкой сочетания, можно поступить так:
"Физик создал танцевальный и инструментальный ансамбли, восстанавливал университет, строил мечеть и принимал участие в издании словаря и анатомического атласа."
Ансамбли восстанавливал, университет строил, ансамбли восстанавливал университет, университет строил мечеть, инструментальный ансамбли восстанавливал.
Не соглашусь. Все же запятая пускай и не настолько разделитель по смыслу как точка, но все же разделяет и при склеивание не обращая на нее внимание, получается тот еще бред. Эта мысль кстати у меня еще появилась во время задания YodaSpeak - текст становится ощутимо лучше если переворачивать его не по точкам, а запятым, но тогда мне влом было перепиливать и я не стал поднимать эту тему.
"Война гражданская идет. Империей галактической зловещей со схватке в победу первую одержали базы тайной с удар наносящие повстанцев корабли космические."
И так будет выглядить если переворачивать смотря на запятные тоже(так как программу надо переписывать, просто заменил запятые точками)
"Йода говорит: Война гражданская идет. Повстанцев корабли космические. Базы тайной с удар наносящие. Победу первую одержали. Империей галактической зловещей со схватке в.".
У меня кстати еще одна идея была по этой задаче. Приклеивать стоп слова(тогда я еще такого слова правда не знал) к словам что идут после них.
"Базы тайной с удар наносящие" => "Базы с тайной удар наносящие".
В общем можно докрутить скрипт до выдачи вполне приличного текста, правда не знаю зачем, кроме как just for fun.
Класс может реализовывать сразу несколько интерфейсов?
А наследовать свойства сразу от нескольких классов?
>Класс может реализовывать сразу несколько интерфейсов?
Да
>А наследовать свойства сразу от нескольких классов?
Нет. Но есть трейты.
Вот этого сагателя поддвачну. Промотал первый ролик за минуту и был удивлен тем моментом что там какой то платный хостинг. Мало того что есть вещи много лучше денвера(тот же опенсервер например) так и на какой хрен вообще для обучения платный хостинг, когда есть миллионы бесбплатных и с почтой, и mysql и вообще чем угодно?
Ну а то что книги на озоне херня, мне тоже так советовали, ибо давать ссылку на торренты как то не красиво. Проще сказать какая книга нужна и где ее можно законно достать, ну а дальше смотрящий сам пускай решай где именно и как он ее получит.
В общем делаю для работки простейшую фиговину.
Есть 3 <input/> у меня и кнопка, есть табличка в MySQL.
Как сделать по нажатию кнопки добавление данных в таблицу через php?
О, так тут все проще в ArrayObject есть и append, и exchangeArray. В TinyNode методах я могу просто на них ссылать в TinyNodeList.
http://ideone.com/pZyzaP
бесконечный цикл. Но там же выход через return. Так-же пробовал break затем после цикла return уже. И пробовал просто переменную равную true ставить false. Бесконечный цикл все равно. Будто просто else не задействуется. но должен же.
Вот задача на поиск слов с одной латинской буквой в них. Но я не могу понять, как мне выделить какая из них латинская?
посмотрел. там только основы (хотя местами все равно есть что почитать). Как собственно придавать динамику там не написано. просто пхп код всунут в хтмл, а операции те же. Мне интересно как собственно менять страницы и т.п. Банальный пример: Поле инпут текст и инпут сабмит. Нужно чтобы написанный текст появлялся как абзац вначале страницы. Я без понятия как это сделать, подумал, может массив, то бишь каждое написанное сообщение записывается в массив, а в начале страницы просто выводить каждую ячейку как абзац. Не заработало, как я понял он не переписывает файл пхп, по этому в начале только 1 сообщение, при новом запросе страницы все стирается. Хотелось бы почитать именно о таком аспекте языка, как он вообще работает, а не его синтаксис, функции, и т.п. Про них я уже почитал и буду читать, конечно еще.
Хотелось бы узнать по больше шаблонов. Как сделать элементарную важно для понимания авторизацию, записи, и всякую динамику. Да, именно шаблонов быдло-кодер стайл. Потому что мне дают средства, а я слишком туп, чтобы сам понять как их использовать. Нужны примеры. Расхожие.
Бра!
Если тебе нужно, чтобы введенные пользователем данные сохранялись, нужно их вносить либо в БД, либо записывать в отдельный файл.
> Нужно чтобы написанный текст появлялся как абзац вначале страницы. Я без понятия как это сделать, подумал, может массив, то бишь каждое написанное сообщение записывается в массив, а в начале страницы просто выводить каждую ячейку как абзац.
В целом так, но ты не учел одну вещь. При каждом запросе php-скрипт запускается заново и в конце запроса он терминируется. Если тебе нужно, чтобы переменные сохранялись между запросами, тебе надо где-то их отдельно хранить. Сериализовать в текстовый файл хотя бы.
Не совсем понял, тебе нужно, чтобы при обновлении страницы введенный в поле текст там и оставался?
нет, вот отправил форму. в поле текст пустой, но при обновлении он спрашивает ввести еще раз. Можно или не обновлять страницу или подтвердить, тогда он отправит последнее сообщение еще раз. Может просто особенность мазилы
Просьба отправить заново данные возникает, когда отображаемая страница получена в результате выполнения POST-запроса. Если ты сделаешь на сервере редирект на ту же страницу с помощью GET, то просьбы не будет.
Спасибо. В нескольких местах читал, написано было что не отличаются.
Правда тогда он просто при f5 постит последнее сообщение.
Проверка при post-запросе нужна, чтобы пользователь не отправил важный запрос ещё раз обновишься. Создание чего либо (как в твоём случае) должно делаться через пост. Ты же рельсы изучал, ну ёбана.
Дано: комп без подключения к интернету.
Найти: джентельменский набор для изучения PHP, MySQL, JavaScript (в виде книг или видеокурсов). HTML и CSS владею. А также редакторы кода, виртуальные сервера для практики и любой софт который будет полезен, чтобы в оффлайне можно было тестировать проекты. Стоит ли юзать Денвер?
С меня отчёт о проделанной работе, как вернусь с отпуска. Ранее php не трогал.
Сегодня-завтра ещё смогу выкачать что насоветуете из сети.
inb4: скачай сайты из ОП-поста, скачай 10 учебников по одной теме из гайда pr.
Вообще подожди опа, ну а на случай если он не появится - я юзаю phpstorm+openserver+notepadplusplus+xdebug. Можешь еще всяких php, apache и mysql отдельно скачать(в опенсервере все это есть, включая xdebug). Сайт опа, в тех книгах что я читал с задачками не очень густо, так что тут лучше запастись, хотя у опа дохерища заданий - от hello world до написания файлообменника. Правда тяжко будет так как код некому будет показать - ибо постоянно такое - все ок вроде и работает, а как покажешь так в кучу мест натычут и кучу багов укажут. Хотя все что наговнокодил можно будет по возвращении начать фиксить.
Сейчас mysqli используются, а остальные не рекомендованы к использованию?
http://php.net/download-docs.php
http://www.php.su/learnphp/?syntax
Для разработки sublime+snipset+ ещё плагины которые найдёшь
Денвер - не стоит. Кастрированое говно. Можешь глянуть в сторону вампа
http://www.wampserver.com/ru/
Правда в последней версии он кажись скатился но каждому свое
Олсо видеокурсы абсолютно не советую. Эти долбоебы долго что-то пытаются рассказать, слишком много времени уходит и не так приятно как чтение. На твоем бы месте ковырял доки.
По мускулу особо не подскажу что изучать, в основном почитай о выборке, апдейтам и инсертам.
Для гостевухи хватит с головой.
Олсо можешь написать какую-нибудь интерактивную гостевуху на js+php+mysql
Кстати - http://php.net/download-docs.php
Оффлайн документация по php, must have. Лучше любой книги.
Попробуй ctrl+shift+R нажать.
<?php
$a = false;
if($a == true):
echo "Работает";
endif;
?>
<a href="#">Работает</a>
Как сделать так, чтобы при нажатии на ссылку переменная $a меняла своё значение на true?
>>371086
Документацию по PHP на понятном тебе языке: http://php.net/download-docs.php лучше всего в формате chm (если ты под windows) или many html files.
Книги, указанные в первом посте.
Хороший редактор кода.
Сам PHP + популярные расширения.
Учебник по mySQL скачать: http://phpclub.ru/mysql/
Учебник по JS скачать: http://learn.javascript.ru/ (правда тут скачивание платное, так что можно попробовать программой выкачать сайт)
Учебник по HTML/CSS скачать: http://htmlbook.ru/books
Я PDO рекомендую всем как самую нормальную: http://habrahabr.ru/post/137664/
Можно и mysqli, но она по моему слабее (например нет исключений).
Mysql устарела.
>>370993
Так нам надо, чтобы перебирался не всякий мусор, а только узлы, хранящиеся в NodeList.
>>371013
Если он не выходит, значит else никогад не выполняетя. Сделай вывод значений переменных на каждом шаге и проверь.
>>371021
Эта тема во многих учебниках, блогах и видеокурсах не освещена, подозреваю их авторы сами не очень разбираются. Потому важно делать те задания, которые даю я например — я всегда рассказываю про sql инъекции и как их избежать.
Анону просто надо использовать PDO и плейсхолдеры вместо подстановки данных.
>>371051
Каждый новый запрос запускает скрипт с нуля, а при заверщении все переменные удаляются, если надо что-то сохранить, используй файлы/сессии/базу данных.
>>371065
Ты неприавльно делаешь. Надо после успешной обработки POST-запроса делать GET-редирект на какую-то страницу (в руби он рельс тоже так принято, странно что ты этого не знаешь).
>>371137
На каждый запрос (на каждую загрузку страницы) скрипт запускается с нуля, а после отдачи страницы в браузер завершается и уничтожает все перемнные. В переменной ты ничего не сохранишь, надо исплоьзовать сессии/файлы/базу данных.
Я PDO рекомендую всем как самую нормальную: http://habrahabr.ru/post/137664/
Можно и mysqli, но она по моему слабее (например нет исключений).
Mysql устарела.
>>370993
Так нам надо, чтобы перебирался не всякий мусор, а только узлы, хранящиеся в NodeList.
>>371013
Если он не выходит, значит else никогад не выполняетя. Сделай вывод значений переменных на каждом шаге и проверь.
>>371021
Эта тема во многих учебниках, блогах и видеокурсах не освещена, подозреваю их авторы сами не очень разбираются. Потому важно делать те задания, которые даю я например — я всегда рассказываю про sql инъекции и как их избежать.
Анону просто надо использовать PDO и плейсхолдеры вместо подстановки данных.
>>371051
Каждый новый запрос запускает скрипт с нуля, а при заверщении все переменные удаляются, если надо что-то сохранить, используй файлы/сессии/базу данных.
>>371065
Ты неприавльно делаешь. Надо после успешной обработки POST-запроса делать GET-редирект на какую-то страницу (в руби он рельс тоже так принято, странно что ты этого не знаешь).
>>371137
На каждый запрос (на каждую загрузку страницы) скрипт запускается с нуля, а после отдачи страницы в браузер завершается и уничтожает все перемнные. В переменной ты ничего не сохранишь, надо исплоьзовать сессии/файлы/базу данных.
>На каждый запрос (на каждую загрузку страницы) скрипт запускается с нуля, а после отдачи страницы в браузер завершается и уничтожает все перемнные. В переменной ты ничего не сохранишь, надо исплоьзовать сессии/файлы/базу данных.
Уважаемый, но как это всё написать? Что мне делать?
С чего начать? Не могу понять какие действия нужно определить для себя, что бы начать выполнять задачу?
Заранее Спасибо за ответ и помощь!
Как мне исправить отсутствие пробела после запятой? Само регулярное выражение подразумевает под собой букву после запятой, соответственно preg_replace будет заменять не только запятую, но и саму букву, а мне нужно вставить между ними пробел, но чтобы буква осталась.
Хотя я уже догадался, нужно было просто заключить 2 части выражения в скобки и заменять на "$1 $2"
Потом хочу вынести добавление записи в отдельную страницу с редиректом обратно.
Есть парочка вопросов:
1)В PDO метод prepare сам экранирует кавычки при именованных/неименованных параметрах?
2)Нормально ли хранить в базе результат htmlspecialchars($_POST['username']) или лучше экранировать html при выводе из базы?
3)Почему нужно устанавливать кодировку с помощью $db->exec("SET NAMES utf8"), ведь в базе и так по идее записи в utf-8 (пикрелейтед).
2. Нет. Когда-нибудь тебе понадобится результат не в HTML (например, JSON для мобильного приложения) или понадобится по тексту в базе пройтись, и ты породишь энциклонгов, или заебешься запоминать, что у тебя экранировано, а что нет. Напиши простейший шаблонизатор, который заботится об экранировании и вне его не вспоминай об HTML вообще никак.
3. Тебе повезло с настройками. На другом сервере может случиться latin1. В PHP >= 5.3.6 можно указать параметр charset в строке подключения, используй его всегда.
>>371275
Спасибо большое.
Чуток переделал:
http://ideone.com/Ymp3Pe - список сообщений
http://ideone.com/sgcmCM - добавление нового
> 3. Тебе повезло с настройками. На другом сервере может случиться latin1. В PHP >= 5.3.6 можно указать параметр charset в строке подключения, используй его всегда.
Я не так сформулировал вопрос. При настройках СУБД как на том пике, всё равно для записей была latin1 может я не ту переменную смотрю.
> Напиши простейший шаблонизатор
Я ещё не настолько разбираюсь в пыхе для этого.
И зачем эти классы имплементируют интерфейс Traversable. Во-первых, он пустой, а во-вторых, мне кажется, достаточно того, что IteratorAggregate и Iterator реализует Traversable.
Мало информации в мануале по этому всему, что можно почитать на понятном языке?
Простейший - это медленный и печальный str_replace %переменных% в шаблоне циклом по массиву. А если вспомнить, что str_replace умеет в массивы, то это целая одна строка кода.
> При настройках СУБД как на том пике, всё равно для записей была latin1
Настройки на пике - свойства текущего соединения. То, что в соединении от консольного клиента у тебя выставлена UTF-8, не значит, что она же будет по умолчанию в соединениях от PDO_MySQL. Поэтому при подключении всегда стоит явно указывать charset (или SET NAMES, если PHP старый). На этом проблемы с кодировками не заканчиваются. На стороне сервера есть кодировка таблиц, она говорит, какой кодировкой "помечены" данные. Когда кодировка соединения отличается от кодировки таблицы, сервер перекодирует данные для тебя, но для этого все кодировки должны соответствовать фактическим кодировкам данных (например, не стоит вставлять данные в кодировке cp1251 при выставленных SET NAMES utf8). Чтобы путаницы было меньше, лучше выставить все в UTF-8: и кодировку таблицы (при создании таблицы или базы), и кодировку соединения при подключении.
Спасибо, разобрался в кодировках.
Не уверен, что ты говорил об этом, но я сделал так нашёл тест, в котором str_replace выполнялся в пять раз медленнее htmlspecialchars:
<code>
$stmt = $db->query('SELECT username, message FROM posts');
while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$username = htmlspecialchars($row['username']);
$message = htmlspecialchars($row['message']);
echo "<div style='margin-bottom: 10px;'>
<div>$username</div>
<div>$message</div>
</div>";
}
</code>
Оп, я продолжаю выполнять задачи по javascript. По ссылке выше все задачи. Хотел еще разметкой markdown форматировать текст, пока почему-то не вышло.
3 и 4 задача: http://jsbin.com/xamerora/3/edit?js,console
>А, еще, сделай тогда, чтобы в качестве counter() можно было указать функцию с аргументами, и при вызове
>squareCounter(1, 2, 100);
>Эти аргументы бы передавались функции counter(). Аргументов может быть любое количество.
Но вот это не знаю как сделать, хотя скорее не понял задание.
> Не уверен, что ты говорил об этом
Я говорил о том, что желательно вызывать htmlspecialchars в одном месте, а не в десяти, потому что когда-нибудь ты забудешь про экранирование, и твой сайт взломают. Например, можно сделать так сейчас местные закидают меня говном, но я пытался проиллюстрировать суть, а не написать годный код http://ideone.com/W7iBFX
http://jsbin.com/nakezodi/2/edit?js,console
5 задача. Вроде и работает, но я все равно не понимаю как. И еще не знаю как сделать функцию partial, применимую для любого количества аргументов. Если бы можно было как-то циклом добавлять аргументы по одному.
Спасибо, что столько написал, идею понял.
function partial(fn) {
var arg = Array.prototype.slice.call(arguments, 1);
return function() {
arg.concat(Array.prototype.slice.call(arguments));
return fn.apply(NULL, arg);
}
}
Что-то типа этого. На работоспособность, впрочем, не проверял.
1) PHP
2) Ставим Апач, изучаем основы HTML (HTML — язык разметки, который позволяет добавлять в текст теги. Веб-страницы пишутся на HTML), и как PHP можно использовать на сервере
3) Изучаем основы CSS (CSS — язык стилей, задающий оформление и внешний вид элементов на странице), решаем простые задачки на CSS из моего учебника или любого другого
4) Изучаем основы баз данных, например MySQL
5) Делаем задание на файлообменник ( https://gist.github.com/codedokode/9424217 ), заодно изучаем микрофреймворк Slim
5) Изучаем основы JS
6) Если есть пробелы в знаниях, делаем дополнительные задания
7) Изучаем twig
8) Изучаем какой-нибудь большой фреймворк, вроде Symfony 2 или Yii
Вот как-то так. Тебе этого минимум на полгода хватит.
>>370905
Взаимодействие PHP с HTML очень простое. Смотри, ты открываешь страницу в браузере. Браузер по протоколу HTTP связывается с сервером (Апачем), просит дать ему HTML-код страницы. Сервер запускает твой Php скрипт, он работает, что-то выводит, все это отправляется назад в браузер, и он это отображает.
Соответственно, чтобы писать код, надо понимать:
- основы HTTP
- знать сам PHP
- знать основы HTML
Ну и Апач + PHP надо установить.
Вот в мануале есть примеры простых скриптов, выводящих HTML:
https://php.net/manual/ru/tutorial.firstpage.php
Но так можно сделать только самый примитивный скрипт. Для более сложных скриптов и приложений надо во-первых, научиться делать правильную структуру приложения (ООП, MVC, шаблоны, отделение php от html), во-вторых, научиться пользоваться фреймворками, шаблонизаторами. Также надо научиться пользоваться базами данных, так как данные обычно в них хранят. Плюс. там может использоваться яваскрипт. Это довольно-таки большой объем знаний.
Выше я написал один из вариантов изучения.
У нас есть как раз задача — сделать клон файлообменника, используя микрофреймворк Slim. Но для нее надо знать сам PHP, включая ООП, основы баз данных, HTML, CSS. Если ты их не знаешь, то надо все это изучить сначала.
Как иначе ты будешь выполнять это задание? Да, я согласен, получается надо изучить довольно много, на зато на выходе может получиться вполне годный кандидат в джуниоры.
Есть учебники и видеокурсы, где пытаются сократить время, за счет того, что сразу переходят к веб-скриптам. Но когда аноны, учившиеся по таким курсам, приходят в тред, их код выглядит очень печально. там часто бывают ошибки, sql- и xss-уязвимости, они используют устаревшие давно функции, пишут все одной длинной простыней, смешивая в кучу, не умеют плоьзоваться регулярными выражениями. Проще говоря, плохой код. Я не одобряю такие курсы, но они есть и их много. В итоге, если у анона есть желание, я даю советы, как переделать код на нормальный.
> но я имел ввиду, что отстраненно, от всего остального.
Ну так у нас все неспешно и постепенно. Прорешав все перечисленные задачи, анон будет знать язык лучше чем тот, кто прыгает по верхам и переписывает готовый код из видеокурса.
Те же библиотеки и фреймворки, которые используются для написания приложений, требуют хорошего знания языка, ООП, MVC. Для эффективного использования jQuery надо знать JS и DOM.
> А все эти неведомые задачки, я в школе из-за этого перехотел программировать, потому что не мог понять цель.
Я не вижу проблемы. Если задача на твой взгляд элементарная, ты решишь ее за 2 минуты, если сложная — значит, ты слабо знаешь ту или иную тему и стоило бы ее подтянуть путем ее решения.
Если у тебя есть еще какие-то вопросы по поовду работы PHP, задавай, постараюсь ответить.
1) PHP
2) Ставим Апач, изучаем основы HTML (HTML — язык разметки, который позволяет добавлять в текст теги. Веб-страницы пишутся на HTML), и как PHP можно использовать на сервере
3) Изучаем основы CSS (CSS — язык стилей, задающий оформление и внешний вид элементов на странице), решаем простые задачки на CSS из моего учебника или любого другого
4) Изучаем основы баз данных, например MySQL
5) Делаем задание на файлообменник ( https://gist.github.com/codedokode/9424217 ), заодно изучаем микрофреймворк Slim
5) Изучаем основы JS
6) Если есть пробелы в знаниях, делаем дополнительные задания
7) Изучаем twig
8) Изучаем какой-нибудь большой фреймворк, вроде Symfony 2 или Yii
Вот как-то так. Тебе этого минимум на полгода хватит.
>>370905
Взаимодействие PHP с HTML очень простое. Смотри, ты открываешь страницу в браузере. Браузер по протоколу HTTP связывается с сервером (Апачем), просит дать ему HTML-код страницы. Сервер запускает твой Php скрипт, он работает, что-то выводит, все это отправляется назад в браузер, и он это отображает.
Соответственно, чтобы писать код, надо понимать:
- основы HTTP
- знать сам PHP
- знать основы HTML
Ну и Апач + PHP надо установить.
Вот в мануале есть примеры простых скриптов, выводящих HTML:
https://php.net/manual/ru/tutorial.firstpage.php
Но так можно сделать только самый примитивный скрипт. Для более сложных скриптов и приложений надо во-первых, научиться делать правильную структуру приложения (ООП, MVC, шаблоны, отделение php от html), во-вторых, научиться пользоваться фреймворками, шаблонизаторами. Также надо научиться пользоваться базами данных, так как данные обычно в них хранят. Плюс. там может использоваться яваскрипт. Это довольно-таки большой объем знаний.
Выше я написал один из вариантов изучения.
У нас есть как раз задача — сделать клон файлообменника, используя микрофреймворк Slim. Но для нее надо знать сам PHP, включая ООП, основы баз данных, HTML, CSS. Если ты их не знаешь, то надо все это изучить сначала.
Как иначе ты будешь выполнять это задание? Да, я согласен, получается надо изучить довольно много, на зато на выходе может получиться вполне годный кандидат в джуниоры.
Есть учебники и видеокурсы, где пытаются сократить время, за счет того, что сразу переходят к веб-скриптам. Но когда аноны, учившиеся по таким курсам, приходят в тред, их код выглядит очень печально. там часто бывают ошибки, sql- и xss-уязвимости, они используют устаревшие давно функции, пишут все одной длинной простыней, смешивая в кучу, не умеют плоьзоваться регулярными выражениями. Проще говоря, плохой код. Я не одобряю такие курсы, но они есть и их много. В итоге, если у анона есть желание, я даю советы, как переделать код на нормальный.
> но я имел ввиду, что отстраненно, от всего остального.
Ну так у нас все неспешно и постепенно. Прорешав все перечисленные задачи, анон будет знать язык лучше чем тот, кто прыгает по верхам и переписывает готовый код из видеокурса.
Те же библиотеки и фреймворки, которые используются для написания приложений, требуют хорошего знания языка, ООП, MVC. Для эффективного использования jQuery надо знать JS и DOM.
> А все эти неведомые задачки, я в школе из-за этого перехотел программировать, потому что не мог понять цель.
Я не вижу проблемы. Если задача на твой взгляд элементарная, ты решишь ее за 2 минуты, если сложная — значит, ты слабо знаешь ту или иную тему и стоило бы ее подтянуть путем ее решения.
Если у тебя есть еще какие-то вопросы по поовду работы PHP, задавай, постараюсь ответить.
в общие вопросы постить? Правда помогают? Даже если сам вообще ноль в яваскрипте и пришел, так сказать, за готовеньким?
- Yii
- Symfony 2
Но я бы советовал начать с микрофреймворка типа Slim, так как он простой.
>>370917
w3schools к w3c никакого отношения не имеют.
>>370933
> но ведь тогда у нас еще и получаться словосочетания из 2-х слов - глупость и, и отвага.
Да, верно, учитывать отдельно, где находится стоп-слово сложнее, потому я и предлагал их просто вырезать. Тогда сочетания «и отвага» не будет.
> Уже как минимум два применения prevKey и nextKey. Перед этим еще надо проверить что следующее или текущее слово не является стопсловом, что бы не делать словосочетание из двух слов аля "и отвага", что уже 3 применение nextKey.
Можно использовать промежуточные переменные вроде $isStopWord1, но так да, получается запутанно. Потому проще вообще вырезать эти стоп-слова.
Что плохого с вырезанием стоп-слов? Ну найдешь ты «глупость отвага» вместо «глупость и отвага», это по-моему лучше, чем вообще не найти это сочетание. Разве нет?
Конечно в js я еще не умею толком, а на php уже ооп использую. Наверное на js пока заострить внимание? У тебя есть еще в запасе задачи с повышением уровня сложности и использованием нового функционала? Хотелось бы также в голову вдолбить все основы, чтобы js так же въелся в голову, как и php в свое время по твоему учебнику.
Ну так можно найти и цельные словосочетания, содержащие запятую: «Кот, лежавший рядом, вскочил и убежал». Для полноценного ответа на вопрос, как связаны друг с другом слова, надо делать синтаксический анализ предложений:
http://habrahabr.ru/post/148124/
http://habrahabr.ru/company/yandex/blog/219311/
(кстати, блог яндекса на хабре очень годный, вот например статья про еще боле высокоуровневый анализ текста: http://habrahabr.ru/company/yandex/blog/224579/ )
Синтаксический аналих позволяет связывать слова, например, «кот, лежавший рядом» — это связанные слова (кто — что делавший? — лежавший — лежавший где? — рядом), а «рядом, вскочил и убежал» — нет.
То есть, считать что разделенные запятой слова не связаны, не совсем верно. Но если мы тут будем делать полноценный анализ текста, рещать задачу придется о-о-чень долго.
В общем, если хочешь, можешь сделать запятую разделителем фраз, я не против.
> Приклеивать стоп слова(тогда я еще такого слова правда не знал) к словам что идут после них.
Ну да, хорошая идея, только приклеивать надо именно предлоги, и, может, какие-то частицы, а не все стоп-слова (например, слово «мы» приклеивать не надо).
Не совсем.
У тебя когда долг маленький, не начисляются проценты. То есть если осталось допустим 9000 долга и анон заплатил 5000, на оставшиеся 4000 не начисляются проценыт в следующем месяце.
Ответ должен быть примерно 61270.
>>370964
Написать скрипт, который при получении запроса нужного вида делает запись в БД. Вот, почитай про работу с формами например:
http://php.net/manual/ru/tutorial.forms.php
http://php.net/manual/ru/language.variables.external.php
>>370990
Да что-то я не совсем уверен, что подойдет.
>>370991
Это sql-инъекция:
http://habrahabr.ru/post/148151/
http://habrahabr.ru/post/148701/
Надо не подставлять переменные напрямую, а использовать плейсхолдеры.
>>370993
Это не то, что требуется в задании, надо перебирать не свойства объекта, а хранящиеся в списке узлы.
>>371021
Цыц
>>371049
> Но я не могу понять, как мне выделить какая из них латинская?
С помощью регулярки и preg_replace заменить латинские буквы на латинские буквы в скобках.
>>371051
> Банальный пример: Поле инпут текст и инпут сабмит. Нужно чтобы написанный текст появлялся как абзац вначале страницы
Если надо накапливать введенные текст, то его где-то надо хранить, в файле, базе данных или сессии. Каждый раз скрипт запускается с нуля и никаких переменных не сохраняется.
> Хотелось бы почитать именно о таком аспекте языка, как он вообще работает,
Браузер по протоколу HTTP отправляет запрос на сервер, сервер запускает PHP скрипт и то, что он выводит, отдает назад в браузер. Отдельно есть функции для работы с HTTP-заголовками (header) и куками (setcookie). Пришедший запрос автоматически парсится и данные кладутся в глобальные массивы _GET/_POST/_COOKIE/_REQUEST/_SERVER, описание в мануале.
> авторизацию
На сессиях. Если пользователь ввел приавльные логинпароль, кладешь его id в сессию. Правда, сессии умирают через 15 минут неактивности. отому стоит дополнительно поставить авторизационные куки для автоматического залогинивания. мануал: http://php.net/manual/ru/features.sessions.php
Не любишь сессии? Используй просто куки.
Не знаешь, что такое куки? Изучи сначала основы протокола HTTP.
> записи, и всякую динамику.
C исользованием базы данных, например, MySQL. Сборник ссылок для изучения: https://gist.github.com/codedokode/10539213 + задачка бонусом.
Не совсем.
У тебя когда долг маленький, не начисляются проценты. То есть если осталось допустим 9000 долга и анон заплатил 5000, на оставшиеся 4000 не начисляются проценыт в следующем месяце.
Ответ должен быть примерно 61270.
>>370964
Написать скрипт, который при получении запроса нужного вида делает запись в БД. Вот, почитай про работу с формами например:
http://php.net/manual/ru/tutorial.forms.php
http://php.net/manual/ru/language.variables.external.php
>>370990
Да что-то я не совсем уверен, что подойдет.
>>370991
Это sql-инъекция:
http://habrahabr.ru/post/148151/
http://habrahabr.ru/post/148701/
Надо не подставлять переменные напрямую, а использовать плейсхолдеры.
>>370993
Это не то, что требуется в задании, надо перебирать не свойства объекта, а хранящиеся в списке узлы.
>>371021
Цыц
>>371049
> Но я не могу понять, как мне выделить какая из них латинская?
С помощью регулярки и preg_replace заменить латинские буквы на латинские буквы в скобках.
>>371051
> Банальный пример: Поле инпут текст и инпут сабмит. Нужно чтобы написанный текст появлялся как абзац вначале страницы
Если надо накапливать введенные текст, то его где-то надо хранить, в файле, базе данных или сессии. Каждый раз скрипт запускается с нуля и никаких переменных не сохраняется.
> Хотелось бы почитать именно о таком аспекте языка, как он вообще работает,
Браузер по протоколу HTTP отправляет запрос на сервер, сервер запускает PHP скрипт и то, что он выводит, отдает назад в браузер. Отдельно есть функции для работы с HTTP-заголовками (header) и куками (setcookie). Пришедший запрос автоматически парсится и данные кладутся в глобальные массивы _GET/_POST/_COOKIE/_REQUEST/_SERVER, описание в мануале.
> авторизацию
На сессиях. Если пользователь ввел приавльные логинпароль, кладешь его id в сессию. Правда, сессии умирают через 15 минут неактивности. отому стоит дополнительно поставить авторизационные куки для автоматического залогинивания. мануал: http://php.net/manual/ru/features.sessions.php
Не любишь сессии? Используй просто куки.
Не знаешь, что такое куки? Изучи сначала основы протокола HTTP.
> записи, и всякую динамику.
C исользованием базы данных, например, MySQL. Сборник ссылок для изучения: https://gist.github.com/codedokode/10539213 + задачка бонусом.
Ты не понял. Надо не поменять POST на GET. надо после успешной обработки POSt-запроса делать редирект вместо вывода данных, чтобы бразуер загрузил обновленную страницу через GET.
>>371074
Ты что-то делаешь неправильно.
>>371165
Ну во-первых, это можно сделать на HTML без PHP. Ты можешь сделать 2 страницы, «не работает» и «работает» и ссылку, которая при клике переходит на вторую страницу.
Если делать на PHP, то надо делать по-другому:
1-й скрипт вывода данных:
- загрузить значение переменной из файла или сессии
- вывести
2-й скрипт, который запускаетс при клике по ссылке и меняет это значение:
- сохранить новое значение в сессию/файл
- редиректим на первый скрипт
>>371170
Начать можно с установки Апача (если он не установлен), у меня есть паста: https://gist.github.com/codedokode/10774100
Также, придется разобраться с mod_rewrite: http://habrahabr.ru/company/sprinthost/blog/129560/
А вообще, там по сути 2 части:
- первая часть генериурет ссылку на картинке
- вторая генерирует картинку по ссылке и кладет ее так, чтобы в следующий раз картинка отдавалась без запуска скрипта
Ты не понял. Надо не поменять POST на GET. надо после успешной обработки POSt-запроса делать редирект вместо вывода данных, чтобы бразуер загрузил обновленную страницу через GET.
>>371074
Ты что-то делаешь неправильно.
>>371165
Ну во-первых, это можно сделать на HTML без PHP. Ты можешь сделать 2 страницы, «не работает» и «работает» и ссылку, которая при клике переходит на вторую страницу.
Если делать на PHP, то надо делать по-другому:
1-й скрипт вывода данных:
- загрузить значение переменной из файла или сессии
- вывести
2-й скрипт, который запускаетс при клике по ссылке и меняет это значение:
- сохранить новое значение в сессию/файл
- редиректим на первый скрипт
>>371170
Начать можно с установки Апача (если он не установлен), у меня есть паста: https://gist.github.com/codedokode/10774100
Также, придется разобраться с mod_rewrite: http://habrahabr.ru/company/sprinthost/blog/129560/
А вообще, там по сути 2 части:
- первая часть генериурет ссылку на картинке
- вторая генерирует картинку по ссылке и кладет ее так, чтобы в следующий раз картинка отдавалась без запуска скрипта
>>371340
> Соответственно, чтобы писать код, надо понимать:
> - основы HTTP
> - знать сам PHP
> - знать основы HTML
> Ну и Апач + PHP надо установить.
> Вот в мануале есть примеры простых скриптов, выводящих HTML:
Проблема в том что я не знаю этих мостов, между хтмл и пхп. Если бы не тот firstpage я бы даже не въехал как это делается через формы и имена. Я же когда про хтмл читал, там написано про статичные страницы, это ж хтмл. В пхп написано про типы данных, функции, выражения. А именно сам мост где-то в мануале запрятан. В целом уже не так актуально, я сделав двустрочный быдло-несовсемчат понял, что проблемы не такие абстрактные и в большинстве вполне вбиваемые в гугл. Мануал крут, но иногда в нем хрен что найдешь, дальше базовых знаний (примерно те же что на ОПсайте) там категории начитают непонятно классифицироваться. Кароче нужно мастерство вбивания в гугл запросов.
хтмл и ксс в принципе учить особо бесполезно. Я все команды забыл, но прочту и опять забуду, а какие есть я помню, надо просто гуглить названия.
> Я не вижу проблемы. Если задача на твой взгляд элементарная, ты решишь ее за 2 минуты, если сложная — значит, ты слабо знаешь ту или иную тему и стоило бы ее подтянуть путем ее решения.
Мне близок быдло-подход. Пытать сделать полноценную вещь имея в итоге кривое гавно еле работающее и с постоянными ошибками и уязвимостями. Но приятно что ты что-то сделал. Потом переписывать все двести раз целиком и накручивая и приводя в порядок свой стиль кода. Не говорю что это круто, просто я не умею медленно и уверенно. Могу быстро и криво, и хоть в итоге выйдет дольше чем если б я все сделал постепенно. Хотя я б все нахер послал.
Ситуацию примерно понимаю хтмл ксс совсем все ясно. хттп - язык запросов, как он работает только догадываюсь, прочтем. базы данных в виде попсовой mySQL где хранятся, внезапно, данные, изучим. По жаваскрипту вопрос, относительно пхп и бек-энда важен сам js или фреймворки (jquery, если я не путаю)? Ясное дело основы самого js надо знать, но основная польза будет от jquery как я понял?
И сам пхп:
> У нас есть как раз задача — сделать клон файлообменника, используя микрофреймворк Slim. Но для нее надо знать сам PHP, включая ООП, основы баз данных, HTML, CSS. Если ты их не знаешь, то надо все это изучить сначала.
Какие собственно фреймворки базовые? Маст хев, маст ноу прям. Я прям сейчас не собираюсь на них наваливаться, запишу там на руке себе.
Вроде ничего не забыл?
Я не так уж бешено нелинейно все учу как может казаться, просто пока учу пхп, так-же собираю картину в целом.
>>371340
> Соответственно, чтобы писать код, надо понимать:
> - основы HTTP
> - знать сам PHP
> - знать основы HTML
> Ну и Апач + PHP надо установить.
> Вот в мануале есть примеры простых скриптов, выводящих HTML:
Проблема в том что я не знаю этих мостов, между хтмл и пхп. Если бы не тот firstpage я бы даже не въехал как это делается через формы и имена. Я же когда про хтмл читал, там написано про статичные страницы, это ж хтмл. В пхп написано про типы данных, функции, выражения. А именно сам мост где-то в мануале запрятан. В целом уже не так актуально, я сделав двустрочный быдло-несовсемчат понял, что проблемы не такие абстрактные и в большинстве вполне вбиваемые в гугл. Мануал крут, но иногда в нем хрен что найдешь, дальше базовых знаний (примерно те же что на ОПсайте) там категории начитают непонятно классифицироваться. Кароче нужно мастерство вбивания в гугл запросов.
хтмл и ксс в принципе учить особо бесполезно. Я все команды забыл, но прочту и опять забуду, а какие есть я помню, надо просто гуглить названия.
> Я не вижу проблемы. Если задача на твой взгляд элементарная, ты решишь ее за 2 минуты, если сложная — значит, ты слабо знаешь ту или иную тему и стоило бы ее подтянуть путем ее решения.
Мне близок быдло-подход. Пытать сделать полноценную вещь имея в итоге кривое гавно еле работающее и с постоянными ошибками и уязвимостями. Но приятно что ты что-то сделал. Потом переписывать все двести раз целиком и накручивая и приводя в порядок свой стиль кода. Не говорю что это круто, просто я не умею медленно и уверенно. Могу быстро и криво, и хоть в итоге выйдет дольше чем если б я все сделал постепенно. Хотя я б все нахер послал.
Ситуацию примерно понимаю хтмл ксс совсем все ясно. хттп - язык запросов, как он работает только догадываюсь, прочтем. базы данных в виде попсовой mySQL где хранятся, внезапно, данные, изучим. По жаваскрипту вопрос, относительно пхп и бек-энда важен сам js или фреймворки (jquery, если я не путаю)? Ясное дело основы самого js надо знать, но основная польза будет от jquery как я понял?
И сам пхп:
> У нас есть как раз задача — сделать клон файлообменника, используя микрофреймворк Slim. Но для нее надо знать сам PHP, включая ООП, основы баз данных, HTML, CSS. Если ты их не знаешь, то надо все это изучить сначала.
Какие собственно фреймворки базовые? Маст хев, маст ноу прям. Я прям сейчас не собираюсь на них наваливаться, запишу там на руке себе.
Вроде ничего не забыл?
Я не так уж бешено нелинейно все учу как может казаться, просто пока учу пхп, так-же собираю картину в целом.
> $reg="/[^а-яa-z,][\\s]/ui";
> $text=preg_replace($reg, "", $text);
Это странное место. Оно например удалит все числа. Также, букву «ё» удалит так как в юникоде она идет отдельно и не попадает в диапазон а-я (надо писать [а-яё] чтобы это учесть).
[\\s] равносильно \\s
[,] равносильно просто ,
Ну и код надо бы пропстить через phpformatter (второй пост треда: >>369683 )
>>371260
> 1)В PDO метод prepare сам экранирует кавычки при именованных/неименованных параметрах?
Да, он заменяет ' на \' , а также другие символы, например \ заменяется на \\, в зависимости от того, как принято в той или иной БД.
> Нормально ли хранить в базе результат htmlspecialchars($_POST['username'])
Нет, но так делают, но это влечет баги вроде двойного кодирования html-сущностей
> или лучше экранировать html при выводе из базы?
да. Шаблонизаторы типа twig умеют делать это автоматически.
> Почему нужно устанавливать кодировку с помощью $db->exec("SET NAMES utf8"), ведь в базе и так по идее записи в utf-8 (пикрелейтед).
Это кодировка соединения между PHP и базой. То есть в какой кодировке данные передаются и принимаются. подробнее:
http://gahcep.github.io/blog/2013/01/05/mysql-utf8/
http://phpfaq.ru/charset
Если ты работаешь из виндовой консоли с базой, надо ставить кодировку соединения cp866 так как именно в ней консоль принимает и выводит символы на экран. Если из линуксовой/маковой консоли то utf8. В твоем случае видимо линукс, там всюду по умолчанию стоит utf8 и проблем нет. Разве что у тебя server и database стоят неправильные кодировки.
По коду: после обработки POST надо делать редирект. Необязательно для этого делать 2 скрипта. Ну и код так себе, зачем все смешивать в кучу когда можно сделать php отдельно, html отдельно:
http://true-coder.ru/php/razdelenie-koda-i-shablona-mvc-chast-1.html
http://phpfaq.ru/tpl
При ошибке надо выводить форму с данными и сообщение об ошибке, а не молча показывать пустую страницу.
> $reg="/[^а-яa-z,][\\s]/ui";
> $text=preg_replace($reg, "", $text);
Это странное место. Оно например удалит все числа. Также, букву «ё» удалит так как в юникоде она идет отдельно и не попадает в диапазон а-я (надо писать [а-яё] чтобы это учесть).
[\\s] равносильно \\s
[,] равносильно просто ,
Ну и код надо бы пропстить через phpformatter (второй пост треда: >>369683 )
>>371260
> 1)В PDO метод prepare сам экранирует кавычки при именованных/неименованных параметрах?
Да, он заменяет ' на \' , а также другие символы, например \ заменяется на \\, в зависимости от того, как принято в той или иной БД.
> Нормально ли хранить в базе результат htmlspecialchars($_POST['username'])
Нет, но так делают, но это влечет баги вроде двойного кодирования html-сущностей
> или лучше экранировать html при выводе из базы?
да. Шаблонизаторы типа twig умеют делать это автоматически.
> Почему нужно устанавливать кодировку с помощью $db->exec("SET NAMES utf8"), ведь в базе и так по идее записи в utf-8 (пикрелейтед).
Это кодировка соединения между PHP и базой. То есть в какой кодировке данные передаются и принимаются. подробнее:
http://gahcep.github.io/blog/2013/01/05/mysql-utf8/
http://phpfaq.ru/charset
Если ты работаешь из виндовой консоли с базой, надо ставить кодировку соединения cp866 так как именно в ней консоль принимает и выводит символы на экран. Если из линуксовой/маковой консоли то utf8. В твоем случае видимо линукс, там всюду по умолчанию стоит utf8 и проблем нет. Разве что у тебя server и database стоят неправильные кодировки.
По коду: после обработки POST надо делать редирект. Необязательно для этого делать 2 скрипта. Ну и код так себе, зачем все смешивать в кучу когда можно сделать php отдельно, html отдельно:
http://true-coder.ru/php/razdelenie-koda-i-shablona-mvc-chast-1.html
http://phpfaq.ru/tpl
При ошибке надо выводить форму с данными и сообщение об ошибке, а не молча показывать пустую страницу.
> Ты что-то делаешь неправильно.
Я, собственно это сделал:
> после успешной обработки POSt-запроса делать редирект вместо вывода данных
Вместо пост гет поставил, как посоветовал анон, Я же правильно понял, он станет тру, когда отправляется. По крайней мере это работает, более-менее. Или все же не так нужно?
Сделай html отдельно. И может быть, я бы php-код еще ращбил на функции.
> $db = new PDO('mysql:host=127.0.0.1;dbname=testdb;charset=UTF8', $user, $password);
Это копипаста, надо избавиться
> <!DOCTYPE HTML>
Это копиаста, надо от нее избаивться, например вынести шапку в файл и инклудить.
> echo "<div style='margin-bottom: 10px;'>
Выводить html-код через echo плохо и неудобно. Лучше делать как тут: http://php.net/manual/ru/language.basic-syntax.phpmode.php
Шаблонизатор писать не нужно, он встроен в PHP, можно делать так:
<h1>Моя страница</h1>
<p>Имя: <?= htmlspecialchars($name, ENT_QUOTES) ?></p>
<div>Текст: <?= htmlspecialchars($text, ENT_QUOTES) ?></div>
Для PDO надо включить режим ERRMODE_EXCEPTION, чтобы ошибки в БД вызывали исключение. А то ты о них и не узнаешь.
Надо сделать обработку ошибок (пустые поля).
>>371281
Это вообще что-то другое. Вот тут: http://technosophos.com/2009/05/29/set-objects-php-arrays-vs-splobjectstorage.html написано что это можно исплоьзовать как множество для объектов ( http://ru.wikipedia.org/wiki/%D0%9C%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%BE_(%D1%82%D0%B8%D0%BF_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85) ). Множество — это структура данных, которая позволяет ответить на вопрос, есть ли значение в множестве или нет.
То есть ты можешь класть туда объекты (attach), а потом проверять, есть ли такой объект в множестве или нет (contains). Множества можно объединять через addAll и исключать через removeAllExcept.
Также, можно использовать SplObjectStorage как массив, у которого ключами являются объекты (в обычных массивах ключ может быть только число или строка).
> Он такие же интерфейсы имплементирует,
Так эта штука для других целей предназаначена. То, что она что-то имплементирует не значит что она годится для хранения спиcка DOM узлов. Тебе подходит либо наследник ArrayObject либо свой с нуля написанный класс.
> И зачем эти классы имплементируют интерфейс Traversable. Во-первых, он пустой, а во-вторых, мне кажется, достаточно того, что IteratorAggregate и Iterator реализует Traversable.
Встроенные в PHP классы могут сделать поддержку foreach без использования Iterator/IteratorAggregate, внутренними методами, и потому Traversable исплоьзуется чтобы показать что эта поддержка есть. То есть Traversable — это только для внутренних классов, ты его реализовать не можешь.
> Мало информации в мануале по этому всему, что можно почитать на понятном языке?
Погуглить можно, это все новое, и в учебниках не описано, разве что где-то в блогах или на stackoverflow. Или в нашем треде спросить можно.
Сделай html отдельно. И может быть, я бы php-код еще ращбил на функции.
> $db = new PDO('mysql:host=127.0.0.1;dbname=testdb;charset=UTF8', $user, $password);
Это копипаста, надо избавиться
> <!DOCTYPE HTML>
Это копиаста, надо от нее избаивться, например вынести шапку в файл и инклудить.
> echo "<div style='margin-bottom: 10px;'>
Выводить html-код через echo плохо и неудобно. Лучше делать как тут: http://php.net/manual/ru/language.basic-syntax.phpmode.php
Шаблонизатор писать не нужно, он встроен в PHP, можно делать так:
<h1>Моя страница</h1>
<p>Имя: <?= htmlspecialchars($name, ENT_QUOTES) ?></p>
<div>Текст: <?= htmlspecialchars($text, ENT_QUOTES) ?></div>
Для PDO надо включить режим ERRMODE_EXCEPTION, чтобы ошибки в БД вызывали исключение. А то ты о них и не узнаешь.
Надо сделать обработку ошибок (пустые поля).
>>371281
Это вообще что-то другое. Вот тут: http://technosophos.com/2009/05/29/set-objects-php-arrays-vs-splobjectstorage.html написано что это можно исплоьзовать как множество для объектов ( http://ru.wikipedia.org/wiki/%D0%9C%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%BE_(%D1%82%D0%B8%D0%BF_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85) ). Множество — это структура данных, которая позволяет ответить на вопрос, есть ли значение в множестве или нет.
То есть ты можешь класть туда объекты (attach), а потом проверять, есть ли такой объект в множестве или нет (contains). Множества можно объединять через addAll и исключать через removeAllExcept.
Также, можно использовать SplObjectStorage как массив, у которого ключами являются объекты (в обычных массивах ключ может быть только число или строка).
> Он такие же интерфейсы имплементирует,
Так эта штука для других целей предназаначена. То, что она что-то имплементирует не значит что она годится для хранения спиcка DOM узлов. Тебе подходит либо наследник ArrayObject либо свой с нуля написанный класс.
> И зачем эти классы имплементируют интерфейс Traversable. Во-первых, он пустой, а во-вторых, мне кажется, достаточно того, что IteratorAggregate и Iterator реализует Traversable.
Встроенные в PHP классы могут сделать поддержку foreach без использования Iterator/IteratorAggregate, внутренними методами, и потому Traversable исплоьзуется чтобы показать что эта поддержка есть. То есть Traversable — это только для внутренних классов, ты его реализовать не можешь.
> Мало информации в мануале по этому всему, что можно почитать на понятном языке?
Погуглить можно, это все новое, и в учебниках не описано, разве что где-то в блогах или на stackoverflow. Или в нашем треде спросить можно.
По поводу traversable, то что я написал, есть в мануале: http://php.net/manual/ru/class.traversable.php — он предназначен для внутренних классов, только для своих, а не для всех.
>>371283
Не надо нам str_replace. Простейший шаблонизатор встроен в PHP и требует 0 строк кода а возможностей у него больше.
Там есть такие кодировки:
- кодировка соединения
- кодировка таблицы (у каждой мб своя), по умолчанию = кодировке БД
- кодировка колонки, по умолчанию = кодировке таблицы
- кодировка базы данных, определяет кодировку таблиц по умолчанию
- кодировка сервера, определяет кодировку создаваемой БД по умолчанию
>>371288
> ашёл тест, в котором str_replace выполнялся в пять раз медленнее
Это не имеет никакого значения
>>371297
> htmlspecialchars($value, ENT_COMPAT,
Так ты не экранируешь одиночные кавычки и возможна XSS в аттрибутах: <input value='%text%'>. Надо ENT_QUOTES.
А вообще, твой подход имеет недостатки. Смотри, допустим мы передаем в шаблон объект и там вызвыаем его метод:
<?= $user->getName() ?>
Как ты это заэкранируешь со своим подходом? Также, у тебя не экранируются элемнты массивов. Не экранируется результат вызова функций (а впрочем твой шаблонизатор их и не позволяет вызывать, это тоже плохо). Как в твоем шаблонизаторе обрезать длинную строку:
<?= truncate($name, 20) ?>
Правильно использовать шаблонизатор с автоэскейпингом, например twig, который делает htmlspecialchars для всех выводимых данных при выводе. И умеет еще много чего. B писать велосипед не придется.
> return str_replace(array_keys($replacements), array_values($replacements),
Тут проще использовать strtr()
По поводу traversable, то что я написал, есть в мануале: http://php.net/manual/ru/class.traversable.php — он предназначен для внутренних классов, только для своих, а не для всех.
>>371283
Не надо нам str_replace. Простейший шаблонизатор встроен в PHP и требует 0 строк кода а возможностей у него больше.
Там есть такие кодировки:
- кодировка соединения
- кодировка таблицы (у каждой мб своя), по умолчанию = кодировке БД
- кодировка колонки, по умолчанию = кодировке таблицы
- кодировка базы данных, определяет кодировку таблиц по умолчанию
- кодировка сервера, определяет кодировку создаваемой БД по умолчанию
>>371288
> ашёл тест, в котором str_replace выполнялся в пять раз медленнее
Это не имеет никакого значения
>>371297
> htmlspecialchars($value, ENT_COMPAT,
Так ты не экранируешь одиночные кавычки и возможна XSS в аттрибутах: <input value='%text%'>. Надо ENT_QUOTES.
А вообще, твой подход имеет недостатки. Смотри, допустим мы передаем в шаблон объект и там вызвыаем его метод:
<?= $user->getName() ?>
Как ты это заэкранируешь со своим подходом? Также, у тебя не экранируются элемнты массивов. Не экранируется результат вызова функций (а впрочем твой шаблонизатор их и не позволяет вызывать, это тоже плохо). Как в твоем шаблонизаторе обрезать длинную строку:
<?= truncate($name, 20) ?>
Правильно использовать шаблонизатор с автоэскейпингом, например twig, который делает htmlspecialchars для всех выводимых данных при выводе. И умеет еще много чего. B писать велосипед не придется.
> return str_replace(array_keys($replacements), array_values($replacements),
Тут проще использовать strtr()
> Так ты не экранируешь одиночные кавычки и возможна XSS в аттрибутах: <input value='%text%'>. Надо ENT_QUOTES.
А разве при PDO prepare апострофы не экранируются? И как выполнится XSS, ведь угловые скобки заэкранированы.
И спасибо большое тебе ОП, ты такая няшка.
> Хотел еще разметкой markdown форматировать текст
Чтобы это работало надо файлу давать расширение md или поставить тип файла markdown когда загружаешь.
Есть сайты где можно писать markdown и смотреть результат:
http://markdownlivepreview.com/
http://dillinger.io/ (аж с подсветкой)
http://markable.in/editor/
> Но вот это не знаю как сделать, хотя скорее не понял задание.
В JS функции можно передать любое число аргументов (и больше, и меньше чем положено). В таких случаях с ними можно работать через псевдопеременную arguments: http://learn.javascript.ru/arguments-pseudoarray
Вот тебе мини-задача: сделай функцию, которая возвращает массив своих аргументов:
console.log(argsAsArray(1, 2, "oh", null, 3)); // [1, 2, "oh", null, 3]
Возвращать надо именно массив, а не псевдомассив arguments.
> function map(square, array) {
Функция не должна менять исходный массив, а должна создавать новый (в JS когда ты передаешь массив в функцию, он передается по ссылке, меняя его ты меняешь и исходный массив, в отличие от PHP где передается копия).
Посмртри сам: http://jsbin.com/xamerora/4/edit
Остальное верно.
Кстати, метод map есть в новых версиях яваскрипта и новых браузерах: http://learn.javascript.ru/array-iteration
Кстати, больше всяких хитрых методов для работы с функциями и массивами есть в библиотеке lodash (наследнике underscore.js ). Думаю, мы еще попишем их аналоги.
> Хотел еще разметкой markdown форматировать текст
Чтобы это работало надо файлу давать расширение md или поставить тип файла markdown когда загружаешь.
Есть сайты где можно писать markdown и смотреть результат:
http://markdownlivepreview.com/
http://dillinger.io/ (аж с подсветкой)
http://markable.in/editor/
> Но вот это не знаю как сделать, хотя скорее не понял задание.
В JS функции можно передать любое число аргументов (и больше, и меньше чем положено). В таких случаях с ними можно работать через псевдопеременную arguments: http://learn.javascript.ru/arguments-pseudoarray
Вот тебе мини-задача: сделай функцию, которая возвращает массив своих аргументов:
console.log(argsAsArray(1, 2, "oh", null, 3)); // [1, 2, "oh", null, 3]
Возвращать надо именно массив, а не псевдомассив arguments.
> function map(square, array) {
Функция не должна менять исходный массив, а должна создавать новый (в JS когда ты передаешь массив в функцию, он передается по ссылке, меняя его ты меняешь и исходный массив, в отличие от PHP где передается копия).
Посмртри сам: http://jsbin.com/xamerora/4/edit
Остальное верно.
Кстати, метод map есть в новых версиях яваскрипта и новых браузерах: http://learn.javascript.ru/array-iteration
Кстати, больше всяких хитрых методов для работы с функциями и массивами есть в библиотеке lodash (наследнике underscore.js ). Думаю, мы еще попишем их аналоги.
У тебя она работает ровно с 2 закрепленными аргументами, а надо с любым числом. Используй псевдомассив-псевдопеременную arguments (псевдо потому, что это на самом деле не переменная и не массив).
>>371320
Лучше fn.apply(this, args) чтобы this сохранялось.
>>371324
Ну так мы эту библиотеку понемногу и переписываем.
>>371332
Попробуй нагуглить, есть наверняка готовый плагин, я уверен.
>>371345
На том, что по работе нужно. Давай тогда JS активнее изучай, там еще есть веселая тема «прототипы» и ООП. А у нас есть задание написать игру арканоид (впрочем, это тоже можно потом сделать).
> У тебя есть еще в запасе задачи с повышением уровня сложности и использованием нового функционала?
Придумаем, не проблема. Давай сначала замыкания и вызов функций домучаем, а потом перейдем к прототипам, на которых пал смертью храбрых не один программист (они сложнее замыканий). Но они нужны так как ООП, точнее классов, в JS нет, а есть только их имитация на прототипах.
>>371346
Стоит, чтобы научиться.
У тебя она работает ровно с 2 закрепленными аргументами, а надо с любым числом. Используй псевдомассив-псевдопеременную arguments (псевдо потому, что это на самом деле не переменная и не массив).
>>371320
Лучше fn.apply(this, args) чтобы this сохранялось.
>>371324
Ну так мы эту библиотеку понемногу и переписываем.
>>371332
Попробуй нагуглить, есть наверняка готовый плагин, я уверен.
>>371345
На том, что по работе нужно. Давай тогда JS активнее изучай, там еще есть веселая тема «прототипы» и ООП. А у нас есть задание написать игру арканоид (впрочем, это тоже можно потом сделать).
> У тебя есть еще в запасе задачи с повышением уровня сложности и использованием нового функционала?
Придумаем, не проблема. Давай сначала замыкания и вызов функций домучаем, а потом перейдем к прототипам, на которых пал смертью храбрых не один программист (они сложнее замыканий). Но они нужны так как ООП, точнее классов, в JS нет, а есть только их имитация на прототипах.
>>371346
Стоит, чтобы научиться.
> хттп - язык запросов,
Протокол, если точнее. Про него можно почитать в вики например.
> важен сам js или фреймворки (jquery, если я не путаю)
Как ты будешь пользоваться jquery не зная JS/DOM/events? Если это обертка над DOM и Events?
Фреймворки — Yii, Symfony 2.
>>371353
Перечитай внимательно, что я написал:
> после успешной обработки POSt-запроса делать редирект вместо вывода данных
Я не писал «заменить пост на гет». А за анона я не отвечаю, не знаю, что он имел в виду. По моему он то же самое хотел посоветовать.
>>371356
Когда ты пишешь
INSERT ... '\''
То в базу вставляется не \' а просто '
Экранирование нужно для передачи данных из PHP в базу, в базе они хранятся в исходном виде до экранирования (что нам и надо). То есть база разэкранирует их обратно. Экранирование нужно потому что иначе базе непонятно, что значит кавычка — конец строки или это кавычка в тексте?
И даже если ты заменил бы ' на \' это не защитит от XSS так как для браузера бекслеш ничего не значит и не экранирует — там надо использовать 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 для экранирования символов.
Поэтому важно понимать эти механимы, иначе уязвимость остается.
> хттп - язык запросов,
Протокол, если точнее. Про него можно почитать в вики например.
> важен сам js или фреймворки (jquery, если я не путаю)
Как ты будешь пользоваться jquery не зная JS/DOM/events? Если это обертка над DOM и Events?
Фреймворки — Yii, Symfony 2.
>>371353
Перечитай внимательно, что я написал:
> после успешной обработки POSt-запроса делать редирект вместо вывода данных
Я не писал «заменить пост на гет». А за анона я не отвечаю, не знаю, что он имел в виду. По моему он то же самое хотел посоветовать.
>>371356
Когда ты пишешь
INSERT ... '\''
То в базу вставляется не \' а просто '
Экранирование нужно для передачи данных из PHP в базу, в базе они хранятся в исходном виде до экранирования (что нам и надо). То есть база разэкранирует их обратно. Экранирование нужно потому что иначе базе непонятно, что значит кавычка — конец строки или это кавычка в тексте?
И даже если ты заменил бы ' на \' это не защитит от XSS так как для браузера бекслеш ничего не значит и не экранирует — там надо использовать 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 для экранирования символов.
Поэтому важно понимать эти механимы, иначе уязвимость остается.
> Перечитай внимательно, что я написал:
> > после успешной обработки POSt-запроса делать редирект вместо вывода данных
> Я не писал «заменить пост на гет». А за анона я не отвечаю, не знаю, что он имел в виду. По моему он то же самое хотел посоветовать.
Я криво написал, я имел ввиду что именно это и сделал через if собственно. то бишь
if($_POST) {
header('Location: http://...');
}
Вроде работает. Так правильно? Или криво?
а можешь объяснить что от него меняется, в конкретно этом случае? А то я из мануала плохо понял.
В данном случае он нужен, чтобы остановить работу скрипта и не выполнять остальной пхп-код.
а ну тогда понятно почему ничего не изменилось, он и так в конце кода.
Допустим, есть две категории материалов - новости и товары. Отображать они должны по-разному - новости просто текст, товары - еще набор картинок, кнопочка "купить" и так далее.
Так вот, такой вопрос. Я понимаю, что нужно делать альтернативные макеты com_content для таких случаев. Но альтернативный макет нельзя назначить, если пункт меню имеет тип "Список материалов категории" или "Блог категории", а он, разумеется, именно такой тип и имеет (список товаров, список новостей). Так что же делать?
И попутно вопрос, как реализовать привязку многих картинок к материалу? Недавно надо было решить этот вопрос, и я не нашел ничего лучше, кроме как залезть в ядро и добавить дополнительные поля материала (читай, обновлять джумлу теперь нельзя). Плагина какого-нибудь годного не нашел для такого дела, возможно, плохо искал.
Вот собственно как я реализовывал разделение макетов для новостей и товаров - если эти дополнительные поля заполнены, то вывожу как товар, если нет, то как новость. Но это же пиздец какой костыль.
И еще один вопрос, стоит ли вообще задрачивать джумлу, пробовал virtuemart и все такое? Или лучше дрочить именно кодинг на пхп, всякие там шаблоны проектирования и прочее? Или лучше вообще в джаву уйти?
>стоит ли вообще задрачивать джумлу
Нет, лучше выучить популярный MVC-фреймворк типа Zend, Yii, Simfony, Laravel
Получай сертификат и делай все то же самое, только за большие деньги.
Сам недавно столкнулся с джумлой на работе. Ну там можно сделать привязку разных шаблонов к разным страницам. А так если интернет магазин, то virtuemart есть. Но там все не так удобно, т.е. создаешь категории в virtuemart, потом их надо создавать в самой джумле и привязывать к этим категориям virtuemart. Нельзя массово работать с товарами. Мне не нравится, но приходится работать.
http://ideone.com/HbUAaB
Оцените и подскажите, как делать сравнение с последующим выбором наименьшего.
Объясните почему array все равно меняется, ведь я возвращаю его копию.
> Так ты не экранируешь одиночные кавычки и возможна XSS в аттрибутах
Я знаю. Но традиционно атрибуты пишут в двойных кавычках.
> Простейший шаблонизатор встроен в PHP и требует 0 строк кода а возможностей у него больше.
И проблем больше. Мешать данные с кодом, подготавливать данные внутри шаблонизатора или как-то иначе давать шаблонизатору напрямую исполнять PHP-код - плохо. Относительно последнего некоторые думают иначе, но им просто повезло с верстальщиком. Хуже этого разве что short_open_tags = On.
> твой шаблонизатор ... не позволяет
Это просто пример для >>371278, чтобы показать, как это работает. Я даже повтор блоков не стал делать, чтобы не усложнять. Хотя подобного кода для гостевушки за глаза хватает, и я бы хорошо подумал, стоит ли тащить вместо него каких-нибудь монстров.
> Правильно использовать шаблонизатор с автоэскейпингом
Конечно! Но для начала желательно хотя бы примерно представлять, что это, и как оно работает.
> strtr
Да, ты прав там сначала был однострочник с array_map(htmlspecialchars), но я решил, что это недостаточно наглядно.
>Посмртри сам: http://jsbin.com/xamerora/4/edit
Оп, у тебя не сохраняется. Я всегда нажимаю ctrl+s и в share копирую link.
http://jsbin.com/xamerora/8/edit?js,console
Теперь копия, понял, что при присвоении присваивается ссылка на объект массив.
А что вообще делает первая функция? Она тупо возвращает код вложенной функции counter? Я нуб.
Она с каждым новым вызовом увеличивает заданное число на определенный шаг.
var counter = sequence(1, 3);
console.log(counter()); //4
console.log(counter()); //7
console.log(counter()); //10
и т.д.
http://jsbin.com/nakezodi/6/edit?js,console
Пятое задание сделал. Не понимаю, почему в данном случае, если задать любой контекст (я и цифру любую писал, и строку, и this, и null), то выводится все те же 120. Почему здесь контекст не важен? Я не понимаю как первый аргумент у apply работает.
Так sequence(1, 3) возвращает функцию counter().
А здесь var counterGen = sequence(1, 3); мы уже имеем в переменной counterGen ссылку на функцию counter, которая и увеличивает число.
Я только это сохранил. Вроде бы из треда в /b/ по изучению пхп, пару лет назад.
$array =array ([0] => array(
"id" => ...,
"name" =>...,
"x" => ...,
"y" => ... );
[1]=> array(....);
);
Как мне из него убрать все повторяющиеся массивы, в которых одинаковое имя и (х1 - х2)*(y1 - y2) < 100?
Пока попробовал так, но не работает:
foreach ($array as $value) {
foreach ($array as $val) {
if (условие) {
unset ($val);
}
}
}
> var arrayCopy = array;
В JS это не создает копию массива, а просто копирует ссылку на него из одной переменной в другую, но обе переменные указывают на один и тот же массив.
В JS копируются только: числа, строки, null/undefined/true/false/NaN/Infinity (они называются скалярные или примитивные знчения)
Объекты, массивы (которые в JS являются объектами), функции (которые в JS являются объектами) всегда передаются по ссылке. Будь то копирование из переменной в переменную или передача в функцию — ты не создаешь новый объект, а передаешь ссылку на существующий.
Для сравнения, в PHP только объекты передаются по ссылке, а массивы и скалярные значения по умолчанию копируются.
Чтобы сделать копию массива, надо явно сделать новый массив:
var copy = array.slice();
При этом, это так называемая неглубокая копия (shallow copy). Если в массиве были вложены другие объекты или массивы, то они копируются как ссылки. Чтобы создать полный клон массива, включая вложенные объекты/массивы, нужно глубокое копирование (deep copy), и такой функции в JS нет. Она есть в сторонних библиотеках, и я думаю, мы сделаем это тебе отдельной задачкой — написать функцию глубокого копирования.
Для клонирования объектов и функций (даже неглубокого) в JS встроенных средств нет.
Собственно, вот тебе пара дополнительных задачек на JS:
1) напиши функцию, определяющую тип переменной. Результат должен быть одной из строк: 'undefined', 'boolean' (для true/false), 'null', 'number', 'string', 'function', 'array', 'array-like', 'object'
array-like — это псевдомассив, то есть объект, у которого есть неотрицательное свойство length и элементы с 0 до length - 1.
Псевдомассивом например является arguments, а также DOM-коллекции (с которыми ты столкнешься позже).
В JS есть оператор typeof, но у него есть подвохи:
typeof null дает 'object'
typeof [] дает 'object'
Определение массива через [] instanceof Array не сработает, если массив был создан в друго вкладке или фрейме браузера, так как в каждой вкладке свой объект window и свой window.Array.
В новых браузерах появился метод Array.isArray ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray ), но хорошо бы иметь универсальное решение.
2) Напиши функцию неглубокого копирования объектов и массивов.
3) Напиши функцию глубокого копирования объектов и массивов.
Решать можешь потом, так как сейчас не факт что ты сможешь их решить. Правильные ответы можно увидеть например в коде библиотеки lodash:
http://lodash.com/docs#isArray
http://lodash.com/docs#clone
http://lodash.com/docs#cloneDeep
> var arrayCopy = array;
В JS это не создает копию массива, а просто копирует ссылку на него из одной переменной в другую, но обе переменные указывают на один и тот же массив.
В JS копируются только: числа, строки, null/undefined/true/false/NaN/Infinity (они называются скалярные или примитивные знчения)
Объекты, массивы (которые в JS являются объектами), функции (которые в JS являются объектами) всегда передаются по ссылке. Будь то копирование из переменной в переменную или передача в функцию — ты не создаешь новый объект, а передаешь ссылку на существующий.
Для сравнения, в PHP только объекты передаются по ссылке, а массивы и скалярные значения по умолчанию копируются.
Чтобы сделать копию массива, надо явно сделать новый массив:
var copy = array.slice();
При этом, это так называемая неглубокая копия (shallow copy). Если в массиве были вложены другие объекты или массивы, то они копируются как ссылки. Чтобы создать полный клон массива, включая вложенные объекты/массивы, нужно глубокое копирование (deep copy), и такой функции в JS нет. Она есть в сторонних библиотеках, и я думаю, мы сделаем это тебе отдельной задачкой — написать функцию глубокого копирования.
Для клонирования объектов и функций (даже неглубокого) в JS встроенных средств нет.
Собственно, вот тебе пара дополнительных задачек на JS:
1) напиши функцию, определяющую тип переменной. Результат должен быть одной из строк: 'undefined', 'boolean' (для true/false), 'null', 'number', 'string', 'function', 'array', 'array-like', 'object'
array-like — это псевдомассив, то есть объект, у которого есть неотрицательное свойство length и элементы с 0 до length - 1.
Псевдомассивом например является arguments, а также DOM-коллекции (с которыми ты столкнешься позже).
В JS есть оператор typeof, но у него есть подвохи:
typeof null дает 'object'
typeof [] дает 'object'
Определение массива через [] instanceof Array не сработает, если массив был создан в друго вкладке или фрейме браузера, так как в каждой вкладке свой объект window и свой window.Array.
В новых браузерах появился метод Array.isArray ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray ), но хорошо бы иметь универсальное решение.
2) Напиши функцию неглубокого копирования объектов и массивов.
3) Напиши функцию глубокого копирования объектов и массивов.
Решать можешь потом, так как сейчас не факт что ты сможешь их решить. Правильные ответы можно увидеть например в коде библиотеки lodash:
http://lodash.com/docs#isArray
http://lodash.com/docs#clone
http://lodash.com/docs#cloneDeep
> Но традиционно атрибуты пишут в двойных кавычках.
Не слышал про такую традицию.
> Мешать данные с кодом, подготавливать данные внутри шаблонизатора
Если это не делать, то подготавливать их придется в другом месте, в контроллере например, замусоривая его код. И все равно нужны фильры для данных, по типу
{{ name | truncate: 40 }}
{{ user.money | format_number }}
А когда ты захочешь перевести сайт на несколько языков, кода в шаблоне будет еще больше.
Если тебе не нравится синтаксис PHP, можно просто взять twig. Это всяко лучше чем свой велосипед писать. Я сталкивался с велосипедным шаблонизатором в одной платной российской CMS, и это быдо ужасно.
>>371399
Верно. Есть более короткое решение, ксати:
return Array.prototype.slice.call(arguments);
Почему оно работает, узнаешь, когда изучишь прототипы.
Данные в массив удобнее добавлять через push(). Имей в виду, в JS массивы работают не как в PHP. Вот мини-задачка:
var a = [];
a[100] = 1;
console.log(a.length); // В PHP бы вывелось 1, а сколько выведется в JS?
console.log(a[100]); // что выведется?
console.log(a[0]); // что выведется?
a.length = 10;
console.log(a[100]); // что выведется?
console.log(a[0]); // что выведется?
Это потому, что PHP-массивы скорее соответтвуют объектам (ассоциативным массивам) в JS.
> Но традиционно атрибуты пишут в двойных кавычках.
Не слышал про такую традицию.
> Мешать данные с кодом, подготавливать данные внутри шаблонизатора
Если это не делать, то подготавливать их придется в другом месте, в контроллере например, замусоривая его код. И все равно нужны фильры для данных, по типу
{{ name | truncate: 40 }}
{{ user.money | format_number }}
А когда ты захочешь перевести сайт на несколько языков, кода в шаблоне будет еще больше.
Если тебе не нравится синтаксис PHP, можно просто взять twig. Это всяко лучше чем свой велосипед писать. Я сталкивался с велосипедным шаблонизатором в одной платной российской CMS, и это быдо ужасно.
>>371399
Верно. Есть более короткое решение, ксати:
return Array.prototype.slice.call(arguments);
Почему оно работает, узнаешь, когда изучишь прототипы.
Данные в массив удобнее добавлять через push(). Имей в виду, в JS массивы работают не как в PHP. Вот мини-задачка:
var a = [];
a[100] = 1;
console.log(a.length); // В PHP бы вывелось 1, а сколько выведется в JS?
console.log(a[100]); // что выведется?
console.log(a[0]); // что выведется?
a.length = 10;
console.log(a[100]); // что выведется?
console.log(a[0]); // что выведется?
Это потому, что PHP-массивы скорее соответтвуют объектам (ассоциативным массивам) в JS.
Вкладки console и javascript открой. Все сохраняется, я жму Lock revision перед тем как копировать ссылку.
Иеперь хорошо. В новых браузерах, кстати, у массивов есть метод map().
>>371410
> Я не понимаю как первый аргумент у apply работает.
Первый аргумент у call/apply — это так называемый контекст, то есть чему будет равна переменная this внутри функции.
Есть несколько способов вызвать функцию:
function fn() { console.log(this); }
fn(); // this будет равно window
var A = { a: 1, fn: fn };
A.fn(); // this будет равно A
var с = [1, 2, 3]
fn.apply(c); // this будет равно с
В твоем случае логично писать fn.apply(this, ...) чтобы передать значение this в вызываемую функцию.
Заметь, в отличие от PHP где $this всегда указывает на текущий объект, в JS в него можно передать любой объект.
> var allArgs = args.concat(args1);
Можно было без дополнительного массива, сразу в args делать push.
А так, в остальном верно решено.
Вкладки console и javascript открой. Все сохраняется, я жму Lock revision перед тем как копировать ссылку.
Иеперь хорошо. В новых браузерах, кстати, у массивов есть метод map().
>>371410
> Я не понимаю как первый аргумент у apply работает.
Первый аргумент у call/apply — это так называемый контекст, то есть чему будет равна переменная this внутри функции.
Есть несколько способов вызвать функцию:
function fn() { console.log(this); }
fn(); // this будет равно window
var A = { a: 1, fn: fn };
A.fn(); // this будет равно A
var с = [1, 2, 3]
fn.apply(c); // this будет равно с
В твоем случае логично писать fn.apply(this, ...) чтобы передать значение this в вызываемую функцию.
Заметь, в отличие от PHP где $this всегда указывает на текущий объект, в JS в него можно передать любой объект.
> var allArgs = args.concat(args1);
Можно было без дополнительного массива, сразу в args делать push.
А так, в остальном верно решено.
Мое
>>371420
> argsNew.splice(j, 1);
Работает, но написано слишком сложно. Надо просто сделать два цикла, внешний по arguments (argsNew не нужен), внутренний по args и в переменной сохранять номер, с которого начинать искать свободное место в args.
Новые задания:
- напиши функцию bind, которая позволяет привзяать контекст (значение this) к функции:
window.x = 1;
var ctx = { x: 2 };
function testThis() { console.log(this.x); }
testThis(); // 1
var boundFunction = bind(testThis, ctx);
boundFunction(); // 2
В новых браузерах и функций есть метод bind(), делающий аналогичную вещь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind
В библиотеках тоже есть такой метод: http://lodash.com/docs#bind
- напиши функцию pluck, которая берет массив объектов и возвращает массив значений определенного поля:
var characters = [
{ 'name': 'barney', 'age': 36 },
{ 'name': 'fred', 'age': 40 }
];
pluck(characters, 'name'); // ['barney', 'fred']
Такая функция есть в lodash: http://lodash.com/docs#pluck
- напиши функцию filter, которая принимает функцию-предикат и массив. Возвращает она массив значений, для которых предикат вернет true.
var input = [1, 2, 3, 4, 5, 6];
function isEven(x) { return x % 2 == 0; } // проверяет на четность
console.log(filter(isEven, input)); // [2, 4, 6]
Аналог из loash: http://lodash.com/docs#filter
В новых браузерах у массивов есть метод filter.
- Напиши функцию, считающую число свойств в объекте:
var a = { a: 1, b: 2 };
count(a); // 2
var b = function () {};
count(b); // 0
var с = [1, 2, 3];
count(c); // 3
var d = [];
d[100] = 1;
count(d); // 1
Мое
>>371420
> argsNew.splice(j, 1);
Работает, но написано слишком сложно. Надо просто сделать два цикла, внешний по arguments (argsNew не нужен), внутренний по args и в переменной сохранять номер, с которого начинать искать свободное место в args.
Новые задания:
- напиши функцию bind, которая позволяет привзяать контекст (значение this) к функции:
window.x = 1;
var ctx = { x: 2 };
function testThis() { console.log(this.x); }
testThis(); // 1
var boundFunction = bind(testThis, ctx);
boundFunction(); // 2
В новых браузерах и функций есть метод bind(), делающий аналогичную вещь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind
В библиотеках тоже есть такой метод: http://lodash.com/docs#bind
- напиши функцию pluck, которая берет массив объектов и возвращает массив значений определенного поля:
var characters = [
{ 'name': 'barney', 'age': 36 },
{ 'name': 'fred', 'age': 40 }
];
pluck(characters, 'name'); // ['barney', 'fred']
Такая функция есть в lodash: http://lodash.com/docs#pluck
- напиши функцию filter, которая принимает функцию-предикат и массив. Возвращает она массив значений, для которых предикат вернет true.
var input = [1, 2, 3, 4, 5, 6];
function isEven(x) { return x % 2 == 0; } // проверяет на четность
console.log(filter(isEven, input)); // [2, 4, 6]
Аналог из loash: http://lodash.com/docs#filter
В новых браузерах у массивов есть метод filter.
- Напиши функцию, считающую число свойств в объекте:
var a = { a: 1, b: 2 };
count(a); // 2
var b = function () {};
count(b); // 0
var с = [1, 2, 3];
count(c); // 3
var d = [];
d[100] = 1;
count(d); // 1
unset($val) удаляет переменную, а не элемент из массива. Элемент удаляется через
unset($array[$key]);
> Не слышал про такую традицию.
Да? А посещаемый сайт с атрибутами в одинарных кавычках покажи? да что далеко ходить, нажми Ctrl+U
То есть если верстальщик исплоьзует одиночные, то он сам виноват, пусть получает XSS? Не вижу логики, лучше поменять значение параметра и код будет работать с любыми видами кавычек.
>>371448
Нет. В JS и функции и массивы являются объектами. Ты даже можешь создать функцию так:
var fn = new Function("a", "b", " return a + b; ");
(но это не рекомендуется использовать).
А массив так:
var a = new Array(1, 2, 3);
(опять же не рекомендуется: если ты указжешь один параметр он будет воспринят как длина массива, а не элемент).
Ну и проверить, чт это объекты можно легко:
(function () {}) instanceof Function // true
(function () {}) instanceof Object // true
[] instanceof Array // true
[] instanceof Object // true
> а объект - функция в js?
Нет
То есть если верстальщик исплоьзует одиночные, то он сам виноват, пусть получает XSS? Не вижу логики, лучше поменять значение параметра и код будет работать с любыми видами кавычек.
>>371448
Нет. В JS и функции и массивы являются объектами. Ты даже можешь создать функцию так:
var fn = new Function("a", "b", " return a + b; ");
(но это не рекомендуется использовать).
А массив так:
var a = new Array(1, 2, 3);
(опять же не рекомендуется: если ты указжешь один параметр он будет воспринят как длина массива, а не элемент).
Ну и проверить, чт это объекты можно легко:
(function () {}) instanceof Function // true
(function () {}) instanceof Object // true
[] instanceof Array // true
[] instanceof Object // true
> а объект - функция в js?
Нет
Это не то. Надо чтобы было так:
function testThis() { console.log(this.x); }
testThis(); // 1
var boundFunction = bind(testThis, ctx);
boundFunction(); // 2
Попробуй этот код запустить.
https://gist.github.com/fxsloker/824c94320f181fb82c98
С markdown, легче читается.
>Попробуй этот код запустить.
ReferenceError: bind is not defined
http://jsbin.com/pumuvo/3/edit?js,console
Ну и еще вот так можно. В учебнике это называется кросс-браузерная эмуляция bind. Так надо было делать?
Ну так предполагалось, что функцию bind ты напишешь сам.
То, что тут сделано: http://jsbin.com/fowez/2/edit?js,console неправильно так как у тебя bind() возвращает 2, а должна возвращать функцию (которая вернет 2 при вызове).
То что тут http://jsbin.com/fowez/4/edit тоже неправильно, так как в задании сказано: «напиши функцию bind», а ты ее не написал. Да еще и код переделал, у меня было bind(testThis, ctx) а ты написал testThis.bind(...)
Да, в современных браузерах у функций есть метод bind, но я просил написать отдельную функцию для этого.
>>371478
Вот это то, что требовалось. Все верно.
http://jsbin.com/busigo/2/edit?js,console
Где-то что-то не углядел. И prop выводится, и element, а element.prop не хочет. Я хочу попробовать без цикла for сделать, forEach мне кажется удобнее и надежнее. Прочитал, что, если в массиве отсутствуют какие-нибудь элементы (массив разряженный), то необходимо добавлять if (i in a) {}, а можно просто использовать forEach.
1. Есть ли у ПХП репозитории и менеджеры пакетов, как у питоновского PyPi, перловского CPAN, как у RоR и НодеЖС? И если нет, каким образом вы втыкаете фреймворк или библиотеку в проект? Скачиваете с веб-странички архив и распаковываете его в рабочую папку?
2. Есть ли возможность встроенными средствами поднять сервер для разработки? Локалхост то есть? Обойтись без Апача?
2) С версии 5.4.0 можно поднять сервер на локалочке с помощью php -S localhost:3000
http://php.net/manual/ru/features.commandline.webserver.php
http://jsbin.com/figuh/2/edit?js,console
Нашел интересный метод у Object, keys называется. Возвращает массив свойств объекта, а потом остается только посчитать его элементы.
Это к деньгам брат, что-то вроде талисмана к деньгам, только в коде.
> 1. Есть ли у ПХП репозитории и менеджеры пакетов,
Если ты про написанные на PHP, то есть два:
1) раньше использовали PEAR, он существует много лет, и в нем много пакетов. Ставится он просто, например в Дебиане это apt-get install pear Он ставит скачанные пакеты в общесистемную папку. Им пользовались далеко не все, в основном опытные и профессиональные программисты.
2) Новый подход — composer ( http://habrahabr.ru/post/145946/ ). Он использует репозиторий packagist.org и ставит пакеты в папку vendor внутри твоего проекта. Причем он может фиксировать версии пакетов, чтобы избежать сюрпризов. Он сейчас становится популярнее и популярнее, думаю, стоит его использовать. Если проводить аналогии, то он похож на npm из ноды.
> И если нет, каким образом вы втыкаете фреймворк или библиотеку в проект?
PEAR, composer, или тупо скачиваем и распаковываем в папочку. Я советую всем composer.
> Есть ли возможность встроенными средствами поднять сервер для разработки? Локалхост то есть? Обойтись без Апача?
Встроенный сервер, но большинство приложений на нем не заработает, например Вордпресс, без ручной доработки, так как они используют файлы htaccess для задания соответствия URL => выполняемый скрипт (который поддерживается апачем). Можно вручную конечно дописать код для работы со встроенным сервером, но Апач поставить будет проще.
$bablo1 = '100';
for ($n = 2; $n <= 100; $n++) eval("\$bablo{$n} = 'bablo".($n-1)."';");
echo $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$bablo100;
> 100
> Прочитал, что, если в массиве отсутствуют какие-нибудь элементы (массив разряженный), то необходимо добавлять if (i in a) {}
Это да. Если сделать
var a = [];
a.length = 100;
То длина массива будет 100, но элемент пофакту в нем только один.
Вместо in лучше использовать hasOwnProperty:
if (a.hasOwnProperty(prop)) { ... }
Так как in ищет свойство в самом объекте и всех его прототипах, а hasOwnProperty — только в объекте.
>>371494
Почти так, только вместо console.log надо было поставить return (ок, будем считать что я плохо сформулировл задачу). Ну и имей в виду, что forEach не везде заработает: http://kangax.github.io/compat-table/es5/#Array.prototype.forEach (ох, бедные ИЕ8 и ИЕ7).
>>371510
filter не должен изменять переданный массив, а должен создавать новый. splice() меняет существующий массив: http://jsbin.com/jivitumo/1/edit?js,console
Выучи-ка, какие функции из этого списка создают новый массив, а какие меняют существующий, чтобы не путаться больше:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array#Methods_of_array_instances
http://learn.javascript.ru/array-methods
>>371515
Ага, это аналог array_keys из PHP. Но тут можно бы и без него обойтись (можно и с ним, если элементов немного, а если много то не очень эффективно получается).
>>371520
Спасибо
>>371523
Знаки доллара взяты из bash и perl. И при чем тут евреи? Граждане Израиля называются израильтяне.
> Прочитал, что, если в массиве отсутствуют какие-нибудь элементы (массив разряженный), то необходимо добавлять if (i in a) {}
Это да. Если сделать
var a = [];
a.length = 100;
То длина массива будет 100, но элемент пофакту в нем только один.
Вместо in лучше использовать hasOwnProperty:
if (a.hasOwnProperty(prop)) { ... }
Так как in ищет свойство в самом объекте и всех его прототипах, а hasOwnProperty — только в объекте.
>>371494
Почти так, только вместо console.log надо было поставить return (ок, будем считать что я плохо сформулировл задачу). Ну и имей в виду, что forEach не везде заработает: http://kangax.github.io/compat-table/es5/#Array.prototype.forEach (ох, бедные ИЕ8 и ИЕ7).
>>371510
filter не должен изменять переданный массив, а должен создавать новый. splice() меняет существующий массив: http://jsbin.com/jivitumo/1/edit?js,console
Выучи-ка, какие функции из этого списка создают новый массив, а какие меняют существующий, чтобы не путаться больше:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array#Methods_of_array_instances
http://learn.javascript.ru/array-methods
>>371515
Ага, это аналог array_keys из PHP. Но тут можно бы и без него обойтись (можно и с ним, если элементов немного, а если много то не очень эффективно получается).
>>371520
Спасибо
>>371523
Знаки доллара взяты из bash и perl. И при чем тут евреи? Граждане Израиля называются израильтяне.
Object.getOwnPropertyNames как по сравнению с keys? Различие только в свойстве enumerable, а как эффективность проверяется не знаю.
http://pastebin.com/Mtx2f9p4
Ну вот проверяет на null и на undefined. С числами надо подумать, пока пробовал - не вышло. Надо найти то, что они умеют, а строки нет. Ведь '5' - строка, но она автоматически преобразуется в число.
enumerable — это флаг, который показывает, видно ли свойство циклам типа for .. in и методам вроде forEach, то есть участвует ли оно в переборе свойств?
К примеру, есть массив:
var a = [1, 2];
У него есть свойства:
a[0] = 1; enumerable
a[1] = 2; enumerable
a['length'] = 2; NOT enumerable
C помощью этого флага помечаются системные свойства, чтобы они не участвовали в том же for .. in. Соответственно, их считать не надо. Соответственно, getOwnPropertyNames будет давать неверные результаты.
>>371535
А ты их все решил? пора бы переходить к прототипам и ООП, а потом к DOM (в браузере), сколько можно ходить вокруг да около?
- дан список вида «страна, город, население»: http://ru.wikipedia.org/wiki/%D0%A1%D0%B0%D0%BC%D1%8B%D0%B5_%D0%BD%D0%B0%D1%81%D0%B5%D0%BB%D1%91%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B3%D0%BE%D1%80%D0%BE%D0%B4%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%B3%D0%BB%D0%BE%D0%BC%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8#.D0.98.D1.81.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D0.BE.D0.B2.D0.B0.D0.BD.D0.BD.D1.8B.D0.B5_.D0.BC.D0.B5.D1.82.D0.BE.D0.B4.D1.8B
Можешь взять оттуда первые 5-10 городов и перенести в код. Города в списке могут идти в произвольном порядке. Напиши программу, которая отберет и выведет N самых населенных городов по убыванию числа жителей.
- Некая сеть фастфудов предлагает несколько видов гамбургеров:
* маленький (50 тугриков, 20 калорий)
* большой (100 тугриков, 40 калорий)
Гамбургер может быть с одним из нескольких видов начинок (обязательно):
* сыром (+ 10 тугриков, + 20 калорий)
* салатом (+ 20 тугриков, + 5 калорий)
* картофелем (+ 15 тугриков, + 10 калорий)
Дополнительно, гамбургер можно посыпать приправой (+ 15 тугриков, 0 калорий) и полить майонезом (+ 20 тугриков, + 5 калорий). Напиши программу, расчиытвающую стоимость и калорийность гамбургера. Используй ООП подход (подсказка: нужен класс Гамбургер, константы, методы для выбора опций и рассчета нужных величин).
- В одном городе есть электрическая сеть. К ней могут быть подключены:
* электростанции, вырабатывают мощность от 1 до 100 мегаватт
* солнечные панели, генерируют от 1 до 5 мегаватт днем и 0 ночью
* жилые дома, в них от 1 до 400 квартир, потребляют 4 кВт на квартиру днем и 1 кВт ночью.
* линии электропередач, ведущие в другие города, по ним может подаваться недостающая или отдаваться лишняя энергия.
Дан список всех элементов электросети. Напиши программу, рассчитывющую, сколько электричества необходимо закупить (или можно продать) днем и ночью для обеспечения баланса. Используй продвинутый ООП подход для решения задачи.
enumerable — это флаг, который показывает, видно ли свойство циклам типа for .. in и методам вроде forEach, то есть участвует ли оно в переборе свойств?
К примеру, есть массив:
var a = [1, 2];
У него есть свойства:
a[0] = 1; enumerable
a[1] = 2; enumerable
a['length'] = 2; NOT enumerable
C помощью этого флага помечаются системные свойства, чтобы они не участвовали в том же for .. in. Соответственно, их считать не надо. Соответственно, getOwnPropertyNames будет давать неверные результаты.
>>371535
А ты их все решил? пора бы переходить к прототипам и ООП, а потом к DOM (в браузере), сколько можно ходить вокруг да около?
- дан список вида «страна, город, население»: http://ru.wikipedia.org/wiki/%D0%A1%D0%B0%D0%BC%D1%8B%D0%B5_%D0%BD%D0%B0%D1%81%D0%B5%D0%BB%D1%91%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B3%D0%BE%D1%80%D0%BE%D0%B4%D1%81%D0%BA%D0%B8%D0%B5_%D0%B0%D0%B3%D0%BB%D0%BE%D0%BC%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8#.D0.98.D1.81.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D0.BE.D0.B2.D0.B0.D0.BD.D0.BD.D1.8B.D0.B5_.D0.BC.D0.B5.D1.82.D0.BE.D0.B4.D1.8B
Можешь взять оттуда первые 5-10 городов и перенести в код. Города в списке могут идти в произвольном порядке. Напиши программу, которая отберет и выведет N самых населенных городов по убыванию числа жителей.
- Некая сеть фастфудов предлагает несколько видов гамбургеров:
* маленький (50 тугриков, 20 калорий)
* большой (100 тугриков, 40 калорий)
Гамбургер может быть с одним из нескольких видов начинок (обязательно):
* сыром (+ 10 тугриков, + 20 калорий)
* салатом (+ 20 тугриков, + 5 калорий)
* картофелем (+ 15 тугриков, + 10 калорий)
Дополнительно, гамбургер можно посыпать приправой (+ 15 тугриков, 0 калорий) и полить майонезом (+ 20 тугриков, + 5 калорий). Напиши программу, расчиытвающую стоимость и калорийность гамбургера. Используй ООП подход (подсказка: нужен класс Гамбургер, константы, методы для выбора опций и рассчета нужных величин).
- В одном городе есть электрическая сеть. К ней могут быть подключены:
* электростанции, вырабатывают мощность от 1 до 100 мегаватт
* солнечные панели, генерируют от 1 до 5 мегаватт днем и 0 ночью
* жилые дома, в них от 1 до 400 квартир, потребляют 4 кВт на квартиру днем и 1 кВт ночью.
* линии электропередач, ведущие в другие города, по ним может подаваться недостающая или отдаваться лишняя энергия.
Дан список всех элементов электросети. Напиши программу, рассчитывющую, сколько электричества необходимо закупить (или можно продать) днем и ночью для обеспечения баланса. Используй продвинутый ООП подход для решения задачи.
Да. То, что у меня в гисте про проверку типа переменной потихоньку буду думать.
Ну давай задачи про ООП и прототипы. Я бы хотел конечно еще что-нибудь приближенное к таким задачам, как сделать слайдер или что-то подобное (чтобы в верстке пригодилось), но это и есть наверное связь с DOM.
'5' — это строка. 5 — это число. По моему, все очевидно. Отлчиить их легко например с помощью оператора typeof.
> string == undefined
Почитай про == и ===.
x == undefined срабоатет так же на кучу других значений.
>>371542
> //В бд есть таблица messages с аттрибутами id, username и text, в которой храним сообщения
Надо прикладывать sql файл с CREATE TABLE, а не совесное описание. ты же программист.
Для базы надо включить строгий режим (выполнить команду SET sql_mode = 'STRICT_ALL_TABLES') которая превраащет предупреждения в ошибки. Для PDO надо включить режим ERRMODE_EXCEPTION.
> public function __construct($address, $dbname, $charset, $user, $password) {
лучше передавать объект PDO. Или у тебя каждый экземпляр класса будет свое отдельное соединение с базой делать? многовато соединений получится.
> <?php while ($row = $gb->getRow()): ?>
Не надо так. Передавай в шаблон массив с данными, и перебирай через foreach. Не надо из шаблона что-то с базой делать.
> <div style='margin-bottom: 10px;'>
CSS изучал? Лучше класс поставить и этому классу сделать отступ в CSS.
> <?php if ($username || $text) echo "<p>Вы не заполнили все поля!</p>" ?>
не используй echo в шаблонах. Используй if .. endif
> value="<?= $username ?>">
Нету htmlspecialchars. C флагом ENT_QUOTES, кстати, надо ее исплоьзовать.
> //Если хотя бы часть полей ввода не заполнены, записываем их в сессию и считываем в гет-запросе, чтобы самостоятельно заполнить поля формы и вывести сообщение об ошибке.
Не надо этого делать. Сессия общая на все вкладки браузера и если открыть сайт в нескольких вкладках, будут проблемы. Плюс, это лишнее усложнение. Просто при ошибке не редиректь, а выводи форму (а вот если ошибок нет — тогда редиректь).
Так как в форме ошибка, то обновление страницы по F5 не вызовет повторное добавление записи и редирект не нужен.
> } elseif ($_SERVER['REQUEST_METHOD'] == 'GET') {
Можно просто else — все равно ты другие методы не поддерживаешь.
> $username = $_SESSION['username'];
Если сессия была пустая, это вызовет ошибку доступа к несуществующему эдементу. Ты ощибки видишь? Ты логи читаешь? Если нет, либо читай логи либо включи в конфиге PHP display_errors = On чтобы они выводились на экран.
'5' — это строка. 5 — это число. По моему, все очевидно. Отлчиить их легко например с помощью оператора typeof.
> string == undefined
Почитай про == и ===.
x == undefined срабоатет так же на кучу других значений.
>>371542
> //В бд есть таблица messages с аттрибутами id, username и text, в которой храним сообщения
Надо прикладывать sql файл с CREATE TABLE, а не совесное описание. ты же программист.
Для базы надо включить строгий режим (выполнить команду SET sql_mode = 'STRICT_ALL_TABLES') которая превраащет предупреждения в ошибки. Для PDO надо включить режим ERRMODE_EXCEPTION.
> public function __construct($address, $dbname, $charset, $user, $password) {
лучше передавать объект PDO. Или у тебя каждый экземпляр класса будет свое отдельное соединение с базой делать? многовато соединений получится.
> <?php while ($row = $gb->getRow()): ?>
Не надо так. Передавай в шаблон массив с данными, и перебирай через foreach. Не надо из шаблона что-то с базой делать.
> <div style='margin-bottom: 10px;'>
CSS изучал? Лучше класс поставить и этому классу сделать отступ в CSS.
> <?php if ($username || $text) echo "<p>Вы не заполнили все поля!</p>" ?>
не используй echo в шаблонах. Используй if .. endif
> value="<?= $username ?>">
Нету htmlspecialchars. C флагом ENT_QUOTES, кстати, надо ее исплоьзовать.
> //Если хотя бы часть полей ввода не заполнены, записываем их в сессию и считываем в гет-запросе, чтобы самостоятельно заполнить поля формы и вывести сообщение об ошибке.
Не надо этого делать. Сессия общая на все вкладки браузера и если открыть сайт в нескольких вкладках, будут проблемы. Плюс, это лишнее усложнение. Просто при ошибке не редиректь, а выводи форму (а вот если ошибок нет — тогда редиректь).
Так как в форме ошибка, то обновление страницы по F5 не вызовет повторное добавление записи и редирект не нужен.
> } elseif ($_SERVER['REQUEST_METHOD'] == 'GET') {
Можно просто else — все равно ты другие методы не поддерживаешь.
> $username = $_SESSION['username'];
Если сессия была пустая, это вызовет ошибку доступа к несуществующему эдементу. Ты ощибки видишь? Ты логи читаешь? Если нет, либо читай логи либо включи в конфиге PHP display_errors = On чтобы они выводились на экран.
>'5' — это строка. 5 — это число. По моему, все очевидно. Отлчиить их легко например с помощью оператора typeof.
Ну значит не получится переписать typeof полностью, я просто думал в каждом типе переменной есть своя особенность.
Но вот сегодня как раз так случилось, что прочитал про то, что null == undefined (true), НО null === undefined (false).
> Я бы хотел конечно еще что-нибудь приближенное к таким задачам, как сделать слайдер или что-то подобное
Это можно, но сначала надо убедиться что ты понял ООП, а потом дать задачки на DOM и события (ну и потом немного jQuery), так как все это используется в слайдерах и других виджетах.
>>371546
Ну это техническая документация больше, а не учебник. Предполагается что читатель представляет что это такое и работал с ними. Но зато все фичи описаны.
А, еще в яваскрипте есть объекты Date, Math и регулярки (более простые чем в PHP, если ты в PHP их изучил, то достаточно прочесть список их возможностей). Я потом дам на них может задачку, но пока можешь просто learn.javascript.ru про них прочитать, там несложно.
Спасибо, что посмотрел.
> public function __construct($address, $dbname, $charset, $user, $password) лучше передавать объект PDO. Или у тебя каждый экземпляр класса будет свое отдельное соединение с базой делать? многовато соединений получится.
Я хотел сделать сначала вообще без создания объекта через методы класса и переменные класса, но не нашёл как создать переменные класса. я бака
> <div style='margin-bottom: 10px;'> CSS изучал? Лучше класс поставить и этому классу сделать отступ в CSS.
Знаю, я честно-честно потом добавлю побольше стилей и вынесу в отдельный css.
> <?php while ($row = $gb->getRow()): ?> Не надо так. Передавай в шаблон массив с данными, и перебирай через foreach. Не надо из шаблона что-то с базой делать.
Я думал, что если сразу всё выну через fetchall, то будет шанс, что полученный массив займёт кучу-кучу памяти.
> $username = $_SESSION['username']; Если сессия была пустая, это вызовет ошибку доступа к несуществующему эдементу. Ты ощибки видишь? Ты логи читаешь? Если нет, либо читай логи либо включи в конфиге PHP display_errors = On чтобы они выводились на экран.
Хорошо, просто я думал, что обращение к несуществующей паре вернёт null.
> Я хотел сделать сначала вообще без создания объекта через методы класса и переменные класса, но не нашёл как создать переменные класса.
Это называется статические методы, но их использовать тут крайне дурная идея.
> то будет шанс, что полученный массив займёт кучу-кучу памяти.
Если в твоей гостевухе будут миллионы записей то упадет браузер. Ты думаешь дивы память и CPU не занимают? Сафари падал от нескольких тысяч элементов, другие браузеры тормозили. Так что это неактуально.
> что обращение к несуществующей паре вернёт null.
К счастью в PHP это не так и он не прячет такие ошибки.
>лучше передавать объект PDO. Или у тебя каждый экземпляр класса будет свое отдельное соединение с базой делать? многовато соединений получится.
А где лучше хранить этот объект? Да, если как у меня, то после пары одновременных подключений, остальные не будут открываться. Может подключаться где-то в отдельном скрипте, а потом серелизовать этот объект куда-нибудь или я не в те дебри лезу?
date() возвращает время на час вперед относительно системного (того что в трее). Что бы это могло быть?
Как сделать чтобы все символы в $word были искомыми и не включались в разметку?
use React\Curry;
array_map(Curry\bind('strpos', Curry\…(), 0, 1), ['foo', 'bar', 'baz']);
Ну и что это за пиздец? Надо ещё какой-нибудь хуйни сюда заебашить, чтобы совсем неюзабельно было.
нашел, надо всунуть между /Q и /E. Но с символом > у меня проблемы какие-то. Реплейс его просто не видит, хоть \\> хоть [>] хоть /Q>/E никак не видит. Что с ним делать?
Прочитал. И вправду несложно.
А вот так? Гугл говорит Object.prototype.toString.call самый универсальный способ. Только я не понимаю как он работает. А еще почему его можно заменить вот этим {}.toString.call?
Оп, а такой рогалик сложно написать? Мануал то я нашел, но там подключается библиотека rot.js из https://github.com/ondras/rot.js , а вот самому написать. Я так на будущее спрашиваю, может когда и решусь.
Там я так понял стены и артефакты появляются рандомно. То есть игра до смерти, то есть выиграть нельзя.
"I don't use jquery and haven't spent the time to undertand it since I haven't had the need. Whenever I need a function I write it into my own library." - это верное утверждение?
http://jsperf.com/vanillajs-by-tag
Почему все пользуются jQuery, когда VanillaJS во много крат быстрее?
Ладно, соглашусь, не буду настолько сильно углубляться. Значит делаю вырезание стоп слов в начале и забиваю на запятую, в конце концов главное для меня сейчас научится кодить на php, а не написать скрипт который можно будет реально использовать.
Вот йоду как нибудь допилю, можно будет сделать что то типо этого http://huifikator.ru/
Но это уже как дойду до уровня когда можно будет реальные сайты и страницы делать.
Правда все равно один момент не ясен - проверки то все равно я не могу убрать, так как надо убедится что текущий, следующий и предыдущий символ не является точкой.
http://ideone.com/WwuPjA
Ну и заодно исправленная Лиличка
http://ideone.com/opRrjr
И банкомат. Я не могу понять - это я настолько туп или задача реально сложная? Утешь меня
Ты мне кидал ссылку
http://informatics.mccme.ru/mod/book/view.php?id=815
Я взял код с нее, переписал на php(http://ideone.com/poHXeY) и долго, очень долго втыкал в него. Пошагово наблюдал с помощью отладчика что там происходит и таки спустя пару дней осилил то как он работает. Сейчас бьюсь над тем как прикрутить к этому делу ограниченное количество купюр. Пока что мысль такова что надо модифицировать сам алгоритм как подсчета минимального количества купюр, что бы он учитывал тот факт что купюры не бесконечны, так же и с циклом который на основании массива $f определяет какие купюры выдать, в него тоже надо запилить тот факт что купюры не бесконечны. Я чего пишу - хочу узнать не усложняю ли я и в правильном ли направлении голову ломаю?
http://ideone.com/k6MLAo
И еще круг. Правда он не такой четкий как у тебя.
http://ideone.com/0BbLMY
И ты кажется напутал с формулой для x и y. x = r * cos(a), y = r * sin(a)
Хочу использовать массивы типа ["имя банка, стоимость кредита), затем сравнить их через min(банк1[1], банк2[1], банк3[1]) и вывести на экран "победивший массив". Попробовал было колдовать с енамами - не взлетело. Городить огород из проверок и сравнений - то есть полученное мином значение сравнивать со значением ячеек банков как-то криво.
URL
1. Протокол, логин-пароль, хост, порт, путь, параметры, якорь
(сам вспомнил про все кроме логин-пароля и якоря, первое вообще пару раз в жизни юзал когда фтп на локальной машине делал, ну а со вторым тоже давно не пересекался или внимания не обращал)
2. Протокол, хост, порт обязателен, но браузер автоматом подставляет стандартный для нашего протокола
3. http://example.com/data/get?_t=901&from=ifd#page=5,x=100
Сначала у нас указывается протокол http
Потом имя хоста example.com
Потом путь /data/get
После знака вопроса идут $_GET параметры для скрипта($_POST передается в заголовке и не виден юзеру, если тот конечно не установит себе прокси для того что бы посмотреть как выглядит http, как сделал я)
Ну и # означает якорь на странице который задается в теге <a>, который перекинет нас к нужному месту на странице.
4. Для http браузер подставляет стандартный 80 порт. Я как то месяц на сайт не мог зайти для узких кругов, думал не фурычит, пока зачем то от нечего делать не попробовал дописать :8080 после адреса и вуаля, все работало оказывается.
HTTP
1. Клиент - программа которая обращается к серверу для получения каких либо данных например.
Сервер - программа обрабатывающая запросы пользователя. Высылает клиенту запрашиваемую информацию, обрабатывает полученную от клиента, проводи какие либо расчеты например.
2. И программы и компьютера который заточен под использование программ-серверов
3. 1.1(Сначала написал, потом полез в гугл и оказался прав). Так как в вопросе множественное число - то видимо еще и 1.0. Как то не обращал на это внимание. Обычно если при заходе на какой то сайт вылетает 403 или еще чего, с надписями nginx или apache - там еще есть строчка http/1.1
4. https использует 443 порт(опять же проверил в гугле, но был прав) и шифрует трафик. Дабы усложнить жизнь хакерам и спецслужбам(хотя это еще вопрос, где у них лазеек для себя только нет). Обычный http трафик без шифрования использовать в точках с бесплатным wifi вообще опасно, так как даже школьники скачав приложение из маркета смогут просматривать все что вы делаете и подменять например картинки или видео, и это в лучшем случае. В худшем - можно остаться без денег на кошельках или каких нибудь аккаунтов передавая свои пароли в открытом виде(хотя такие сервисы правда как правило сами все шифруют).
5. GET - через адресную строку. POST - через заголовок(ого, сколько их кроме этих двух)
6.Вот тут вообще не знал, но почитал. Клиент отправляет серверу - метод, путь и версию протокола
Сервер же отвечает - версией протокола, кодом состояния и пояснение которое не является обязательным
7. 404 - само собой. 403 - доступ запрещен 500, 502, 503, 504 и т.д. - макака опять шатает двач.
8. GET /loololo/ HTTP/1.1 - запрос
HTTP/1.1 200 OK - ответ. Ну это самый минимум, в заголовках конечно еще куча всего передается, даже файлы.
9. Очевидно что файл где например apache пишет какую либо информацию(в зависимости от настроек детализации логов) которая очень может помочь например при возникновении проблем.
10. Content-type - указывается тип передаваемой информации - обычный текст, html документ, картинка.
Data - очевидно что число сегодняшнее
Host - имя сервера
Referer - откуда мы пришли
User-agent - информация о клиентской программе - браузер, операционная система.
11. Видимо это когда мы обращаемся к серверу, а он в заголовке отправляет куда бы нам пойти за этой информацией.
На пикритейлед программа proxomitron - рекомендую анонам, интересно посмотреть на заголовки вживую
http://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%BA%D0%BE%D0%B4%D0%BE%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F_HTTP#418
Лол
URL
1. Протокол, логин-пароль, хост, порт, путь, параметры, якорь
(сам вспомнил про все кроме логин-пароля и якоря, первое вообще пару раз в жизни юзал когда фтп на локальной машине делал, ну а со вторым тоже давно не пересекался или внимания не обращал)
2. Протокол, хост, порт обязателен, но браузер автоматом подставляет стандартный для нашего протокола
3. http://example.com/data/get?_t=901&from=ifd#page=5,x=100
Сначала у нас указывается протокол http
Потом имя хоста example.com
Потом путь /data/get
После знака вопроса идут $_GET параметры для скрипта($_POST передается в заголовке и не виден юзеру, если тот конечно не установит себе прокси для того что бы посмотреть как выглядит http, как сделал я)
Ну и # означает якорь на странице который задается в теге <a>, который перекинет нас к нужному месту на странице.
4. Для http браузер подставляет стандартный 80 порт. Я как то месяц на сайт не мог зайти для узких кругов, думал не фурычит, пока зачем то от нечего делать не попробовал дописать :8080 после адреса и вуаля, все работало оказывается.
HTTP
1. Клиент - программа которая обращается к серверу для получения каких либо данных например.
Сервер - программа обрабатывающая запросы пользователя. Высылает клиенту запрашиваемую информацию, обрабатывает полученную от клиента, проводи какие либо расчеты например.
2. И программы и компьютера который заточен под использование программ-серверов
3. 1.1(Сначала написал, потом полез в гугл и оказался прав). Так как в вопросе множественное число - то видимо еще и 1.0. Как то не обращал на это внимание. Обычно если при заходе на какой то сайт вылетает 403 или еще чего, с надписями nginx или apache - там еще есть строчка http/1.1
4. https использует 443 порт(опять же проверил в гугле, но был прав) и шифрует трафик. Дабы усложнить жизнь хакерам и спецслужбам(хотя это еще вопрос, где у них лазеек для себя только нет). Обычный http трафик без шифрования использовать в точках с бесплатным wifi вообще опасно, так как даже школьники скачав приложение из маркета смогут просматривать все что вы делаете и подменять например картинки или видео, и это в лучшем случае. В худшем - можно остаться без денег на кошельках или каких нибудь аккаунтов передавая свои пароли в открытом виде(хотя такие сервисы правда как правило сами все шифруют).
5. GET - через адресную строку. POST - через заголовок(ого, сколько их кроме этих двух)
6.Вот тут вообще не знал, но почитал. Клиент отправляет серверу - метод, путь и версию протокола
Сервер же отвечает - версией протокола, кодом состояния и пояснение которое не является обязательным
7. 404 - само собой. 403 - доступ запрещен 500, 502, 503, 504 и т.д. - макака опять шатает двач.
8. GET /loololo/ HTTP/1.1 - запрос
HTTP/1.1 200 OK - ответ. Ну это самый минимум, в заголовках конечно еще куча всего передается, даже файлы.
9. Очевидно что файл где например apache пишет какую либо информацию(в зависимости от настроек детализации логов) которая очень может помочь например при возникновении проблем.
10. Content-type - указывается тип передаваемой информации - обычный текст, html документ, картинка.
Data - очевидно что число сегодняшнее
Host - имя сервера
Referer - откуда мы пришли
User-agent - информация о клиентской программе - браузер, операционная система.
11. Видимо это когда мы обращаемся к серверу, а он в заголовке отправляет куда бы нам пойти за этой информацией.
На пикритейлед программа proxomitron - рекомендую анонам, интересно посмотреть на заголовки вживую
http://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%BA%D0%BE%D0%B4%D0%BE%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F_HTTP#418
Лол
> 8. GET /loololo/ HTTP/1.1 - запрос
HTTP/1.1 200 OK - ответ. Ну это самый минимум, в заголовках конечно еще куча всего передается, даже файлы.
Лоханулся - Заголовок это то что идёт после того что я написал - conten type: text/html; Location: 2ch.hk Host: и т.д
Еще изучающим анонам - с заголовками на практике можно разобраться благодаря telnet. Запускаем cmd, вводим telnet(если у вас вин7, то его сначала надо включить, гуглите). Пишем например o localhost 80. Естественно у нас должен быть запущен на машине веб-сервер. И можно вручную отправлять заголовки. Пустая строка означает конец заколовка, поэтому если после очередной строки мы нажмем интер 2 раза то получим ответ от сервера. Вот что например получается при отправке OPTIONS / HTTP/1.1 (На википедии советовали OPTIONS * HTTP/1.1 но у меня он кроме 403 ничего не возвращал. У меня еще telnet коряво работает, буквы друг на друга лезут, но поковырять сойдет.
1 учит что " что норм, второй что только ' иначе - регулярки экранирование гроб гроб кладбище пидор. Делай как говорят пока, как начнешь понимать что к чему решишь что делать.
Читаю в учебнике опа-няши про многобайтовые кодировки и мне нехорошо от того, что для многобайтовых строк меньше функционала, чем у дефолтных.
Я правильно сделал?
Я сам не хуй простой и умею в js, на пхп смогу написать простую голосовалку с результатами или гостевуху.
Как думаешь, она подойдет для дальнейшего обучения?
Я не ОП, но книжку человека с такой фамилией никогда бы не читал.
Мужик купил петуха. В первый день петух выебал всех курей, на второй всех уток, гусынь, индюшек. Мужик смотрит на такие чудеса и думает помрет петушок не бережет себя. На следующий день выходит во двор смотрит он валяется в луже вокруг него собираются вороны. Он подходит к петуху и говорит:"Ну чож ты молодо зелено! Нужно было экономить силы!" Петух открывает один глаз:"Сука, блять ворон спугнеш, тебя выебу!"
Предложили вакансию bitrix разработчик, обучать, сказали, не будут - "в процессе разберешься"
Какие особенности, каков порог вхождения, какой уровень навыков php необходим?
Можно просто в переменной, в твоем случае.
$pdo = new PDO ....
$guestbook = new Guestbook($pdo);
> а потом серелизовать этот объект куда-нибудь или я не в те дебри лезу?
Соединение с БД, как и другие ресурсы вроде файловых потоков или сетевых соединений, нельзя сериализовать.
>>371562
Чаовые пояса. Проверь, какая date_default_timezone стоит в php.ini
>>371564
Используй preg_quote() — она экранирует все спецсимволы.
/Q и прочее не надо. Алсо ты перепутал слеш / с бекслешем \
Алсо, если тебе надо просто заменить слово без регулярок, используй str_replace или strtr.
>>371588
А ты только начал? Решай пока простые задачки: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
Когда их решишь, дадим что-нибудь на работу с ДОМ и событиями, а может арканоид.
>>371613
Нет варианта
array-like
. Например arguments должно опозноваться ккак array-like. Алсо, для null и undefined хватило бы проерки через ===.Насчет «как работает» — изучай прототипы, это бстро не объяснить. Если кратко, то мы берем метод toString у Object и подсовываем ему наше значение вмеcто this.
>>371616
Есть мануал php: https://php.net/manual/ru/index.php
Если книги, написаны в первом посте треда.
Можно просто в переменной, в твоем случае.
$pdo = new PDO ....
$guestbook = new Guestbook($pdo);
> а потом серелизовать этот объект куда-нибудь или я не в те дебри лезу?
Соединение с БД, как и другие ресурсы вроде файловых потоков или сетевых соединений, нельзя сериализовать.
>>371562
Чаовые пояса. Проверь, какая date_default_timezone стоит в php.ini
>>371564
Используй preg_quote() — она экранирует все спецсимволы.
/Q и прочее не надо. Алсо ты перепутал слеш / с бекслешем \
Алсо, если тебе надо просто заменить слово без регулярок, используй str_replace или strtr.
>>371588
А ты только начал? Решай пока простые задачки: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
Когда их решишь, дадим что-нибудь на работу с ДОМ и событиями, а может арканоид.
>>371613
Нет варианта
array-like
. Например arguments должно опозноваться ккак array-like. Алсо, для null и undefined хватило бы проерки через ===.Насчет «как работает» — изучай прототипы, это бстро не объяснить. Если кратко, то мы берем метод toString у Object и подсовываем ему наше значение вмеcто this.
>>371616
Есть мануал php: https://php.net/manual/ru/index.php
Если книги, написаны в первом посте треда.
Вполне реально самому написать на JS. Ничего сверхсложного там нет.
>>371625
Да, если кто из анонов понимает английский, заходите, даже если вы начинающий, пробуйте свои силы.
>>371627
Можно. Смысл — чтобы повторно использлвать код.
Не объединяют так как библиотек огромное число, тысячи, они обновляются, если это объединить это будут гигабайты кода.
> которых мне кажется достаточно.
Тебе кажется.
>>371629
С jQuery написание код может быть (а может и не быть) быстрее. Соответсвенно, Вася на jqгукн написал за 3 минуты работающий код и получил деньги пока Петя пишет свою быструю идеальную библиотеку.
Сам по себе jQuery не особо тормозной — просто не все умеют его использовать праивльно.
Тормозит обычно не JS, а взаимодейтсвие с DOM, прорисовка, лейаут, пересчет css свойств, загрузка и распаковка больших картинок, например, движение по экрану большой картинки создает большую нагрузку на браузер независимо от того, через ваниллу или джейквери это делается.
В общем, тут нужно понимание устройства браузера и умение пользоваться профайлером в первую очередь.
Тест на сайте синтетический и бессмысленный — никто не будет искать тег 1000 раз в секунду.
Вполне реально самому написать на JS. Ничего сверхсложного там нет.
>>371625
Да, если кто из анонов понимает английский, заходите, даже если вы начинающий, пробуйте свои силы.
>>371627
Можно. Смысл — чтобы повторно использлвать код.
Не объединяют так как библиотек огромное число, тысячи, они обновляются, если это объединить это будут гигабайты кода.
> которых мне кажется достаточно.
Тебе кажется.
>>371629
С jQuery написание код может быть (а может и не быть) быстрее. Соответсвенно, Вася на jqгукн написал за 3 минуты работающий код и получил деньги пока Петя пишет свою быструю идеальную библиотеку.
Сам по себе jQuery не особо тормозной — просто не все умеют его использовать праивльно.
Тормозит обычно не JS, а взаимодейтсвие с DOM, прорисовка, лейаут, пересчет css свойств, загрузка и распаковка больших картинок, например, движение по экрану большой картинки создает большую нагрузку на браузер независимо от того, через ваниллу или джейквери это делается.
В общем, тут нужно понимание устройства браузера и умение пользоваться профайлером в первую очередь.
Тест на сайте синтетический и бессмысленный — никто не будет искать тег 1000 раз в секунду.
Например, можно сделать простой тест: скроллим программно страницу на допустим 10-15 пикселей за раз и считаем сколько прокруток в секунду мы успеваем сделать. Хороший сайт выдаст 60 fps (что соответсвтует частоте обновления монитора), а тяжелый будет лагать. Тяжелых кстати появляется все больше и больше.
То есть ты причину тормозов ищешь не там. Не в джейквери она.
>>371637
> так как надо убедится что текущий, следующий и предыдущий символ не является точкой.
Разбей текст на массив предложений и собирай сочетания в них. Тогжа точку проверять не надо будет.
> Ну и заодно исправленная Лиличка
Все верно.
>Решай пока простые задачки: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
Оп, а я сижу тут без задач, жду, когда ты мне подкинешь новых, а тут оказывается еще есть. Про страны с помощью ООП лучше?
Реально сложная.
Есть еще такая статья: http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%D0%B5
Вообще, можно упростить себе жизнь и сделать простой перебор коминаций. То есть перебираем все комбинации купюр по очереди, и запоминаем те которые дают нужную сумму, потом из них выбираем лучшую.
То есть просто по очереди перебираем:
0 0 0 0
0 0 0 1
0 0 0 2
...
0 0 0 N
0 0 1 0
...
0 0 M N
0 1 0 0
...
Q P M N
Здесь Q, P, M, N - максимальное имеющееся число купбр каждого вида.
Этот алгоритм правда не такой эффективный как динамическое программирование.
Реально сложная.
Есть еще такая статья: http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%D0%B5
Вообще, можно упростить себе жизнь и сделать простой перебор коминаций. То есть перебираем все комбинации купюр по очереди, и запоминаем те которые дают нужную сумму, потом из них выбираем лучшую.
То есть просто по очереди перебираем:
0 0 0 0
0 0 0 1
0 0 0 2
...
0 0 0 N
0 0 1 0
...
0 0 M N
0 1 0 0
...
Q P M N
Здесь Q, P, M, N - максимальное имеющееся число купбр каждого вида.
Этот алгоритм правда не такой эффективный как динамическое программирование.
Или же, в этом алгоритме, надо при расчете сколькими купюрами можно выдать сумму, хранить где-то и остаток купюр.
>>371646
> $current = each($order);
Ой, как ты сложно все сделал. Проще сделать по другому:
- обходим массив циклом вроде foreach
- считаем в переменной порядковый номер элемента (то есть номер слога считалочки)
- как только доходит до определенного номера — удалем элемент, сбрасываем счетчик.
Будет гораздо проще.
>>371663
> После выплаты через 13 месяц осталось выплатить -3729.84
Это надо исправить, чтобы не было отрицатльных сумм.
> $i*5000
Вместо 5000 надо подставить имя переменной.
Ответ вроде сходится.
>>371669
Я наверно переставил формулы чтобы 0 градусов соответствовал верхней точке, а не правой.
А так, решено верно.
Качество круга достигается подбоором радиуов и коэффициентов.
>>371684
Тут достаточно нескольких if:
Если (первый банк < второй банк и первый банк < третий банк) {
советую первый банк
}
Или же можно отсортировать массив банков по уменьшению стоимости и выбрать верхнюю строку.
> PHP Notice: Undefined variable: commission in /home/Jzjyil/prog.php on line 8
Это надо исправить. Ты обращаешься к несуществующей в тот момент переменной, там опечатка в имени.
Или же, в этом алгоритме, надо при расчете сколькими купюрами можно выдать сумму, хранить где-то и остаток купюр.
>>371646
> $current = each($order);
Ой, как ты сложно все сделал. Проще сделать по другому:
- обходим массив циклом вроде foreach
- считаем в переменной порядковый номер элемента (то есть номер слога считалочки)
- как только доходит до определенного номера — удалем элемент, сбрасываем счетчик.
Будет гораздо проще.
>>371663
> После выплаты через 13 месяц осталось выплатить -3729.84
Это надо исправить, чтобы не было отрицатльных сумм.
> $i*5000
Вместо 5000 надо подставить имя переменной.
Ответ вроде сходится.
>>371669
Я наверно переставил формулы чтобы 0 градусов соответствовал верхней точке, а не правой.
А так, решено верно.
Качество круга достигается подбоором радиуов и коэффициентов.
>>371684
Тут достаточно нескольких if:
Если (первый банк < второй банк и первый банк < третий банк) {
советую первый банк
}
Или же можно отсортировать массив банков по уменьшению стоимости и выбрать верхнюю строку.
> PHP Notice: Undefined variable: commission in /home/Jzjyil/prog.php on line 8
Это надо исправить. Ты обращаешься к несуществующей в тот момент переменной, там опечатка в имени.
Это хорошо, если ты умеешь перехватывать и читать http-соединения.
Порт можно не указывать в URL, обязательные только протокол и хост (что ты в принципе и написал).
> $_GET параметры
Официально это называется query string
> $_POST передается в заголовке
Не в заголовках, а в теле запроса. У запроса (как и у ответа) тоже может быть тело, в нем пересылаются post-данные. Там есть 2 способа кодировкия, задаются аттрибутом enctype:
http://htmlbook.ru/html/form/enctype
http://pyramidin.narod.ru/html401/forms.html#form-content-type
urlencoded — это кодирование аналогичное get-параметрам, объединенным через знак &
multipart — это MIME кодирование, аналогичное используемому в электронной почте для хранения вложений в письме
Некоторые используют и другие способы, например шлют в теле запроса XML или JSON файл. Но это надо из яваскрипта отправлять, форма такие запросы отправлять не умеет.
> Ну и # означает якорь на странице который задается в теге <a>, который перекинет нас к нужному месту на странице.
Еще якорь используется для передачи данных яваскрипту.
> 5. GET - через адресную строку. POST
POST использует тело запроса. В заголовок неудобно много данных класть.
Из других методов есть HEAD который просит отдать только первую строку и заголовки, без тела страницы. Есть PUT/DELETE, используются в REST API.
> Вот тут вообще не знал, но почитал.
3 части - это первая строка, заголовки и тело. Тело необязатеьно.
В кодах ответов главное помнить, что обозначает первая цифра (она может быть от 1 до 5).
А так, в общем верно, вижу, что понимаешь. Попробуй еще своей программой пост-запросы посмотреть, в том числе с приложенным файлом.
Это хорошо, если ты умеешь перехватывать и читать http-соединения.
Порт можно не указывать в URL, обязательные только протокол и хост (что ты в принципе и написал).
> $_GET параметры
Официально это называется query string
> $_POST передается в заголовке
Не в заголовках, а в теле запроса. У запроса (как и у ответа) тоже может быть тело, в нем пересылаются post-данные. Там есть 2 способа кодировкия, задаются аттрибутом enctype:
http://htmlbook.ru/html/form/enctype
http://pyramidin.narod.ru/html401/forms.html#form-content-type
urlencoded — это кодирование аналогичное get-параметрам, объединенным через знак &
multipart — это MIME кодирование, аналогичное используемому в электронной почте для хранения вложений в письме
Некоторые используют и другие способы, например шлют в теле запроса XML или JSON файл. Но это надо из яваскрипта отправлять, форма такие запросы отправлять не умеет.
> Ну и # означает якорь на странице который задается в теге <a>, который перекинет нас к нужному месту на странице.
Еще якорь используется для передачи данных яваскрипту.
> 5. GET - через адресную строку. POST
POST использует тело запроса. В заголовок неудобно много данных класть.
Из других методов есть HEAD который просит отдать только первую строку и заголовки, без тела страницы. Есть PUT/DELETE, используются в REST API.
> Вот тут вообще не знал, но почитал.
3 части - это первая строка, заголовки и тело. Тело необязатеьно.
В кодах ответов главное помнить, что обозначает первая цифра (она может быть от 1 до 5).
А так, в общем верно, вижу, что понимаешь. Попробуй еще своей программой пост-запросы посмотреть, в том числе с приложенным файлом.
Это да, только печатать надо быстро, а то бывет таймаут у сервера небольшой.
Ну и использовать удобнее программу типа putty.
>>371738
В данном случае конкатенировать. Вставлять можно только переменные, элементы массивов, а не сложные выражения.
>>371765
deal with it
Однобайтные кодировке бесперспективны так как в них всего 256 символов.
>>371795
Считает неприавльно:
> Плата у SoftBank: 54136.79 руб.
А должно быть около 61270.
Если подставить сумму кредита в 1000 то выходят отрицательные числа: http://ideone.com/k4HHbY
Ни в коем случае не используй. В JS достаточно своих функций и библиотек.
>>371800
Не знаю, не читал, к сожалению. А она не очень старая? ООП используется? Если старая, то придется потом phptherightway почитать.
>>371820
Знать сам PHP, включая ООП. Чт касается битрикса, наверно можно по мануалам в нем разобраться, их там много.
>>371831
Можно без. Ты проси еще, если все решил, только пиши что ты эти уже решал и до какого раздела в учебнике дошел, а то я же не знаю.
Если тебе не надоест решать задачки, то после ООП можем перейти к событиям и дом, сделаем какой-нибудь виджет например, а дальше пойдем популярные у фронтендщиков библиотеки изучать.
> А должно быть около 61270.
Исправил баг с маленьким кредитом.
Не могу понять как там получить 61270.
Вот мой алгоритм:
1) Каждый месяц долг увеличивается на процент и комиссию. 2) Если школьник может сразу погасить долг (долг <= кол-во денег на руках), то добавляем к общему платежу оставшуюся часть кредита.
Иначе (если долг больше денег на руках) уменьшаем долг на кол-во денег школьника и добавляем деньги школьника к общему платежу.
ideone.com/CAw9pd
Алсо, переписал RGhost на Yii: https://github.com/ShadoWolf/RGhostOnYii
>Это надо исправить, чтобы не было отрицатльных сумм.
Эм, ещё одну проверку влепить? И сразу вопрос - можно ли внутри оператора echo вычислять значения выражений? Т.е. возможно ли что-то вроде
echo "abs($someVar$)";
?Переменную подставил, правда, в таком небольшом объёме кода цифры как-то понятнее смотрелись, но так да, согласен.
>Или же можно отсортировать массив банков по уменьшению стоимости и выбрать верхнюю строку.
Окей, попробую
ksort()
Очепятку поправил.
Строго говоря там 61268.73 рублей, десятые доли копейки в банках никто не считает. Я даже подозреваю, что и копейки они могут округлять до десятков, то есть с точки зрения этого представления одной цифры после запятой.
http://ideone.com/OEJnn3 (задание внутри)
> Разбей текст на массив предложений и собирай сочетания в них. Тогжа точку проверять не надо будет.
http://ideone.com/PTIMd2
>>371638
> Или же, в этом алгоритме, надо при расчете сколькими купюрами можно выдать сумму, хранить где-то и остаток купюр.
ОП! ОП! ОП! МАТЬ ЕГО ОНО РАБОТАЕТ!!!!!
http://ideone.com/Kf8L5g
Господи, это лучший день в моей жизни.
>>371646
> Ой, как ты сложно все сделал. Проще сделать по другому:
Зато с перемещением указателя по массиву разобрался=)
Версия попроще - http://ideone.com/bg4uDQ
> Порт можно не указывать в URL, обязательные только протокол и хост (что ты в принципе и написал).
Можно не указывать, но порт обязателен иначе как ОС(или кто там отвечает за это) поймет к какому из сотни запущенных процессов отправить полученные данные? Другое дело что программа все делает за нас, но в жизни сталкивался с тем что порт хоть был и стандартный 8080, но не настолько стандартный как 80, тут то браузер с своей автоподстановкой и подвел.
> В кодах ответов главное помнить, что обозначает первая цифра (она может быть от 1 до 5).
В вики на удивление годная стать по HTTP. 1- информационные(вот его забыл, подсмотреть пришлось, остальные довольно просты) 2 - все ок, 3 - редирект, 4 - ошибка клиента, 5 - ошибка сервера
>>371872
Сколько времени в день и сколько месяцев занимался ?
Я понимаю что это вопрос из разряда - за сколько я накачаюсь, от подснежника. Это целиком и полностью зависит от человека, его упорства и т.д. и т.п, но все же.
>Сколько времени в день и сколько месяцев занимался
Четыре месяца, почти всё свободное от работы сутки/трое время. На первом этапе очень помог друг пхпист и вообще друзья очень мотивировали, потом этот тред и ОП. Это даже больше их заслуга, чем моя, у самого вряд ли бы что-то получилось.
> Господи, это лучший день в моей жизни.
Не долго песенка играла, не долго фраер танцевал. Попробовал количество купюр менять, начинает выдавать черт пойми что.
Хотя если менять сумму для выдачи то все окей. Странно. Но всяко лучше чем когда вообще ничего не работает.
>>371883
И прямо целые сутки кодил? У меня не выходит. Могу день-два позаниматься часов по 12, а потом неделю не могу заставить усесться себя что то делать, желания вообще ноль. Сейчас тестирую систему - 6 часов написания кода в сутки. Чтение всякой литературы не в счет, оно вообще не напрягает в отличии от решения задач. Если каждый день заниматься меньше но регулярно, то выходим намного больше чем заниматься много, но пару раз в неделю.
>У меня не выходит.
Попробуй чередовать с физическим трудом, делая перерывы время от времени.
Да не, спасибо. Я и так через день тренируюсь. Не готов я работать с утра до ночи забыв про всё. Если конечно что то интересное попадается то можно и засидеться, а так - лучше потребуется больше месяцев, но зато буду получать удовольствие от жизни, самоограничения полезны, но для меня все таки твой вариант с тем что бы работать все время слишком хардкорен.
Если ты будешь заниматься пару суток подряд по 12 часов, то само-собой тебе это надоест и потом долго не будет хотеться этим заниматься. Перерывы просто почаще нужны, хотя ты так судя по всему и делаешь.И я не тот успешный няша.
Ну да, пару раз на два-три дня клинило и вообще не мог заставить себя что-то делать. А вообще я подразумевал, что "всё свободное время" - это вместе с теорией, форумами, написанием кода. То есть так или иначе весь день был занят пхп. Ну с перерывами, конечно. В игори не играл, нет.
Алсо, я очень тугой. Даже тормозной.
http://jsbin.com/gikeg/2/edit?js,console
Задача про популяцию.
> Если тебе не надоест решать задачки
Не надоест. Энтузиазм какой-то появился, могу днями и ночами решать задачи, если бы не работа.
> и до какого раздела в учебнике дошел
Если ты про learn.javascript.ru , то в части 1 в разных темах. Только прошлые темы я не уверен, что хорошо усвоились.
Вот темы, которые я бы хотел подтянуть:
1. Хранение данных в замыкании, модули (и вообще побольше с замыканием задач)
2. Статические переменные
3. Приватные свойства
4. Функции-конструкторы
5. Все, что касается this
6. Про прием "декоратор"
7. toString
8. [[Class]]
9. А дальше можно задачи по темам из раздела Разные темы.
А потом можно и ООП.
Хотелось бы на практике запомнить методы у массивов, объектов и т.д. А то приходится часто заглядывать в учебник.
Ну что, ОП, поднатаскай меня по этим темам, чтобы я был в них специалистом. Хорошо бы было, если бы каждая тема встречалась в задачах других тем, чтобы до автоматизма довести.
http://jsbin.com/gikeg/2/edit?js,console
Задача про популяцию.
> Если тебе не надоест решать задачки
Не надоест. Энтузиазм какой-то появился, могу днями и ночами решать задачи, если бы не работа.
> и до какого раздела в учебнике дошел
Если ты про learn.javascript.ru , то в части 1 в разных темах. Только прошлые темы я не уверен, что хорошо усвоились.
Вот темы, которые я бы хотел подтянуть:
1. Хранение данных в замыкании, модули (и вообще побольше с замыканием задач)
2. Статические переменные
3. Приватные свойства
4. Функции-конструкторы
5. Все, что касается this
6. Про прием "декоратор"
7. toString
8. [[Class]]
9. А дальше можно задачи по темам из раздела Разные темы.
А потом можно и ООП.
Хотелось бы на практике запомнить методы у массивов, объектов и т.д. А то приходится часто заглядывать в учебник.
Ну что, ОП, поднатаскай меня по этим темам, чтобы я был в них специалистом. Хорошо бы было, если бы каждая тема встречалась в задачах других тем, чтобы до автоматизма довести.
В ассоциативном массиве нам же неважна позиция? А обычный как я понял реализован как ассоциативный с целочисленными ключами по порядку.
Нашел проблему. Экранировка htmlspecialchars() кодирует > в $gt; теперь все норм.
http://ideone.com/foPROa
http://ideone.com/ifP8sQ
конец списка
Что происходит в этом:
$SUM = ($N & ($N % 2 ? 0 : ~0) | ( (($N & 2)>>1) ^ ($N & 1) ) );
фрагменте и нахуй так жить?
>I often use ($var & 1) in my code, which returns true if $var is an odd number and false if it's an even number.
Проиграл.
А что значит >>? И зачем там OR (если я правильно понял значение |). Если это действительно OR, то как оно срабатывает?
http://php.net/manual/en/language.operators.bitwise.php
Вроде разобрался. Потом доразберу само выражение.
Гугли побитовые операции.
Он поехавшая крестоблядь.
($var & 1) при $var = 4:
00000100 (4 в двоичной системе счисления)
&
00000001 (1 в двоичной системе счисления)
--------
00000000 == 0 == false (сравниваются биты: 1 & 1 = 1; 1 & 0 = 0; 0 & 1 = 0; 0 & 0 = 0)
($var & 1) при $var = 3:
00000011 (4 в двоичной системе счисления)
&
00000001 (1 в двоичной системе счисления)
--------
00000001 != 0 == true (сравниваются биты: 1 & 1 = 1; 1 & 0 = 0; 0 & 1 = 0; 0 & 0 = 0)
| делает похожее, что и &, только: 1 | 1 = 1; 1 | 0 = 1; 0 | 1 = 1; 0 | 0 = 0.
<< и >> сдвиг влево и вправо на N знаков:
00000100 (4 в двоичной) << 1 == 00001000 (8 в двоичной).
00000100 (4 в двоичной) >> 1 == 00000010 (2 в двоичной).
Как следствие, при сдвиге на 1 влево число целочисленно делится на 2, вправо - умножается.
Только это не нужно (нужно помнить много нюансов касательно формата хранения чисел, отведённой памяти и т.д.).
Выгода от того, что ты используешь ($var & 1) вместо готовой операции % очень сомнительна (как минимум это байтоёбство очень неинтуитивно).
выполнил некоторые задания оттуда,
не все, некоторые уже делал на других языках, поэтому решил не делать.
что ещё можно почитать про php или какой нибудь фреймворк, например WordPress?
Как тогда изменить, к примеру, третий символ строки? Только регулярками?
Вот есть страничка news.php в ней есть ссылка на картинку
<img src="image/thumbs/1.jpg (Самой картинки там нет.)"/>
есть файл htaccess
там есть такие строки :
AddDefaultCharset utf8
RewriteEngine on
rewriteCond image/thumbs/%{REQUEST_FILENAME} !-f
rewriteRule (.*) tryCatchImage.php?$1
Не могу добиться что бы в tryCatchImage.php передалась ссылка на картинку.image/thumbs/1.jpg - Как это передать?!
http://ideone.com/18HvQ6 вот как пока что выглядит код, я хочу убрать пробелы, для этого я сравниваю каждый символ с пробелом, и если совпадения нету скливаю строку
возьми свой палиндром подели на 2 что бы получилось целое число, в цикле сравнивай символ из первой части с символом из второй части.
Условия после if нужно заключать в скобки, переменная $textWithoutSpace вообще не ясно для чего, строку в цикле нужно проверять до половины её длинны, а не полностью. Вообщем читай подсказки Опа к этой задаче в том же уроке.
Если ввести строку не палиндром, ответ даёт неверный.
Функциям str_replace и mb_strtolower нужно передавать какие-нибудь параметры, как и всем остальным, иначе как они узнают, на какие символы и что заменять и какую строку переводить в нижний регистр? Кури документацию или справочник опа. В цикле при нулевом i, функция mb_substr($text, -$i) будет возвращать нулевой символ соответственно, а при второй итерации уже минус первый, то есть вернет букву "а" два раза: сначала с начала строки, а потом с конца.
Алсо, не увидел что в mb_substr($text, -$i) не указана цифра 1 после -$i, поэтому она будет возвращать всю строку от -$i символа и до конца строки, а не одну букву.
И да, в 15 строке не обращайте на переменную $halflength внимание, я её исправляю, но сохранить не получается, ошибка не в ней.
Как мне кажется всё исправил, но всё равно работает неверно. Ну же, анончики, помогите.
Перечитай еще раз урок на странице, на которой задача. Функция str_replace принимает три параметра, а у тебя только один.
Код показывай.
Как побороть это чувство? Чем себя утешать?
смотри, в цикле for нужно указать начальное значение переменной, то есть for($i = 1, $n = 1).
И посмотри какие аргументы в str_replace передавать надо.
Все верно, только не $i=1, а $i=0 в данном случае, потому что ему понадобится нулевой символ.
>>372056
Спасибо. Получилось, но объясните мне, пожалуйста, почему если в строку for ($i=0,$n=20; $i < $halfLength; $i++,$n--) вместо $n=20 поставить Sn=$length код работает неверно ? Ленгт текста я делаю уже после того как вырезал пробела, а значит числа должны быть одинаковые, разве нет ? http://ideone.com/a5Hzab
Сначала пытаешься сделать сам.
Первая буковка строки имеет индекс 0.
Подсказка:
У mb_substr можно обращаться к последнему символу так:
mb_substr($text, -1, 1)
а к первому так: mb_substr($text, 0, 1)
Тебе хватит одной переменной $i в цикле, только нужно придумать как преобразовать 0 в -1, 1 в -2 и т.д.
Решение: http://ideone.com/0Mp3eb
Смотри, длина строки "Бака - не собака." - 17 символов.
На деле - первый символ "Б" имеет индекс 0.
Последний символ имеет индекс (17 - 1) = 16.
уходи
yii
Что не нужно кодить самостоятельно: http://m.habrahabr.ru/post/230737/
Список полезных библиотек для PHP (огромный, обновляемый): https://github.com/ziadoz/awesome-php — добавьте себе в закладки, может пригодится.
>>371844
Теперь все верно решено. Я вижу, ты разобрался.
>>371846
Нет. Вроде как-то можно поменять имя vendor, но я бы не советовал это делать. В твоем случае, как я понимаю, речь о Юи.
Yii хотя и непросто поставить через composer (из-за его структуры папок), но это реально сделать. Я помню, один анон делал: https://github.com/Purplepeak/Testhub
Посмтри, у него в composer.json прописан yii, то есть он ставится в vendor/. Но он переделал некоторые файлы, например, index.php, чтобы тот обращался к папаке vendor, потом в конфиге что-то меня (basePath может быть?). Я не знаю, сам он додумался или где-то взял образец.
У него, правда не все гладко: расширения к Yii ставятся в protected/extensions, а не в vendor. Если Юи позволяет задать папку для расширений, можно было бы попробовать засунуть и тоже в vendor и ставить через композер.
Есть еще официальная статья, из которой толком ничего не понять: http://www.yiiframework.com/wiki/392/creating-yii-applications-with-composer/
В Yii 2 вроде обещали покончить с бардаком и сделать все как принято, и поддержку композера, и PHP стандартов, и все остальное.
>можно ли внутри оператора echo вычислять значения выражений? Т.е. возможно ли что-то вроде
echo "abs($someVar$)";
По поводу rghost — для такой простой задачи Yii слишком большой. Он подходит больше для сайтов с админкой, виджетами, не знаю, сайт объявлений или сайт агенства недвижимости какой-нибудь. А так, ты и 10% возможностей Юи наверно не узнал.
Также, в твоем случае если скачать репозиторий ничего не заработает — так как Yii надо установить отдельно (причем еще в правильную папку).
assets — автогенерируемая папка, ее содержимое надо в gitignore добавить, чтобы не замусоривать репозиторий
thumbnails/uploads лучше в другую папку перенести (и тоже добавить в гитигнор)
Зачем пустая папка themes? Она точно нужна?
Алсо, меня напрягают имена файлов с подчеркиваниями в начале. Я уверен, можно обойтись без них, ибо смотрятся они ужасно. хуже только подчеркивания в конце идентификатора.
> 'htmlOptions' => array('enctype' => 'multipart/form-data')
Форма при наличии файла сама эту опцию не ставит? В ZF например ставится само.
> <?php echo $model->name; ?>
Тут нету XSS? Паста по теме если что: https://gist.github.com/anonymous/52adda0113428b274c64
> Yii::app()->params['web_thumbnail_dir'].'thumb_'.$model->file_path
Для этого должен быть метод или функция
Форма поиска из кучи полей — это может хорошо для изучения форм, но кошмар для пользователя (напоминает ГосПоиск: http://web.archive.org/web/20140517132920/http://gossearch.ru/ ). Бери пример с Гугл и Яндкеса, а не с Госпоиска.
Если ты не изучал twig (и у тебя есть время на его изучение), можешь его прикрутить — это годный современный шаблонизатор, скопированный с питоновской jinja
> <meta name="language" content="ru" />
Слеш в конце тега в HTML не ставится
application.log надо в гитигнор
Само приложение не смотрел, смотрел только код. Могу завтра/послезавтра глянуть, если хочешь.
По поводу rghost — для такой простой задачи Yii слишком большой. Он подходит больше для сайтов с админкой, виджетами, не знаю, сайт объявлений или сайт агенства недвижимости какой-нибудь. А так, ты и 10% возможностей Юи наверно не узнал.
Также, в твоем случае если скачать репозиторий ничего не заработает — так как Yii надо установить отдельно (причем еще в правильную папку).
assets — автогенерируемая папка, ее содержимое надо в gitignore добавить, чтобы не замусоривать репозиторий
thumbnails/uploads лучше в другую папку перенести (и тоже добавить в гитигнор)
Зачем пустая папка themes? Она точно нужна?
Алсо, меня напрягают имена файлов с подчеркиваниями в начале. Я уверен, можно обойтись без них, ибо смотрятся они ужасно. хуже только подчеркивания в конце идентификатора.
> 'htmlOptions' => array('enctype' => 'multipart/form-data')
Форма при наличии файла сама эту опцию не ставит? В ZF например ставится само.
> <?php echo $model->name; ?>
Тут нету XSS? Паста по теме если что: https://gist.github.com/anonymous/52adda0113428b274c64
> Yii::app()->params['web_thumbnail_dir'].'thumb_'.$model->file_path
Для этого должен быть метод или функция
Форма поиска из кучи полей — это может хорошо для изучения форм, но кошмар для пользователя (напоминает ГосПоиск: http://web.archive.org/web/20140517132920/http://gossearch.ru/ ). Бери пример с Гугл и Яндкеса, а не с Госпоиска.
Если ты не изучал twig (и у тебя есть время на его изучение), можешь его прикрутить — это годный современный шаблонизатор, скопированный с питоновской jinja
> <meta name="language" content="ru" />
Слеш в конце тега в HTML не ставится
application.log надо в гитигнор
Само приложение не смотрел, смотрел только код. Могу завтра/послезавтра глянуть, если хочешь.
Раз уж я тебя поймал, можешь объяснить кое-что? Во многих языках есть реализация механизма исключений. Когда нужно использовать его, а когда просто полагаться на true/false?
К примеру у нас есть 2 версии метода сохранения в бд. Первая версия в случае ошибки возвращает false, а вторая - кидает исключение. Какую и когда использовать?
Оп, у тебя есть где-нибудь список всех твоих паст на гитхабе? Хочется прочесть, а часть из них анонимна.
В функцию передается не массив, а его копия, меняя ее ты не меняешь исходный массив. Только объекты передаются по ссылке, а все остальное копируется по умолчанию (если не ставить &)
>>371854
> И сразу вопрос - можно ли внутри оператора echo вычислять значения выражений?
Нет. Только переменные и элементы массивов.
Ты ссылку забыл приложить. Или ты в старой программе поменял? Не, не поменял. А где решение тогда?
>>371856
Вообще, не. В финансовой сфере принято брать 4 цифры после запятой (то есть сотые доли копеек), чтобы снизить влияние округлений на сходимость балансов (или не поэтому? Есть тут экономисты? Поясните плиз).
>>371869
Она находит только первую ошибку. Переделай и использованием preg_match_all чтобы искало все.
Не видит ошибки: http://ideone.com/dt8BGJ
Видит ошибку в 2 вопр. знаках: http://ideone.com/5ZdcVC
А вообще, да, ты на верном пути, только preg_match_all прикрути и регулярку подправь.
>>371872
Это хорошо. Меня всегда радуют такие новости, значит не зря мы старались. Но не расслабляйся, а продолжай изучать все, что можешь, так как потом тебе будет лень развиваться и останешься на всю жизнь на этой работе.
>>371873
Действительно.
>>371879
По поводу подсчета слов.
Имей в виду, алгоритм в removeRepetition имет сложность O(N2) то есть для 10 000 пар будет выполнено 100 000 000 шагов цикла, что многовато. Для поиска совпадений в больших массивах надо использовать оптимизации, например, использовать поиск по ключу вроде isset($a[$x]) — он работает без полного перебора массива. Тут этого можно не делать, но имей в виду.
> foreach ($stopWords as $word) {
> $input = preg_replace("/\\b$word\\b/u", '', $input);
Не проще ли удалять стоп-слова из массива после разбиения на слова через array_diff?
> preg_split('/\./',
Стандартных знаков-разделителей предложений три: .!?
> if ($key == (count($words) - 1)) {
Раз ты работаешь с числовыми ключами массива, логично наверно for использовать. Тогда и это условие не понадобится — его можно в for прописать.
Зачем if и проверка через регулярку в removeRepetition, я не очень понял. Нельзя ли использовать общий алгоритм для всех случаев, например, разбиение на слова или хитрый хак — поиск подстроки таким образом:
mb_strpos(" {$haystack} ", " {$needle} ");
> $matches = array_intersect($oneWord, $severalWords);
Можно использоваь in_array
> if ($top == '') {
Это же массив, проверяй через if (!$top) или if (!count($top)) или if (count($top) == 0)
> } elseif (count($top) == 1) {
> foreach ($top as $words => $count) {
Ох, нехорошо тут фейковый цикл смотрится. Лучше бы по-другому, например через $value = reset(...); $key = key(...);
Разбиение на слова работает не идеально (там естьодна строка в пустым словом - это может быть неразрывный пробел: http://ru.wikipedia.org/wiki/%D0%9D%D0%B5%D1%80%D0%B0%D0%B7%D1%80%D1%8B%D0%B2%D0%BD%D1%8B%D0%B9_%D0%BF%D1%80%D0%BE%D0%B1%D0%B5%D0%BB ): http://ideone.com/9YC6hP
А вообще, да, ты на верном пути, только preg_match_all прикрути и регулярку подправь.
>>371872
Это хорошо. Меня всегда радуют такие новости, значит не зря мы старались. Но не расслабляйся, а продолжай изучать все, что можешь, так как потом тебе будет лень развиваться и останешься на всю жизнь на этой работе.
>>371873
Действительно.
>>371879
По поводу подсчета слов.
Имей в виду, алгоритм в removeRepetition имет сложность O(N2) то есть для 10 000 пар будет выполнено 100 000 000 шагов цикла, что многовато. Для поиска совпадений в больших массивах надо использовать оптимизации, например, использовать поиск по ключу вроде isset($a[$x]) — он работает без полного перебора массива. Тут этого можно не делать, но имей в виду.
> foreach ($stopWords as $word) {
> $input = preg_replace("/\\b$word\\b/u", '', $input);
Не проще ли удалять стоп-слова из массива после разбиения на слова через array_diff?
> preg_split('/\./',
Стандартных знаков-разделителей предложений три: .!?
> if ($key == (count($words) - 1)) {
Раз ты работаешь с числовыми ключами массива, логично наверно for использовать. Тогда и это условие не понадобится — его можно в for прописать.
Зачем if и проверка через регулярку в removeRepetition, я не очень понял. Нельзя ли использовать общий алгоритм для всех случаев, например, разбиение на слова или хитрый хак — поиск подстроки таким образом:
mb_strpos(" {$haystack} ", " {$needle} ");
> $matches = array_intersect($oneWord, $severalWords);
Можно использоваь in_array
> if ($top == '') {
Это же массив, проверяй через if (!$top) или if (!count($top)) или if (count($top) == 0)
> } elseif (count($top) == 1) {
> foreach ($top as $words => $count) {
Ох, нехорошо тут фейковый цикл смотрится. Лучше бы по-другому, например через $value = reset(...); $key = key(...);
Разбиение на слова работает не идеально (там естьодна строка в пустым словом - это может быть неразрывный пробел: http://ru.wikipedia.org/wiki/%D0%9D%D0%B5%D1%80%D0%B0%D0%B7%D1%80%D1%8B%D0%B2%D0%BD%D1%8B%D0%B9_%D0%BF%D1%80%D0%BE%D0%B1%D0%B5%D0%BB ): http://ideone.com/9YC6hP
> ОНО РАБОТАЕТ!!!!!
Ну круто, что. А у меня такой вопрос:
Вот мы для решения задачи делаем число шагов, равное (сумма × число видов купюр) (довольно много). Нельзя ли сделать ленивое вычисление элементов массива, то есть вычислять элемент массива только когда он нужен, а не заполнять весь массив заранее? Даст ли это профит? Наверняка даст.
Простой способ сделать ленивые вычисления — это рекурсия (вызов функцией самой себя) + мемоизация (мемоизация — значит что мы сначала смотрим нет ли в массиве уже вычисленного значения, и только если его нет, вызваем функцию). Не хочешь попробовать? Для проверки что все стало лучше, можно добавить счетчик шагов, на основе глобальной переменной.
С рекурсией, правда, есть подвох — в PHP ее глубина не может превышать 100. Чтобы обойти это огграничение, надо заменить рекурсию на что-то другое, например, очередь.
То есть мы пишем функцию, назовем ее например getExchangeForSum($sum) которая возвращает число купюр и остаток купюр, то есть то же самое, что хранилось бы в элементе $canIssue[$sum]. Мы заменяем чтение из массива вызовом функции, которая либо берет элемент из массива, есои он есть, либо вычисляет его и кладет туда, если нет.
Ну и потом у меня есть еще идея по оптимизации — в алгоритм мы каждый раз вычитаем по однйо купюре разных типов и прбуем варианты, а почему бы не попробовать вычесть сразу много купюр, число которых можно приблизительно ценить (а только потом пробовать остальные варианты).
Что скажешь? или слишком сложно, ну её эту задачу?
Считалка — все верно.
> Можно не указывать, но порт обязателен иначе как ОС(или кто там отвечает за это) поймет к какому из сотни запущенных процессов отправить полученные данные?
Для протокола http определен порт 80 по умолчанию, потому номер порта является необязательной частью URL — браузер догадается сам его подставить. Я наверно не очень верно сформулировал вопрос, вопрос был именно «что нужно писать, а что можно не писать в URL».
> порт хоть был и стандартный 8080
Это нестанлдртный порт. Стандартный только 80.
>>371887
Ах, вот как! Ну что, значит давай отлаживать почему не работает. Я вот тут вижу подозрительное место:
> $canIssue[$sum][0] = $canIssue[$sum - $bill][0] + 1;
> $billsTmp[$bill] = $canIssue[$sum - $bill][1][$bill];
Если мы находим более выигрышный вариант, мы меняем элемент 0 в массиве (число купюр), а элемент 1 (остаток) пока не меняем, а меняем число одной-единственной купюры в billsTmp. Почему? Разве мы не должны взять billsTmp из элемента $canIssue[$sum - $bill][1], вычесть из него 1 купюру и записать в $canIssue[$sum][0]?
Ты уверен, что эта часть написана верно? Я явно вижу, что подход к элементу 0 (число купюр) и 1 (остаток купюр) применяется разный, непонятно почему, так как они взаимосвязаны и должны менять одновременно.
В старой (айфон), вот http://ideone.com/k6MLAo Поправил переменную, убрал отрицат. значение кредита.
В той, что поновее(айпад), реализовал сортировку asortом.
> Разве мы не должны взять billsTmp из элемента $canIssue[$sum - $bill][1], вычесть из него 1 купюру и записать в $canIssue[$sum][0]?
Правильно: Разве мы не должны взять billsTmp из элемента $canIssue[$sum - $bill][1], вычесть из него 1 купюру и записать в $canIssue[$sum][ 1 ]?
>>371907
Слишком сложно. У нас есть функция sort() которая сортирует массив по любому условию. Так и сортируй сразу по числу начеления без заведения лишних промежуточных массивов. Алсо, в sort() лучше использовать анонимную функцию.
Для выборки названий городов из отсортированного массива мог бы использовать pluck.
> Вот темы, которые я бы хотел подтянуть:
В первую очередь стоит подтянуть ООП и прототипы. запомнить все методы массива гораздо проще, и это можно сделать потом (раз хочешь, то сделаем). Конкретнее, изучи:
- как работает оператор new и функция-комструктор
- что такое цепочка прототипов и как она образуется
После этого уже можно будет за приватные свойства (точнее, их имитацию) браться. Если что-то непонятно, задавай вопросы, но сначала попробуй почитать learn.javascript.ru или другие источники на эту тему.
> Статические переменные
В JS нет статических переменных (там даже классов нет, если уж на то пошло, только функции-конструкторы). Но ты можешь на функцию-коструктор добавить свойства, и это будет что-то похожее:
function Person(...) { ... }
Person.someStatisProperty = 1;
Так же имитируются константы, через добавление обычных свойств:
Person.OCCUPATION_MANAGER = 1;
>>371909
В PHP массивы не отсортированы по ключам, а элементы хранятся в порядке добавления. То есть если писать
$z = array();
$z[1] = 100;
$z[0] = 200;
То элемент 1 идет раньще чем элемент 0.
> А обычный как я понял реализован как ассоциативный с целочисленными ключами по порядку.
«Обычный массив», который в PHP доступен через объект http://php.net/manual/ru/class.splfixedarray.php — это массив, в котором есть жлементы от 0 до N - 1 без пропусков, хранящиеся по возрастанию индексов. А то, что array() — это ассоциативный массив с сохранением порядка вствки элементов.
> Разве мы не должны взять billsTmp из элемента $canIssue[$sum - $bill][1], вычесть из него 1 купюру и записать в $canIssue[$sum][0]?
Правильно: Разве мы не должны взять billsTmp из элемента $canIssue[$sum - $bill][1], вычесть из него 1 купюру и записать в $canIssue[$sum][ 1 ]?
>>371907
Слишком сложно. У нас есть функция sort() которая сортирует массив по любому условию. Так и сортируй сразу по числу начеления без заведения лишних промежуточных массивов. Алсо, в sort() лучше использовать анонимную функцию.
Для выборки названий городов из отсортированного массива мог бы использовать pluck.
> Вот темы, которые я бы хотел подтянуть:
В первую очередь стоит подтянуть ООП и прототипы. запомнить все методы массива гораздо проще, и это можно сделать потом (раз хочешь, то сделаем). Конкретнее, изучи:
- как работает оператор new и функция-комструктор
- что такое цепочка прототипов и как она образуется
После этого уже можно будет за приватные свойства (точнее, их имитацию) браться. Если что-то непонятно, задавай вопросы, но сначала попробуй почитать learn.javascript.ru или другие источники на эту тему.
> Статические переменные
В JS нет статических переменных (там даже классов нет, если уж на то пошло, только функции-конструкторы). Но ты можешь на функцию-коструктор добавить свойства, и это будет что-то похожее:
function Person(...) { ... }
Person.someStatisProperty = 1;
Так же имитируются константы, через добавление обычных свойств:
Person.OCCUPATION_MANAGER = 1;
>>371909
В PHP массивы не отсортированы по ключам, а элементы хранятся в порядке добавления. То есть если писать
$z = array();
$z[1] = 100;
$z[0] = 200;
То элемент 1 идет раньще чем элемент 0.
> А обычный как я понял реализован как ассоциативный с целочисленными ключами по порядку.
«Обычный массив», который в PHP доступен через объект http://php.net/manual/ru/class.splfixedarray.php — это массив, в котором есть жлементы от 0 до N - 1 без пропусков, хранящиеся по возрастанию индексов. А то, что array() — это ассоциативный массив с сохранением порядка вствки элементов.
Я сначала тупил, думал, надо будет заводить массив массивов и по номеру победившего массива (состоящего из char* name и double price) или структуры (состоящего из двух полей) выводить. А тут оказывается, что массив в php это уже что-то типа словаря, и можно вывести ключи и значения. После сишки это очень разительная перемена.
Ты не HTML ли пытаешься парсить регулярками, юный падаван? Прочти-ка пункт 1 из статьи: http://m.habrahabr.ru/post/230737/
Для HTML есть DOM и Xpath.
>>371952
Неплохо для начала, но надо бы выводить где именно проблемы. А то непонятно, где ошибка.
Вместо preg_match (ищет только первое совпадение) стоит использовать preg_match_all (ищет все совпадения).
Видит ошибку там где ее нет: http://ideone.com/Jk8Euf
Не найдет слов «зделаю, зделаем, зделай»
>>371954
Вон, животное
>>371982
То же, неплохо для начала, но надо улучшить код. Сейчас он слишком сложный. Я уверен, что можно сделать проще:
- заводим счетчик, пишем в него 1
- обходим массив, на каждом элементе увеличиваем счетчик
- если дошли до нужного значения, удаляем элемент, сбрасываем счетчик
> for ($j = 0; $j < count($s) - $skip + 1; $j++) {
> array_push($d, $s[$skip + $j]);
Ты не array_splice случайно пытаешься написать? Она умеет удалять куски из середины массива. В твоем случае достаточно удалять через unset.
> unset($d);
Это удаляет переменную, но не элемент массива. Не очень понятно зачем ее удалять.
Ты не HTML ли пытаешься парсить регулярками, юный падаван? Прочти-ка пункт 1 из статьи: http://m.habrahabr.ru/post/230737/
Для HTML есть DOM и Xpath.
>>371952
Неплохо для начала, но надо бы выводить где именно проблемы. А то непонятно, где ошибка.
Вместо preg_match (ищет только первое совпадение) стоит использовать preg_match_all (ищет все совпадения).
Видит ошибку там где ее нет: http://ideone.com/Jk8Euf
Не найдет слов «зделаю, зделаем, зделай»
>>371954
Вон, животное
>>371982
То же, неплохо для начала, но надо улучшить код. Сейчас он слишком сложный. Я уверен, что можно сделать проще:
- заводим счетчик, пишем в него 1
- обходим массив, на каждом элементе увеличиваем счетчик
- если дошли до нужного значения, удаляем элемент, сбрасываем счетчик
> for ($j = 0; $j < count($s) - $skip + 1; $j++) {
> array_push($d, $s[$skip + $j]);
Ты не array_splice случайно пытаешься написать? Она умеет удалять куски из середины массива. В твоем случае достаточно удалять через unset.
> unset($d);
Это удаляет переменную, но не элемент массива. Не очень понятно зачем ее удалять.
Это битовые операторы. Чтобы их понять, надо разобраться с двоичной системой счисления и научиться записывать в ней числа (статья про нее наверняка есть на википедии). Двоичные числа состоят только из 2 цифр — 0 и 1. например:
39 в десятичной системе записывается в двоичной как 10111. Одна цифра двоичного числа еще называется бит.
Соответственно, дальше все просто:
Оператор a & b - оператор логического «и» ( http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%8A%D1%8E%D0%BD%D0%BA%D1%86%D0%B8%D1%8F ). Он проходится по битам двух чисел справа налево и выполняет операцию «и» над верхим и нижним битом (то есть оставляет 1 только там где и сверху и снизу стоит 1). Я дополнил второе число нулями слева чтобы выровнять их по правому краю:
1000101 & 10101 = ?
1000101
0010101
-------
0000101
Ответ: 1000101 & 010101 = 0000101
Оператор | — то же самое, только делает операцию «или» над битами: ставит 1 там, где есть хотя бы одна единица сверху или снизу. 1000101 | 010101 = 1010101
Оператор ^ — делает «исключающее или» (XOR, сложение по модулю 2): 1000101 ^ 010101 = 1010000
Оператор ~ — логическое «не» — просто меняет 0 на 1 и наоборот в числе:
~101 = 111111....1111010 (всего 32 или 64 бита)
Единицы в начале появились из-за того, что битовые операции делаются над 32/64-битовыми числами, соответственно фактически перед каждый числом, хранящимся в памяти приписано нужное число нулей (101 = 00000.....000101). 32 или 64 бита исплоьзуется — зависит от процессора и ОС.
Подробнее: http://ru.wikipedia.org/wiki/%D0%91%D0%B8%D1%82%D0%BE%D0%B2%D1%8B%D0%B5_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8
Также, есть сдвиги: >> и << — они просто сдвигают число на нужное число бит вправо/влево, дополняя с другой стороны нулями.
Интересные свойства битовых операий:
$x >> 1 делит число на 2, округляя вниз. 5 >> 1 = 2, 100 >> 1 = 50
$x >> 4 делит число на 24 = 16. 33 >> 4 = 2
$x >> 5 делит число на 25
$x << 1 умножает число на 2 (тут стоит помнить, что старшие биты могут уйти за границу 32/64 битов и будет уже не умножение)
$x << 3 умнодает число на 23 = 8. 7 << 3 = 7 * 8 = 56
$x & 1 оставляет только последний, правый бит числа. Он равен 0 для четный чисел и 1 для нечетных (почемы7 изучи двоичную систему).
Если двоичное число кончается на 0, оно четное
Если кончается на 00, оно делится на 4
Если кончается на 000, то на 8
Почему? По той же причине почему число 9000 делится на 1000 (1000 = 103 степени, 3 нуля)
~0 дает нам число со всеми битами равными 1 (-1 в десятичной системе).
~-1 соответственно дает 0
~$x = -($x + 1)
C помощью операции & можно проверить, установлен ли какой-то бит числа в единицу. Также, ей можно обнулять любые биты. С помощью | можно ставить любые биты в единицу. С помощью ^ — переворачивать.
Операция ^ обратима: $a ^ $b ^ $b = $a . Это можно использовать для шифрования.
С отрицательными числами все сложнее, так как они хранятся в дополнительном коде, где много единиц ( http://ru.wikipedia.org/wiki/%D0%94%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4_(%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%87%D0%B8%D1%81%D0%BB%D0%B0) ). Традиционно самый левый бит в 32/64 битном числе обозначает знак (0 — плюс, 1 — минус).
Почему такие сложности? Битовые операции и двоичное представление чисел — это очень низкоуровневые операции, на их основе построены микропроцессоры (а мы же помним что в них двоичная логика). Потому там все так сложно.
Это битовые операторы. Чтобы их понять, надо разобраться с двоичной системой счисления и научиться записывать в ней числа (статья про нее наверняка есть на википедии). Двоичные числа состоят только из 2 цифр — 0 и 1. например:
39 в десятичной системе записывается в двоичной как 10111. Одна цифра двоичного числа еще называется бит.
Соответственно, дальше все просто:
Оператор a & b - оператор логического «и» ( http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%8A%D1%8E%D0%BD%D0%BA%D1%86%D0%B8%D1%8F ). Он проходится по битам двух чисел справа налево и выполняет операцию «и» над верхим и нижним битом (то есть оставляет 1 только там где и сверху и снизу стоит 1). Я дополнил второе число нулями слева чтобы выровнять их по правому краю:
1000101 & 10101 = ?
1000101
0010101
-------
0000101
Ответ: 1000101 & 010101 = 0000101
Оператор | — то же самое, только делает операцию «или» над битами: ставит 1 там, где есть хотя бы одна единица сверху или снизу. 1000101 | 010101 = 1010101
Оператор ^ — делает «исключающее или» (XOR, сложение по модулю 2): 1000101 ^ 010101 = 1010000
Оператор ~ — логическое «не» — просто меняет 0 на 1 и наоборот в числе:
~101 = 111111....1111010 (всего 32 или 64 бита)
Единицы в начале появились из-за того, что битовые операции делаются над 32/64-битовыми числами, соответственно фактически перед каждый числом, хранящимся в памяти приписано нужное число нулей (101 = 00000.....000101). 32 или 64 бита исплоьзуется — зависит от процессора и ОС.
Подробнее: http://ru.wikipedia.org/wiki/%D0%91%D0%B8%D1%82%D0%BE%D0%B2%D1%8B%D0%B5_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8
Также, есть сдвиги: >> и << — они просто сдвигают число на нужное число бит вправо/влево, дополняя с другой стороны нулями.
Интересные свойства битовых операий:
$x >> 1 делит число на 2, округляя вниз. 5 >> 1 = 2, 100 >> 1 = 50
$x >> 4 делит число на 24 = 16. 33 >> 4 = 2
$x >> 5 делит число на 25
$x << 1 умножает число на 2 (тут стоит помнить, что старшие биты могут уйти за границу 32/64 битов и будет уже не умножение)
$x << 3 умнодает число на 23 = 8. 7 << 3 = 7 * 8 = 56
$x & 1 оставляет только последний, правый бит числа. Он равен 0 для четный чисел и 1 для нечетных (почемы7 изучи двоичную систему).
Если двоичное число кончается на 0, оно четное
Если кончается на 00, оно делится на 4
Если кончается на 000, то на 8
Почему? По той же причине почему число 9000 делится на 1000 (1000 = 103 степени, 3 нуля)
~0 дает нам число со всеми битами равными 1 (-1 в десятичной системе).
~-1 соответственно дает 0
~$x = -($x + 1)
C помощью операции & можно проверить, установлен ли какой-то бит числа в единицу. Также, ей можно обнулять любые биты. С помощью | можно ставить любые биты в единицу. С помощью ^ — переворачивать.
Операция ^ обратима: $a ^ $b ^ $b = $a . Это можно использовать для шифрования.
С отрицательными числами все сложнее, так как они хранятся в дополнительном коде, где много единиц ( http://ru.wikipedia.org/wiki/%D0%94%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4_(%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%87%D0%B8%D1%81%D0%BB%D0%B0) ). Традиционно самый левый бит в 32/64 битном числе обозначает знак (0 — плюс, 1 — минус).
Почему такие сложности? Битовые операции и двоичное представление чисел — это очень низкоуровневые операции, на их основе построены микропроцессоры (а мы же помним что в них двоичная логика). Потому там все так сложно.
>Операция ^ обратима: $a ^ $b ^ $b = $a . Это можно использовать для шифрования.
А вот это уже очень интересно, спасибо.
Аналогия для запоминания битовых сдвигов:
Если к дестичному числу приписать справа 0, оно умножается на 10
Если к десятичному числу приписать справа 0000, оно умнодается на 10000
Если десятичное число сдвинуть вправо, удалив последний разяд, это равносильно делению на 10 с округлением вниз: shift10(12345) = 1234
>>371991
Спам и программы для него не приветствуется в этом треде.
Там по моему ограничение, типа 25 или 30 друзьям в день максимум можно направить заявки. Если заявки закончились, можно кстати просто нагло лайкать и писать в личку, пока тебя самого не добавят. Так что капча тебе вряд ли поможет А так, распознавай когда в ответе приходит запрос капчи, выводи ее себе в браузер, вбивай ответ, скрипт должен брать ответ + сохраненные ранее параеметры и слать повторный запрос.
>>371993
Без навыка в уме переводить в двоичную хотя бы числа до 20, будет тяжело.
>>371999
Лол. А в их мануале было написано что работает: http://www.jetbrains.com/phpstorm/webhelp/reformatting-source-code.html
> On the main menu, choose Code | Reformat Code, or press Ctrl+Alt+L.
Ты настройки может какие менял?
Попробуй через меню выполнить. А то может мануал мой уже неактуален и действительно не работает.
>>372004
Бить надо за такие трюки.
>>372006
Книги из ОП-поста (Зандстра или Шлоссгнейл — на выбор)
Сайт phptherightway
Про вордпресс можно почитать их документацию для разработчиков. если она есть на понятном тебе языке, плюс скачать и руками пощупать.
У нас есть дополнительные задачи, хочешь, може яваскрипт поизучать например, смотри сколько задачек: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
Стоит изучать базы данных, вот например задачка на MySQL: https://gist.github.com/codedokode/10539213
Еще у нас есть такая задача: сделать сайт файлообменник: https://gist.github.com/codedokode/9424217
Если надо задачу на какую-то тему, напиши, придумаем/найдем.
>>372008
Поколдовать с mb_substr, разрезав строку ан 3 части и склеив назад, или превратить строку в массив букв с помощью хака:
$letters = preg_split("//u", $text, null, PREG_SPLIT_NO_EMPTY);
Аналогия для запоминания битовых сдвигов:
Если к дестичному числу приписать справа 0, оно умножается на 10
Если к десятичному числу приписать справа 0000, оно умнодается на 10000
Если десятичное число сдвинуть вправо, удалив последний разяд, это равносильно делению на 10 с округлением вниз: shift10(12345) = 1234
>>371991
Спам и программы для него не приветствуется в этом треде.
Там по моему ограничение, типа 25 или 30 друзьям в день максимум можно направить заявки. Если заявки закончились, можно кстати просто нагло лайкать и писать в личку, пока тебя самого не добавят. Так что капча тебе вряд ли поможет А так, распознавай когда в ответе приходит запрос капчи, выводи ее себе в браузер, вбивай ответ, скрипт должен брать ответ + сохраненные ранее параеметры и слать повторный запрос.
>>371993
Без навыка в уме переводить в двоичную хотя бы числа до 20, будет тяжело.
>>371999
Лол. А в их мануале было написано что работает: http://www.jetbrains.com/phpstorm/webhelp/reformatting-source-code.html
> On the main menu, choose Code | Reformat Code, or press Ctrl+Alt+L.
Ты настройки может какие менял?
Попробуй через меню выполнить. А то может мануал мой уже неактуален и действительно не работает.
>>372004
Бить надо за такие трюки.
>>372006
Книги из ОП-поста (Зандстра или Шлоссгнейл — на выбор)
Сайт phptherightway
Про вордпресс можно почитать их документацию для разработчиков. если она есть на понятном тебе языке, плюс скачать и руками пощупать.
У нас есть дополнительные задачи, хочешь, може яваскрипт поизучать например, смотри сколько задачек: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
Стоит изучать базы данных, вот например задачка на MySQL: https://gist.github.com/codedokode/10539213
Еще у нас есть такая задача: сделать сайт файлообменник: https://gist.github.com/codedokode/9424217
Если надо задачу на какую-то тему, напиши, придумаем/найдем.
>>372008
Поколдовать с mb_substr, разрезав строку ан 3 части и склеив назад, или превратить строку в массив букв с помощью хака:
$letters = preg_split("//u", $text, null, PREG_SPLIT_NO_EMPTY);
>>372009
> rewriteCond image/thumbs/%{REQUEST_FILENAME} !-f
А в REQUETS_FILENAME разве не содержится полный путь, со всеми папками? По моему ты неправильно это написал.
А вообще, почитай http://habrahabr.ru/company/sprinthost/blog/129560/ если не читал.
>>372039
У тебя htaccess в корне сайта или в подпапке? Почитай про RewriteBase тогда в той же статье на Хабре.
>>372058
Если речь о MySQL то коннект там порядка миллисекунды занимает и ничего не решает (у других Бд может быть по другому). Вообще, есть такое решение как пул незакрывающихся соединений, в том числе в PHP (persistent connections) но он несет опасности — например ты мог открыть транзакцию, и вернуть соединение с незаконченной транзакцией в пул. Или поменять значение какой-то настройки в соединении и не вернуть обратно. Если подумать, как это геморройно отлаживать и какие удивительные баги можно поймать, то понятно что оно того не стоит.
> Как побороть это чувство? Чем себя утешать?
Неважно сколько там объектов создается важно сколько это времени занимает. Алсо, нафига вы пишете на Си++? У вашей корпорации куча денег которые некуда деть?
>>372142
Правой кнопккой (копировать адрес картинки) или инспектором (Ctrl + Shift + I вкладка Network) или в html-исходнике узнай ссылку в картинке, и попробуй открыть ее через адресную строку.
>>372152
Вон, животное
>>372151
Вместо костылей с GET (которые не сработают если там есть = или &) используй $_SERVER['REQUEST_URU'] или $_SERVER['QUERY_STRING'], детали в мануале.
>>372139
Можешь начать с микрофреймворка Slim, у нас даже задание есть: https://gist.github.com/codedokode/9424217
Не хочешь? Можешь начать с симфони 2: http://symfony.in.ua/symfony2-jobeet-tutorial.html
>>372009
> rewriteCond image/thumbs/%{REQUEST_FILENAME} !-f
А в REQUETS_FILENAME разве не содержится полный путь, со всеми папками? По моему ты неправильно это написал.
А вообще, почитай http://habrahabr.ru/company/sprinthost/blog/129560/ если не читал.
>>372039
У тебя htaccess в корне сайта или в подпапке? Почитай про RewriteBase тогда в той же статье на Хабре.
>>372058
Если речь о MySQL то коннект там порядка миллисекунды занимает и ничего не решает (у других Бд может быть по другому). Вообще, есть такое решение как пул незакрывающихся соединений, в том числе в PHP (persistent connections) но он несет опасности — например ты мог открыть транзакцию, и вернуть соединение с незаконченной транзакцией в пул. Или поменять значение какой-то настройки в соединении и не вернуть обратно. Если подумать, как это геморройно отлаживать и какие удивительные баги можно поймать, то понятно что оно того не стоит.
> Как побороть это чувство? Чем себя утешать?
Неважно сколько там объектов создается важно сколько это времени занимает. Алсо, нафига вы пишете на Си++? У вашей корпорации куча денег которые некуда деть?
>>372142
Правой кнопккой (копировать адрес картинки) или инспектором (Ctrl + Shift + I вкладка Network) или в html-исходнике узнай ссылку в картинке, и попробуй открыть ее через адресную строку.
>>372152
Вон, животное
>>372151
Вместо костылей с GET (которые не сработают если там есть = или &) используй $_SERVER['REQUEST_URU'] или $_SERVER['QUERY_STRING'], детали в мануале.
>>372139
Можешь начать с микрофреймворка Slim, у нас даже задание есть: https://gist.github.com/codedokode/9424217
Не хочешь? Можешь начать с симфони 2: http://symfony.in.ua/symfony2-jobeet-tutorial.html
нет
>>372191
В идеале всегда, когда возможно. Без исключений ты вынужден после каждой функции проверять результат типа
if ($result === false) { ... }
Не надоело? Исклюения были придуманы чтобы от них избавиться. Ведь почти каждая функция PHP может вернуть ошибку и ты должен все их проверять.
> Какую и когда использовать?
Если речь о нормальной логике программы, например, проверке введеннных данных (возраст должен быть числом от 5 до 100) — то без исключений. Если что-то пошло не так или программси накосячил и передал что-то не то — то исключение.
> К примеру у нас есть 2 версии метода сохранения в бд.
Вам нужна одна версия. Алсо, если пришла ошибка из БД (некорректный запрос например) - однозначно исключение.
Вроде про исключения написано и у Зандстры, и у Шлоссгнейла, но не знаю, хорошо ли.
если есть более конкретный пример, пиши, поясню.
>>372192
Часть в аккаунте: https://gist.github.com/codedokode
Анонимные вроде бы все перечислены тут: http://archive-ipq-co.narod.ru/l1/pasta.html (я их когда-нибудь перенесу в аккаунт)
Вроде это все.
>>372201
Да. массив - это словарь, да еще и с порядком следования элементов в том порядке, в котором они добавлялись (обычно словари не запоминают порядок элементов). Вообще не уверен, хорошо ли это, во всех других языках отдельно массив, отдельно словарь, отедльно упорядоченный словарь. В Си++ в STL кстати все это тоже есть, странно что ты не слышал.
нет
>>372191
В идеале всегда, когда возможно. Без исключений ты вынужден после каждой функции проверять результат типа
if ($result === false) { ... }
Не надоело? Исклюения были придуманы чтобы от них избавиться. Ведь почти каждая функция PHP может вернуть ошибку и ты должен все их проверять.
> Какую и когда использовать?
Если речь о нормальной логике программы, например, проверке введеннных данных (возраст должен быть числом от 5 до 100) — то без исключений. Если что-то пошло не так или программси накосячил и передал что-то не то — то исключение.
> К примеру у нас есть 2 версии метода сохранения в бд.
Вам нужна одна версия. Алсо, если пришла ошибка из БД (некорректный запрос например) - однозначно исключение.
Вроде про исключения написано и у Зандстры, и у Шлоссгнейла, но не знаю, хорошо ли.
если есть более конкретный пример, пиши, поясню.
>>372192
Часть в аккаунте: https://gist.github.com/codedokode
Анонимные вроде бы все перечислены тут: http://archive-ipq-co.narod.ru/l1/pasta.html (я их когда-нибудь перенесу в аккаунт)
Вроде это все.
>>372201
Да. массив - это словарь, да еще и с порядком следования элементов в том порядке, в котором они добавлялись (обычно словари не запоминают порядок элементов). Вообще не уверен, хорошо ли это, во всех других языках отдельно массив, отдельно словарь, отедльно упорядоченный словарь. В Си++ в STL кстати все это тоже есть, странно что ты не слышал.
>>372198
Это пишется в одну строчку:
} elseif (..) {
} else {
Считает верно.
>>372199
С abs было лучше, вообще это не очень хороший хак с уходом переменной в минус, лучше бы нормально посчитал сумму выплат по месяцам, мне кажется.
Так, все верно, только переменные key/val лучше называть как bankName/cost.
>>372204
Если почитаешь например
http://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B6%D0%B8%D0%BC_%D1%88%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F
http://ru.wikipedia.org/wiki/%D0%9E%D0%B4%D0%BD%D0%BE%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B9_%D0%B1%D0%BB%D0%BE%D0%BA%D0%BD%D0%BE%D1%82
то операция XOR постоянно встречается (плюс в кружочке).
Еще ей можно обменивать числа в переменных: http://habrahabr.ru/post/183462/ (такие задачи впрочем дают только на собеседованиях — на практике не нужно)
>>372198
Это пишется в одну строчку:
} elseif (..) {
} else {
Считает верно.
>>372199
С abs было лучше, вообще это не очень хороший хак с уходом переменной в минус, лучше бы нормально посчитал сумму выплат по месяцам, мне кажется.
Так, все верно, только переменные key/val лучше называть как bankName/cost.
>>372204
Если почитаешь например
http://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B6%D0%B8%D0%BC_%D1%88%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F
http://ru.wikipedia.org/wiki/%D0%9E%D0%B4%D0%BD%D0%BE%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B9_%D0%B1%D0%BB%D0%BE%D0%BA%D0%BD%D0%BE%D1%82
то операция XOR постоянно встречается (плюс в кружочке).
Еще ей можно обменивать числа в переменных: http://habrahabr.ru/post/183462/ (такие задачи впрочем дают только на собеседованиях — на практике не нужно)
>Это пишется в одну строчку:
Не понял этого момента.
Имеешь ли ты в виду, что вот так по стандарту лучше:
if($credit>0) {
echo "После выплаты через $i месяц(ев) осталось выплатить $credit\n";
}elseif($credit < 0) {
?
по абсохаку - кмк это лучше, чем городить условие проверки (пока кредит <= пеймент) и проделывать ту же самую операцию вычитания из пяти тысяч пеймента "лишней" части выплаты.
Алсо, как ни странно, для чистой сишки есть библиотечная реализация словарей: http://www.sunrisetel.net/software/devtools/sunrise-data-dictionary.shtml я знаю, тут есть любители няшной
<?php
mb_internal_encoding('UTF-8');
error_reporting(-1);
header("Content-Type: text/html; charset= utf-8");
var_dump($_GET);
echo "<br>";
var_dump($_SERVER);
?>
Это все.А ты пробовал передать в tryCatchImage.php ссылку на файл?
> rewriteCond image/thumbs/%{REQUEST_FILENAME} !-f
А в REQUETS_FILENAME разве не содержится полный путь, со всеми папками? По моему ты неправильно это написал.
А вообще, почитай http://habrahabr.ru/company/sprinthost/blog/129560/ если не читал.
Читал, потом еще раз читал, потом еще раз.
thaccess находится в корне сайта wwww\htaccess,
Насколько я понял , если файл находится в корне сайта и он один , то вопрос с rewritebase можно оставить "по умолчанию " апатч сам поставить путь до файла htaccess.
Но передать ссылку на картинку которой нет в другой файл, я так и не смог.
> Алсо, меня напрягают имена файлов с подчеркиваниями в начале. Я уверен, можно обойтись без них, ибо смотрятся они ужасно. хуже только подчеркивания в конце идентификатора.
Gii так при автогенерации назвал частичные вьюшки. Я решил сделать так же.
>Форма при наличии файла сама эту опцию не ставит? В ZF например ставится само.
В интернетах говорят, что надо. Хотя, попробую убрать и посмотрю, что выйдет.
>Форма поиска из кучи полей
Это нагенерировано Gii, я пока еще не сделал поиск, но раз собрался делать, то не удалил кусок кода.
>Могу завтра/послезавтра глянуть, если хочешь.
Да нет, пока достаточно кода. Я еще дописывать его буду.
> Лол. А в их мануале было написано что работает: http://www.jetbrains.com/phpstorm/webhelp/reformatting-source-code.html
Прекрасно работает. Сам регулярно пользуюсь. PhpStorm 7.1 купленный на торренте(у них для студентов ide бесплатна, мы тут хоть и не все студенты но учимся, так что совесть чиста)
№1
Я что-то совсем не понял условие задачи. Я так понимаю, там рекурсия? Можешь перефразировать?
№2
http://jsfiddle.net/bX7JN/. С генератором тоже вроде должна работать.
№3
http://jsfiddle.net/LVze8/
№8
http://jsfiddle.net/GLgd9/
№9
http://jsfiddle.net/pxq87/
№10
http://jsfiddle.net/Q5t7k/
№11
http://jsfiddle.net/cBR4X/ - не понимаю, почему не работает.
Нет, я просто хочу поймать ссылку на картинку в другом файле, что бы скрипт работал с этой ссылкой.
Но ссылка находиться внутри html кода :
<div class="str">
<div class="simply">
<div class="thumbnail">
<img src="../image/thumbs/1.jpg"/>
</div>
<div class="other">
<div class="date">
<p>21.07.2014г.</p>
</div>
<div class="tittle">
<h1>Игры предпренимателей</h1>
</div>
<div class="description">
<p>Во что играют российские предприниматели и представители ИТ-индустрии</p>
</div>
</div>
</div>
<img src="../image/thumbs/1.jpg"/> вот эту ссылку мне надо передать в другой файл php
> Имей в виду, алгоритм в removeRepetition имет сложность O(N2) то есть для 10 000 пар будет выполнено 100 000 000 шагов цикла, что многовато. Для поиска совпадений в больших массивах надо использовать оптимизации, например, использовать поиск по ключу вроде isset($a[$x]) — он работает без полного перебора массива. Тут этого можно не делать, но имей в виду.
Можно и сделать. Только подробнее о том что за поиск по ключу, а то я еще на стадии написания ломал голову над тем как искать в массиве подстроки, но ничего не надумав сделал как сделал.
> Не проще ли удалять стоп-слова из массива после разбиения на слова через array_diff?
Я так сначала сделал, но всплыла проблема undifened offset. Так как ключи были 1 2 3 5 7, и в итоге при склеивании словосочетаний вылазила бяка. Правда сейчас понял как это решить.
> Стандартных знаков-разделителей предложений три: .!?
Окей. Сначало тоже их перечислил, но потом подумал что смысл в них если я просто решаю задачу с конкретным текстом. но раз уж скрипт становится вполне рабочим надо добавить, заодно потом проверить на других текстах.
> Зачем if и проверка через регулярку в removeRepetition, я не очень понял. Нельзя ли использовать общий > > алгоритм для всех случаев, например, разбиение на слова или хитрый хак — поиск подстроки таким образом:
Иф и регулярка для того что бы установить - в переданном массиве 1 или больше слов. Если это массивы из 2 и 3х слов то проверка проще, если 1 из них содержит просто слова то дополнительная проверка(по твоему совету же кстати как и intersect цитирую тебя же
>> mb_strpos($words2, $word) !== false)
> Тут есть подвох: а что если
> $word2 = 'скотный двор';
> $word = 'кот';
)
> mb_strpos(" {$haystack} ", " {$needle} ");
Понял, пробелы избавляют нас и от ошибки и от ифов, и от интерсекта, если я всё правильно понял конечно. Зачем только использовать фигурные скобки?
> Это же массив, проверяй через if (!$top) или if (!count($top)) или if (count($top) == 0)
Как понимать !$top ?
>> } elseif (count($top) == 1) {
>> foreach ($top as $words => $count) {
> Ох, нехорошо тут фейковый цикл смотрится. Лучше бы по-другому, например через $value = reset(...); $key = key(...);
Вот этого не понимать. Можно конечно обычный цикл сделать, который все повторится count($array) раз, но не понимаю зачем так делать. Выглядит как усложнение. И в чем фейковость? Обходим массив и выводим его содержимое.
> Разбиение на слова работает не идеально (там естьодна строка в пустым словом - это может быть неразрывный пробел: http://ru.wikipedia.org/wiki/%D0%9D%D0%B5%D1%80%D0%B0%D0%B7%D1%80%D1%8B%D0%B2%D0%BD%D1%8B%D0%B9_%D0%BF%D1%80%D0%BE%D0%B1%D0%B5%D0%BB ): http://ideone.com/9YC6hP
http://ideone.com/ewmI2S
> Имей в виду, алгоритм в removeRepetition имет сложность O(N2) то есть для 10 000 пар будет выполнено 100 000 000 шагов цикла, что многовато. Для поиска совпадений в больших массивах надо использовать оптимизации, например, использовать поиск по ключу вроде isset($a[$x]) — он работает без полного перебора массива. Тут этого можно не делать, но имей в виду.
Можно и сделать. Только подробнее о том что за поиск по ключу, а то я еще на стадии написания ломал голову над тем как искать в массиве подстроки, но ничего не надумав сделал как сделал.
> Не проще ли удалять стоп-слова из массива после разбиения на слова через array_diff?
Я так сначала сделал, но всплыла проблема undifened offset. Так как ключи были 1 2 3 5 7, и в итоге при склеивании словосочетаний вылазила бяка. Правда сейчас понял как это решить.
> Стандартных знаков-разделителей предложений три: .!?
Окей. Сначало тоже их перечислил, но потом подумал что смысл в них если я просто решаю задачу с конкретным текстом. но раз уж скрипт становится вполне рабочим надо добавить, заодно потом проверить на других текстах.
> Зачем if и проверка через регулярку в removeRepetition, я не очень понял. Нельзя ли использовать общий > > алгоритм для всех случаев, например, разбиение на слова или хитрый хак — поиск подстроки таким образом:
Иф и регулярка для того что бы установить - в переданном массиве 1 или больше слов. Если это массивы из 2 и 3х слов то проверка проще, если 1 из них содержит просто слова то дополнительная проверка(по твоему совету же кстати как и intersect цитирую тебя же
>> mb_strpos($words2, $word) !== false)
> Тут есть подвох: а что если
> $word2 = 'скотный двор';
> $word = 'кот';
)
> mb_strpos(" {$haystack} ", " {$needle} ");
Понял, пробелы избавляют нас и от ошибки и от ифов, и от интерсекта, если я всё правильно понял конечно. Зачем только использовать фигурные скобки?
> Это же массив, проверяй через if (!$top) или if (!count($top)) или if (count($top) == 0)
Как понимать !$top ?
>> } elseif (count($top) == 1) {
>> foreach ($top as $words => $count) {
> Ох, нехорошо тут фейковый цикл смотрится. Лучше бы по-другому, например через $value = reset(...); $key = key(...);
Вот этого не понимать. Можно конечно обычный цикл сделать, который все повторится count($array) раз, но не понимаю зачем так делать. Выглядит как усложнение. И в чем фейковость? Обходим массив и выводим его содержимое.
> Разбиение на слова работает не идеально (там естьодна строка в пустым словом - это может быть неразрывный пробел: http://ru.wikipedia.org/wiki/%D0%9D%D0%B5%D1%80%D0%B0%D0%B7%D1%80%D1%8B%D0%B2%D0%BD%D1%8B%D0%B9_%D0%BF%D1%80%D0%BE%D0%B1%D0%B5%D0%BB ): http://ideone.com/9YC6hP
http://ideone.com/ewmI2S
И еще, оп, напомни мне, как sidebar разместить после content в html документе, когда content резиновый, а sidebar с фиксированной шириной.
Вот так:
<body>
<div id="content">
...
</div>
<div id="sidebar">
...
</div>
</body>
Но сайдбар должен быть слева.
Спасибо, няша!
Исправил Grammar Nazi и добавил автокоррект: http://ideone.com/pKgUGt
А ещё сделал что-то я не знаю как это назвать, но тут есть мини-шаблонизатор и вёрстка в другом файле, погляди, пожалуйста:
http://pastebin.com/3zF4ZNwW - templater.php
http://pastebin.com/W4KyCLkS - index.php
http://pastebin.com/3ZihuumL - main.php
И вопросики:
1) В preg_replace в замене можно подставлять группы с помощью $N, здесь $N - не переменная, а просто метка, в которую группы подставляются? Значок доллара, получается, переопределён? закоменченная строка в templater.php, в методе replaceLinks
2) Есть какое-нибудь слово для описания результата разделения вёрстки и логики?
Отклеилось.
Еще когда-то давно ты давал сайт, там описан метод многоколоночной верстки. Адаптивная верстка, при которой можно легко добавить новую колонку.
Я почитал про прототипы. Кое-что понял, кое-что не понял.
Псевдоклассы не особо понял. Мне практика нужна. Дай уже что-нибудь порешать.
Пик не понимаю. Почему в конце null? Не могу понять, чем отличается obj.proto от obj.prototype.
http://learn.javascript.ru/play/5gp0Zb
Вот это тоже не понял.
Оп, у тебя лучше получается объяснять. Общее представление у меня есть.
Зачем ты пересказал мой алгоритм? :D
unset'ом я уничтожаю массив, чтоб он воспрянул аки феникс
if оформляется так:
if (...) {
...
} elseif (...) {
....
}
> кмк это лучше, чем городить условие проверки (пока кредит <= пеймент) и проделывать ту же самую операцию вычитани
Да ничего там не надо вычитать:
$thisMonthPayment = min($monthlyPayment /* =5000 */, $credit);
$totalPayment += $thisMonthPayment;
Так гораздо понятнее и проще по моему.
>>372213
Не открывается ссылка. Но на Си по моему нельзя написать нормальные коллекции без heavy usage макросов. А в Си++ — можно, на шаблонах. Точнее, они уже написаны.
>>372220
попробуй убрать все из .htaccess и оставить там только:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule \.jpg$ test.php
Это перенаправит все запросы к несуществующим jpg-картинкам на test.php и должно работать.
А потом отталкивайся уже от этого файла.
>>372228
> Gii так при автогенерации назвал частичные вьюшки.
Понятно, пусть остается
if оформляется так:
if (...) {
...
} elseif (...) {
....
}
> кмк это лучше, чем городить условие проверки (пока кредит <= пеймент) и проделывать ту же самую операцию вычитани
Да ничего там не надо вычитать:
$thisMonthPayment = min($monthlyPayment /* =5000 */, $credit);
$totalPayment += $thisMonthPayment;
Так гораздо понятнее и проще по моему.
>>372213
Не открывается ссылка. Но на Си по моему нельзя написать нормальные коллекции без heavy usage макросов. А в Си++ — можно, на шаблонах. Точнее, они уже написаны.
>>372220
попробуй убрать все из .htaccess и оставить там только:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule \.jpg$ test.php
Это перенаправит все запросы к несуществующим jpg-картинкам на test.php и должно работать.
А потом отталкивайся уже от этого файла.
>>372228
> Gii так при автогенерации назвал частичные вьюшки.
Понятно, пусть остается
Я не написал, но решения удобнее постить на jsbin — там есть консоль прямо на странице.
Надо написать функцию
sequence
, которая создаст и вернет анонимную функцию, которая при вызове каждй раз будет возвращать новое значение. Рекурсия — это вызов функцией самой себя, тут вроде такого нет.
Это на замыкания задача.
Задача №2: take() принимает на вход функцию (которую она вызвает нужное число раз) и число. У тебя в решении take принимает на вход число и число (func — это число 6, а не функия). Это не то.
То есть должно быть что-то вроде
console.log(take(function () { return 1; }, 5)); // [1, 1, 1, 1, 1]
№3: Функция map() не должна изменять исходный массив (обновил gist с условием, дописал код для проверки этого: https://gist.github.com/codedokode/ce30e7a036f18f416ae0 ).
№8:
Не работает если указать 'age': http://jsbin.com/noxiguvi/1/edit?js,console
> if (arr.name) res = arr.name;
Надо использовать { } после if даже если там одна команда.
№9: Функция не должна менять исходный массив (дописал в условие задачи). Я конечно об этом не упомянул заранее, не подумал почему-то.
№10: Все верно
№11: Слишком сложно, исплоьзуй существующий метод sort() для массивов.
> var populated = [
> Tokio = {"popul" : 37555},
Неприавльный синтаксис, это равносильно:
window.Tokio = {"popul" : 37555};
window.Jakarta = {"popul" : 37555};
var populated = [{"popul" : 37555}, {"popul" : 37555}, ...];
То есть явно не то что ты хотел сделать.
Алсо, код — какой-то велосипед. Используй стандартные функции тут.
Я не написал, но решения удобнее постить на jsbin — там есть консоль прямо на странице.
Надо написать функцию
sequence
, которая создаст и вернет анонимную функцию, которая при вызове каждй раз будет возвращать новое значение. Рекурсия — это вызов функцией самой себя, тут вроде такого нет.
Это на замыкания задача.
Задача №2: take() принимает на вход функцию (которую она вызвает нужное число раз) и число. У тебя в решении take принимает на вход число и число (func — это число 6, а не функия). Это не то.
То есть должно быть что-то вроде
console.log(take(function () { return 1; }, 5)); // [1, 1, 1, 1, 1]
№3: Функция map() не должна изменять исходный массив (обновил gist с условием, дописал код для проверки этого: https://gist.github.com/codedokode/ce30e7a036f18f416ae0 ).
№8:
Не работает если указать 'age': http://jsbin.com/noxiguvi/1/edit?js,console
> if (arr.name) res = arr.name;
Надо использовать { } после if даже если там одна команда.
№9: Функция не должна менять исходный массив (дописал в условие задачи). Я конечно об этом не упомянул заранее, не подумал почему-то.
№10: Все верно
№11: Слишком сложно, исплоьзуй существующий метод sort() для массивов.
> var populated = [
> Tokio = {"popul" : 37555},
Неприавльный синтаксис, это равносильно:
window.Tokio = {"popul" : 37555};
window.Jakarta = {"popul" : 37555};
var populated = [{"popul" : 37555}, {"popul" : 37555}, ...];
То есть явно не то что ты хотел сделать.
Алсо, код — какой-то велосипед. Используй стандартные функции тут.
> высоту полей, отступов
Можно и нужно в пикселях
> блоков
Высота блока должна определяться содержимым обычно.
>>372351
Оценить могу. Макет без отзывчивости, но простой: http://rghost.net/57060408
Макет с отзывчиостью, но похуже: http://rghost.net/57060607
Выкладывать удобно на github pages например.
>>372361
Ой, а я тоже не помню, что это за ссылки. У меня есть только блог про позиционирование: http://softwaremaniacs.org/blog/category/primer/
Резиновые колонки обычно делаются за счет флоатов и/или margin.
Еще есть такой сайт, не знаю, поможет ли: http://learnlayout.com/
>>372384
> Только подробнее о том что за поиск по ключу,
Дано: 2 массива, массив сочетаний из 2 и из 3 слов. Построим по 3-словным сочетаниям индекс, то есть массив, вида
слово => массив номеров сочетаний, где оно встречается.
Пример: $threeWords = array(
0 => "мама мыла раму",
1 => "мама мыла ламу",
2 => "мыла мыла мыла"
);
По нему строится индекс:
$index = [
"мама" => [0, 1],
"мыла" => [0, 1, 2],
"раму" => [2],
....
];
Потом пройдемся циклом по массиву 2-словных сочетаний. Для каждого слова из сочетания, найдем в индексе номера 3-словных сочетаний и пересечем эти номера, найдя только те сочетания, где есть оба слова. Ну и потом уже можно их сравнить или сразу отсеять.
Допустим у нас N 2-словных и M 3-словных сочетаний. Построение индекса имеет сложность O(M), поиск в индексе по клюу O(1), то есть практически мгновенно, перебор всех 2-словных сочетаний O(N). Обзая сложность O(M + N).
А в случае 2 вложенных циклов и глупого сравнения каждого сочетания мы имеем сложность O(M × N). Подставь значения порядка 100 000 например и сравни сложности. Разница огромная.
Правда, на хранение индекса потребуется дополнительная память, по прикидкам где-то N * 200 байт, но при 100 000 сочетаний это всего лишь 20 Мб. Да и памяти сейчас много, особенно на серверах.
> Я так сначала сделал, но всплыла проблема undifened offset.
Массив можно переиндексировать через array_values
> Иф и регулярка для того что бы установить - в переданном массиве 1 или больше слов.
Ну ок.
> Зачем только использовать фигурные скобки?
Мне показалось пробелы так заметнее выглядят.
> Как понимать !$top
! — логическое не, превращает true в false и наоборот.
if ($top) — сработает если $top не пустое (то есть не равно "", 0, "0", false, null, пустому массиву)
if (!$top) — сработает если $top пустое
Когда ты ставишь просто переменную в if, она преобразуется в boolean тип по правилам описанным тут: http://php.net//manual/ru/language.types.boolean.php#language.types.boolean.casting (а вообще, прочти всю статью про булев тип).
Булев тип - это тип содержащий только 2 значения true (правда) и false (ложь). Операторы сравнения типа == как раз возвращают true/false. Например 2 == 4 -> false, а 2 == 2 -> true. А оператор if соответственно приводит все, что ему дают, к булеву типу и выполняет ту или иную ветку в зависимости от того true или false получилось.
if (false) — никогда не сработает
if (true) — срабатывает
>>372384
> Только подробнее о том что за поиск по ключу,
Дано: 2 массива, массив сочетаний из 2 и из 3 слов. Построим по 3-словным сочетаниям индекс, то есть массив, вида
слово => массив номеров сочетаний, где оно встречается.
Пример: $threeWords = array(
0 => "мама мыла раму",
1 => "мама мыла ламу",
2 => "мыла мыла мыла"
);
По нему строится индекс:
$index = [
"мама" => [0, 1],
"мыла" => [0, 1, 2],
"раму" => [2],
....
];
Потом пройдемся циклом по массиву 2-словных сочетаний. Для каждого слова из сочетания, найдем в индексе номера 3-словных сочетаний и пересечем эти номера, найдя только те сочетания, где есть оба слова. Ну и потом уже можно их сравнить или сразу отсеять.
Допустим у нас N 2-словных и M 3-словных сочетаний. Построение индекса имеет сложность O(M), поиск в индексе по клюу O(1), то есть практически мгновенно, перебор всех 2-словных сочетаний O(N). Обзая сложность O(M + N).
А в случае 2 вложенных циклов и глупого сравнения каждого сочетания мы имеем сложность O(M × N). Подставь значения порядка 100 000 например и сравни сложности. Разница огромная.
Правда, на хранение индекса потребуется дополнительная память, по прикидкам где-то N * 200 байт, но при 100 000 сочетаний это всего лишь 20 Мб. Да и памяти сейчас много, особенно на серверах.
> Я так сначала сделал, но всплыла проблема undifened offset.
Массив можно переиндексировать через array_values
> Иф и регулярка для того что бы установить - в переданном массиве 1 или больше слов.
Ну ок.
> Зачем только использовать фигурные скобки?
Мне показалось пробелы так заметнее выглядят.
> Как понимать !$top
! — логическое не, превращает true в false и наоборот.
if ($top) — сработает если $top не пустое (то есть не равно "", 0, "0", false, null, пустому массиву)
if (!$top) — сработает если $top пустое
Когда ты ставишь просто переменную в if, она преобразуется в boolean тип по правилам описанным тут: http://php.net//manual/ru/language.types.boolean.php#language.types.boolean.casting (а вообще, прочти всю статью про булев тип).
Булев тип - это тип содержащий только 2 значения true (правда) и false (ложь). Операторы сравнения типа == как раз возвращают true/false. Например 2 == 4 -> false, а 2 == 2 -> true. А оператор if соответственно приводит все, что ему дают, к булеву типу и выполняет ту или иную ветку в зависимости от того true или false получилось.
if (false) — никогда не сработает
if (true) — срабатывает
> $input = preg_replace('/[,«»—]/u', '', $input);
Неправильно. Ты перечислил 4 знака, а есть еще десятки других. Надо разбиение слов делать не по пробелу, а определить набор символов, которых входит в слова и все остальные считать разделителями слов.
В остальном, все нормально.
>>372416
Там по моему надо сделать оба флоатами, сдвинутыми в разные стороны + использовать отрицательные маргины, чтобы внешняя ширина флоата стала 0.
>>372434
Не видит ошибок: http://ideone.com/sUV5by
У тебя регулярки в 2 экземплярах повторяются. Копипаста — зло, так как легко ошибиться и забыть что-то скопировать. Избавься от повторов в регулярках, например $matchPattern вполне можно строить на основе массива.
> я сделал шаблонизатор
Прочитай-ка: http://habrahabr.ru/post/230737/ — особенно пункт 6
> $view = fread($view_file, filesize("views/{$view_name}.php"));
Ну что за ужас. Используй file_get_contents
> return '<a href="'.$m[2].'">'
Значения аттрибутов тожде надо по идее экранировать через htmlspecialchars.
Что будет если сделать тег link, в котором внутри строки встречаются кавычки? Например link("<i class='test'>Гугл!</i>", "http://google.com") По моему, работать не будет.
Это кстати еще баг: если непраивльно записать тег link, то он не обрабатается, а выведется как есть, тем самым раскрывая исходный код шаблона посетителям.
> "views/{$view_name}.php"
Плохо исплоьзовать относительные пути так как если это вызвать из файла, хранящегося в другой папке, то и путь вычислится по-дургому.
> $this->replaceVars($vars, $view);
> $this->replaceLinks($vars, $view);
А что, если в одной из переменных будет значение «{link(...)}»? Например, если мы хотим вывести на странице пример кода?
Настоящие шаблонизаторы (twig, смарти) работают не через preg_replace. Они полноценно разбивают шаблон на токены, парсят его в синтаксическое дерево (AST) и работают с ним. Если интересно, можешь начать с вики: http://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D0%BD%D1%82%D0%B0%D0%BA%D1%81%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7
> Значок доллара, получается, переопределён?
Подстановка переменных работает только в строках в двойных кавычках. В одинарных кавычках знак доллара сохраняется как есть и ничего не значит. А preg_replace уже ищет там этот знак и заменяет его. В двойных кавычках можно экранировать знак бекслешем, чтобы PHP не пфтался его понять как переменную:
"\${1}"
> переопределён?
Нет. Просто preg-replace в строке, встречая знак доллара, понимает его по своему.
> Есть какое-нибудь слово для описания результата разделения вёрстки и логики?
Разделение логики и представления, разделение на шаблон и контроллер, отделение html от php.
> $input = preg_replace('/[,«»—]/u', '', $input);
Неправильно. Ты перечислил 4 знака, а есть еще десятки других. Надо разбиение слов делать не по пробелу, а определить набор символов, которых входит в слова и все остальные считать разделителями слов.
В остальном, все нормально.
>>372416
Там по моему надо сделать оба флоатами, сдвинутыми в разные стороны + использовать отрицательные маргины, чтобы внешняя ширина флоата стала 0.
>>372434
Не видит ошибок: http://ideone.com/sUV5by
У тебя регулярки в 2 экземплярах повторяются. Копипаста — зло, так как легко ошибиться и забыть что-то скопировать. Избавься от повторов в регулярках, например $matchPattern вполне можно строить на основе массива.
> я сделал шаблонизатор
Прочитай-ка: http://habrahabr.ru/post/230737/ — особенно пункт 6
> $view = fread($view_file, filesize("views/{$view_name}.php"));
Ну что за ужас. Используй file_get_contents
> return '<a href="'.$m[2].'">'
Значения аттрибутов тожде надо по идее экранировать через htmlspecialchars.
Что будет если сделать тег link, в котором внутри строки встречаются кавычки? Например link("<i class='test'>Гугл!</i>", "http://google.com") По моему, работать не будет.
Это кстати еще баг: если непраивльно записать тег link, то он не обрабатается, а выведется как есть, тем самым раскрывая исходный код шаблона посетителям.
> "views/{$view_name}.php"
Плохо исплоьзовать относительные пути так как если это вызвать из файла, хранящегося в другой папке, то и путь вычислится по-дургому.
> $this->replaceVars($vars, $view);
> $this->replaceLinks($vars, $view);
А что, если в одной из переменных будет значение «{link(...)}»? Например, если мы хотим вывести на странице пример кода?
Настоящие шаблонизаторы (twig, смарти) работают не через preg_replace. Они полноценно разбивают шаблон на токены, парсят его в синтаксическое дерево (AST) и работают с ним. Если интересно, можешь начать с вики: http://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D0%BD%D1%82%D0%B0%D0%BA%D1%81%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7
> Значок доллара, получается, переопределён?
Подстановка переменных работает только в строках в двойных кавычках. В одинарных кавычках знак доллара сохраняется как есть и ничего не значит. А preg_replace уже ищет там этот знак и заменяет его. В двойных кавычках можно экранировать знак бекслешем, чтобы PHP не пфтался его понять как переменную:
"\${1}"
> переопределён?
Нет. Просто preg-replace в строке, встречая знак доллара, понимает его по своему.
> Есть какое-нибудь слово для описания результата разделения вёрстки и логики?
Разделение логики и представления, разделение на шаблон и контроллер, отделение html от php.
Эта может: http://chikuyonok.ru/2010/01/liquid-site-markup/ ?
>>372490
Задача про гамбургер — там надо сделать класс с полями и методами для расчета его стоимости.
> Пик не понимаю. Почему в конце null?
Надо же как-то обозначить что цепочка заканчивается, чтобы поиск свойств не был бесконечным.
> Не могу понять, чем отличается obj. _ _ proto _ _ от obj.prototype.
prototype — это просто свойство с именем prototype. Оно ничего не делает, оно почти точно такое же как свойство с именем obj.lalala например. Но это свойство имеет одну особенность: когда ты создаешь объект через var obj = new A(), именно объект A.prototype становится его прототипом. То есть прототип объекта задается в момент его создания.
_ _ proto _ _ — это прототип объекта (имя условное, в некоторых учебниках пишут obj.[[proto]], к нему все равно обратиться нельзя). То есть другой объект, в котором ищутся свойства.
Принцип прототипов относительно простой:
У каждого объекта есть прототип и он либо тоже является объектом либо равен null. В нем ищутся свойства. Допустим ты пишешь
var a = obj.name;
свойство 'name' сначала ищется в объекте obj, если там нет, то в прототипе объекта obj (obj.[[proto]]), если и там нет, то в прототипе прототипа obj (obj.[[proto]].[[proto]]), и так далее пока не дойдем до конца цепочки — null. Последний прототп в цепочке — это обычно объект Object.prototype, так как все объекты унаседованы от Object. Его прототип равен null.
Обратиться напрямую к прототипу объекта никак нельзя (в некоторых браузерах можно через obj. _ _ proto _ _ но это не стандартная возможность, и ее могут прикрыть). Его, прада, можно получить с помощью Object.getPrototypeOf(obj).
Привязывается прототип в момент создания объекта. В JS нет классов, потому создать новый объект можно либо через new и функцию-конструктор, либо через Object.create().
как работает new? Допустим, выполняется строчка
var obj = new A(...);
- создается пустой объект {}, его прототипом становится A.prototype (если оно не задано, то это будет Object.prototype). Назовем этот пустой объект tmp.
- свойству tmp.constructor присваивается значение A
- вызывается функция A, при этом в качестве this ей передается этот объект tmp
- если функция ничего не вернула, то в obj записывается этот объект. Если функция что-то возвращает, то в obj записывается то, что она вернула, а tmp удаляется.
Вот алгоритм:
var tmp = {};
tmp.[[proto]] = A.prototype;
tmp.constructor = A;
A.call(tmp, ...);
var obj = tmp; // это если функция ничего не вернула
Второй вариант — создание объекта через Object.create(x). Object.create просто создает пустой объект, а его прототипом делает x. Все.
С помощью прототипов можно добавлять методы и свойства к существующим объектам. например, массивы — это объекты, созданные конструктором Array и имеют прототип Array.prototype. Прототип — обычный объект, которму можно добавлять свойства. Напишем:
var arr = [];
Array.prototype.sayHi = function () { console.log('Hi'); };
arr.sayHi(); // выведет Hi
Имей только в виду, что изменение стандартных прототипов типа Array, Date, String, Object счиатется абсолютно дурной и вредной практикой, так как это может нарушить работу других библиотек. Расширяй только свои прототипы.
Если есть вопросы. то задавай, что именно из этого неясно.
Эта может: http://chikuyonok.ru/2010/01/liquid-site-markup/ ?
>>372490
Задача про гамбургер — там надо сделать класс с полями и методами для расчета его стоимости.
> Пик не понимаю. Почему в конце null?
Надо же как-то обозначить что цепочка заканчивается, чтобы поиск свойств не был бесконечным.
> Не могу понять, чем отличается obj. _ _ proto _ _ от obj.prototype.
prototype — это просто свойство с именем prototype. Оно ничего не делает, оно почти точно такое же как свойство с именем obj.lalala например. Но это свойство имеет одну особенность: когда ты создаешь объект через var obj = new A(), именно объект A.prototype становится его прототипом. То есть прототип объекта задается в момент его создания.
_ _ proto _ _ — это прототип объекта (имя условное, в некоторых учебниках пишут obj.[[proto]], к нему все равно обратиться нельзя). То есть другой объект, в котором ищутся свойства.
Принцип прототипов относительно простой:
У каждого объекта есть прототип и он либо тоже является объектом либо равен null. В нем ищутся свойства. Допустим ты пишешь
var a = obj.name;
свойство 'name' сначала ищется в объекте obj, если там нет, то в прототипе объекта obj (obj.[[proto]]), если и там нет, то в прототипе прототипа obj (obj.[[proto]].[[proto]]), и так далее пока не дойдем до конца цепочки — null. Последний прототп в цепочке — это обычно объект Object.prototype, так как все объекты унаседованы от Object. Его прототип равен null.
Обратиться напрямую к прототипу объекта никак нельзя (в некоторых браузерах можно через obj. _ _ proto _ _ но это не стандартная возможность, и ее могут прикрыть). Его, прада, можно получить с помощью Object.getPrototypeOf(obj).
Привязывается прототип в момент создания объекта. В JS нет классов, потому создать новый объект можно либо через new и функцию-конструктор, либо через Object.create().
как работает new? Допустим, выполняется строчка
var obj = new A(...);
- создается пустой объект {}, его прототипом становится A.prototype (если оно не задано, то это будет Object.prototype). Назовем этот пустой объект tmp.
- свойству tmp.constructor присваивается значение A
- вызывается функция A, при этом в качестве this ей передается этот объект tmp
- если функция ничего не вернула, то в obj записывается этот объект. Если функция что-то возвращает, то в obj записывается то, что она вернула, а tmp удаляется.
Вот алгоритм:
var tmp = {};
tmp.[[proto]] = A.prototype;
tmp.constructor = A;
A.call(tmp, ...);
var obj = tmp; // это если функция ничего не вернула
Второй вариант — создание объекта через Object.create(x). Object.create просто создает пустой объект, а его прототипом делает x. Все.
С помощью прототипов можно добавлять методы и свойства к существующим объектам. например, массивы — это объекты, созданные конструктором Array и имеют прототип Array.prototype. Прототип — обычный объект, которму можно добавлять свойства. Напишем:
var arr = [];
Array.prototype.sayHi = function () { console.log('Hi'); };
arr.sayHi(); // выведет Hi
Имей только в виду, что изменение стандартных прототипов типа Array, Date, String, Object счиатется абсолютно дурной и вредной практикой, так как это может нарушить работу других библиотек. Расширяй только свои прототипы.
Если есть вопросы. то задавай, что именно из этого неясно.
В JS нет классов. Вместо «a - объект класса B» пишут «a — объект, созданный конструктором B и имебщий прототип B.prototype». Я буду писать чуть короче, а то руки отвалятся.
В Js есть несколько стандартных конструкторов. Массивы имеют конструткор Array, Объекты — конструктор Object. То есть эти записи равносильны:
var a = [];
var a = new Array();
var b = {};
var b = new Object();
даты имеют конструктор Date (и прототип Date.prototype):
var d = new Date();
Регулярки — конструктор RegExp.
var e = /.../;
var f = new RegExp(...);
Также, можно проверить через instanceof:
[] instanceof Array // true
/a/ instanceof RegExp // true
Со строками, числами и boolean все сложнее. В JS есть очень странные конструкторы String, Number, Boolean, по аналогии с Array, Object, RegExp, Date но эти записи не равносильны:
var m = 'aaa';
var n = new String('aaa');
Так как m — это обычная строка, а n — это объект с конструктором String. Тем не менее, у строк есть прототип String.prototype, потому:
1) "aaa" instanceof String дает true
2) Расширяя String.prototype, можно добавлять новые методы всем строкам:
String.prototype.sayHi = function ...
("aaa").sayHi(); // работает!
Такая вот странность. То есть строки все же не объекты с конструктором String, хотя и очень на них похожи по поведению. Пруф:
typeof [] // -> 'object'
typeof new Array // -> 'object'
typeof "aaa" // -> 'string'
typeof new String("aaa") // -> 'object'
Попробуй в консоли поэкспериментировать со всем этим.
В JS нет классов. Вместо «a - объект класса B» пишут «a — объект, созданный конструктором B и имебщий прототип B.prototype». Я буду писать чуть короче, а то руки отвалятся.
В Js есть несколько стандартных конструкторов. Массивы имеют конструткор Array, Объекты — конструктор Object. То есть эти записи равносильны:
var a = [];
var a = new Array();
var b = {};
var b = new Object();
даты имеют конструктор Date (и прототип Date.prototype):
var d = new Date();
Регулярки — конструктор RegExp.
var e = /.../;
var f = new RegExp(...);
Также, можно проверить через instanceof:
[] instanceof Array // true
/a/ instanceof RegExp // true
Со строками, числами и boolean все сложнее. В JS есть очень странные конструкторы String, Number, Boolean, по аналогии с Array, Object, RegExp, Date но эти записи не равносильны:
var m = 'aaa';
var n = new String('aaa');
Так как m — это обычная строка, а n — это объект с конструктором String. Тем не менее, у строк есть прототип String.prototype, потому:
1) "aaa" instanceof String дает true
2) Расширяя String.prototype, можно добавлять новые методы всем строкам:
String.prototype.sayHi = function ...
("aaa").sayHi(); // работает!
Такая вот странность. То есть строки все же не объекты с конструктором String, хотя и очень на них похожи по поведению. Пруф:
typeof [] // -> 'object'
typeof new Array // -> 'object'
typeof "aaa" // -> 'string'
typeof new String("aaa") // -> 'object'
Попробуй в консоли поэкспериментировать со всем этим.
А, я ошибся. Этого шага:
tmp.constructor = A
Нету. Свойство constructor изначально есть в A.prototype, потому оно не копируется никуда. То есть когда ты создаешь функцию, у нее автоматически создается свойство prototype, и в него помещается объект с единственным свойством constructor, которое указывает на саму функцию:
function test() {}
console.log(test.prototype.constructor); // function test
console.log(test.prototype); // объект с единственным свойством constructor = test
И еще говоря про стандартные конструкторы, у функций в цепочке прототипов есть Function.prototype:
(function () {}) instanceof Function // true
B они похоже являются объектами созданными Function:
typeof new Function // 'function'
typeof (function () {}) // 'function'
В общем, поэкспериментируй со всем этим в консоли, Хромовская кстати удобнее фаерфоксовской на мой взгляд.
>>372495
действительно.
unset($d) не нужен.
Удалять элементы можно проще, через unset.
А, я ошибся. Этого шага:
tmp.constructor = A
Нету. Свойство constructor изначально есть в A.prototype, потому оно не копируется никуда. То есть когда ты создаешь функцию, у нее автоматически создается свойство prototype, и в него помещается объект с единственным свойством constructor, которое указывает на саму функцию:
function test() {}
console.log(test.prototype.constructor); // function test
console.log(test.prototype); // объект с единственным свойством constructor = test
И еще говоря про стандартные конструкторы, у функций в цепочке прототипов есть Function.prototype:
(function () {}) instanceof Function // true
B они похоже являются объектами созданными Function:
typeof new Function // 'function'
typeof (function () {}) // 'function'
В общем, поэкспериментируй со всем этим в консоли, Хромовская кстати удобнее фаерфоксовской на мой взгляд.
>>372495
действительно.
unset($d) не нужен.
Удалять элементы можно проще, через unset.
попробуй убрать все из .htaccess и оставить там только:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule \.jpg$ test.php
Это перенаправит все запросы к несуществующим jpg-картинкам на test.php и должно работать.
А потом отталкивайся уже от этого файла.
Оп данное правило не срабатывает, оно даже не перенаправляет на файл tryCatchImage.php
Что я делаю не так?!...
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule \.jpg$ tryCatchImage.php
Ссылка на картинку будет браться из базы.
Следовательно мы может делать запрос на каждую картинку.
Далее проверять существует ли картинка по пути /image/thumb/,
если да, то создавать переменную на картинку и ее отдавать, если нет , то запускать скрипт?
Что то типа того:
$fileName="выдергиваем картинку из базы";
define ('DIR_IMG' ,'image/thumbs/');
$imagePath = DIR_IMG.$fileName
if($imagePath){
$image= DIR_IMG.$fileName;
}
else {
$image= thumbnail::loadImgage($imagePath,300,400);
}
Соответственно в коде будет
<div class="thumb">
<img src=<?php echo $image; ?>/ >
</div>
Правда не будет ли такой вариант конфликтовать с требованиями по задаче..
цикл for написан не правильно, инкремент не должен быть в теле цикла.Он должен быть в условии цикла.
А еще у тебя не учитывается комиссия так как у тебя есть две разных переменных почти одноименных ))))
Смотри внизу странички, что в stderr написано.
У тебя опечатки в названиях переменных и $month++ можно смело перенести в тело цикла.
И да, у софтбанка должно быть около 61270 рублей.
Кредит не для всех случаев правильно считается.
К тому же ты добавляешь плату за открытие счёта в кредит, но школьник же за открытие счёта платит сразу, а не просит дяденьку в сумму кредита это добавить.
Но ведь в задаче написано, что плата за открытие кредита добавляется к сумме кредита.
Каждый месяц к кредиту добавляется процент от него и комиссия.
> Задание: воспользовавшись ранее купленным айфоном (и полученными на сами знаете каком сайте знаниями), определи наиболее выгодный кредит. Платить школьник, как и прежде, может не более 5000 р. в месяц. Сначала начисляются проценты и комиссия, а только потом происходит выплата.
Я всё ещё не понимаю. В моём коде, я сначала начисляю проценты, после добавляю комиссию, а в конце делаю выплату.
>Сначала начисляются проценты и комиссия, а только потом происходит выплата.
вроде всё сходится
1) Каждый шаг цикла можно считать очередным месяцем.
2) Каждый месяц к кредиту добавляется процент от него и комиссия.
Спойлер: на всех ли ты месяцах добавляешь процент и комиссию?
Понял, спасибо.
>Вот алгоритм:
var tmp = {};
tmp.[[proto]] = A.prototype;
tmp.constructor = A;
A.call(tmp, ...);
var obj = tmp; // это если функция ничего не вернула
Вот это что-то я не понял.
http://jsbin.com/jojapi/2/edit?js,console
Оп, на php я бы использовал __ construct, а еще __ set. Как делать в javascript?
Мне нужно, чтобы при создании объекта автоматически вызывались методы и меняли значения свойств? Это возможно? А именно, при создании объекта сразу же рассчитывался this.cost. А я потом бы просто, например, через getResult, который возвращает стоимость и калории, выводил бы результат.
Тут прототипы нужны? Но все равно плохо, что у одного объекта можно создать только один прототип, а то был бы гамбургер и от него два прототипа - большой и маленький.
Или как решить эту задачу про гамбургеры? Что тут может быть константами?
Как реализовать разделы АИБ? Разделы должны быть изолированы друг от друга. Можно каждому разделу давать таблицу, но нужно же еще и хранить информацию о разделе. Можно для этого создать отдельную таблицу типа description, но не лучше ли тогда каждому разделу давать отдельную БД?
61270 будет при 40к, не парься об этом.
<h1>Демо использования SynApi</h1>
<br />
Для того чтобы синомизировать текст достаточно написать: <b>Synomize($Text);</b> Эта функция вернет синомизированный текст<br />
Качество можно задать так: <b>Synomize($Text,$Flag)</b>, где флаг $Flag от 0 до 3500, Чем он выше тем хуже качество, но выше процент замен<br />
На локалхосте должен быть запущен синомайзер.<br />
Можно работать с синомайзером с другой машины. Для этого вызывайте <b>Synomize($Text,$Flag,$Host)</b>, где $Host название домена, апи, имя в локальной сети машины с запущеным синомайзером<br />
<?php
function Synomize($Text,$Flag=2500,$Host="127.0.0.1")
{//Возвращает синомизированный текст
if(!$Flag)
$Flag=0;//Это на всякий случай
$sock = fsockopen ($Host, 4396, $errno, $errstr); //открываем сокет
if (!$sock)
echo("$errno($errstr)");
else
{
fputs ($sock, "20010,0,$Flag,$Text");//фигачим сообщение
$result=fread ($sock,1000000);//читаем
fclose($sock);
return $result;
}
}
function isSynApiAvalible($Host="127.0.0.1")
{//Проверяет наличие доступность интерфейса SynApi
// НЕ особо нужная функция так для хорошего стиля
$sock = fsockopen ($Host, 4396, $errno, $errstr);
fputs ($sock, "20000,0,0,NONE");
$result=fread ($sock,1000000);
fclose($sock);
if($result=='333')
return true;
if($result=='-102')
return 'Интерфейс SynApi недоступен, это на машине Установлена демо версия';
if($result=='-102')
return 'Интерфейс SynApi доступен, однако с ограничениями Лайт версии';
if($result=='-103')
return 'Интерфейс SynApi был отключен пользователем приложения';
if($result=='-104')
return 'Интерфейс SynApi недоступен, поскольку программа еще не до конца загрузилась';
return $result;
}
if($_POST['text'])
{
if(isSynApiAvalible()===true)
echo '<h2>Результат</h2>:'.Synomize($_POST['text'], $_POST['flag']);
else
die (isSynApiAvalible());
}
?><br />
<form method="post">
Текст:<br />
<textarea name="text" cols="60" rows="10"><?php echo $_POST['text'];?></textarea><br />
Флаг:<br />
<select name="flag">
<option value="0">нет (Лучшее качество)</option>
<option value="500">-А</option>
<option value="1000">-</option>
<option value="1500">- -А</option>
<option value="2000">--</option>
<option value="2500">-- -А</option>
<option value="3000">---</option>
<option value="3500">--- -А (Лучшая уникальность)</option>
</select>
<input type="submit" />
</form>
Штука в том, что мне формочка не нужна, Короче я просто форму убрал, чтобы запустить тест, а оно не пашет сукааа:
$Flag=3500;
//$Text=$_POST['Text'];
$Text='В Ростуризм поступают письма с жалобами клиентов ранее приостановившей деятельность турфирмы «Нева». В частности, у некоторых туристов за рубежом удерживают паспорта и вымогают деньги, сообщает РИА «Новости». О фактах вымогательства глава Ростуризма Олег Сафонов сообщил в письме генсеку Всемирной туристской организации ООН (UNWTO) Талебу Рифаи. Ростуризм просит Рифаи «еще раз обратить внимание на недопустимость в отношении туристов подобных действий».';
$Host="127.0.0.1";
$sock = fsockopen ($Host, 4396, $errno, $errstr); //открываем сокет
fputs ($sock, "20010,0,$Flag,$Text");//фигачим сообщение
//sleep(2);
$result=fread ($sock,1000000);//читаем
fclose($sock);
echo '<h2>Результат</h2>:'.$result;
Где косяк блин?
<h1>Демо использования SynApi</h1>
<br />
Для того чтобы синомизировать текст достаточно написать: <b>Synomize($Text);</b> Эта функция вернет синомизированный текст<br />
Качество можно задать так: <b>Synomize($Text,$Flag)</b>, где флаг $Flag от 0 до 3500, Чем он выше тем хуже качество, но выше процент замен<br />
На локалхосте должен быть запущен синомайзер.<br />
Можно работать с синомайзером с другой машины. Для этого вызывайте <b>Synomize($Text,$Flag,$Host)</b>, где $Host название домена, апи, имя в локальной сети машины с запущеным синомайзером<br />
<?php
function Synomize($Text,$Flag=2500,$Host="127.0.0.1")
{//Возвращает синомизированный текст
if(!$Flag)
$Flag=0;//Это на всякий случай
$sock = fsockopen ($Host, 4396, $errno, $errstr); //открываем сокет
if (!$sock)
echo("$errno($errstr)");
else
{
fputs ($sock, "20010,0,$Flag,$Text");//фигачим сообщение
$result=fread ($sock,1000000);//читаем
fclose($sock);
return $result;
}
}
function isSynApiAvalible($Host="127.0.0.1")
{//Проверяет наличие доступность интерфейса SynApi
// НЕ особо нужная функция так для хорошего стиля
$sock = fsockopen ($Host, 4396, $errno, $errstr);
fputs ($sock, "20000,0,0,NONE");
$result=fread ($sock,1000000);
fclose($sock);
if($result=='333')
return true;
if($result=='-102')
return 'Интерфейс SynApi недоступен, это на машине Установлена демо версия';
if($result=='-102')
return 'Интерфейс SynApi доступен, однако с ограничениями Лайт версии';
if($result=='-103')
return 'Интерфейс SynApi был отключен пользователем приложения';
if($result=='-104')
return 'Интерфейс SynApi недоступен, поскольку программа еще не до конца загрузилась';
return $result;
}
if($_POST['text'])
{
if(isSynApiAvalible()===true)
echo '<h2>Результат</h2>:'.Synomize($_POST['text'], $_POST['flag']);
else
die (isSynApiAvalible());
}
?><br />
<form method="post">
Текст:<br />
<textarea name="text" cols="60" rows="10"><?php echo $_POST['text'];?></textarea><br />
Флаг:<br />
<select name="flag">
<option value="0">нет (Лучшее качество)</option>
<option value="500">-А</option>
<option value="1000">-</option>
<option value="1500">- -А</option>
<option value="2000">--</option>
<option value="2500">-- -А</option>
<option value="3000">---</option>
<option value="3500">--- -А (Лучшая уникальность)</option>
</select>
<input type="submit" />
</form>
Штука в том, что мне формочка не нужна, Короче я просто форму убрал, чтобы запустить тест, а оно не пашет сукааа:
$Flag=3500;
//$Text=$_POST['Text'];
$Text='В Ростуризм поступают письма с жалобами клиентов ранее приостановившей деятельность турфирмы «Нева». В частности, у некоторых туристов за рубежом удерживают паспорта и вымогают деньги, сообщает РИА «Новости». О фактах вымогательства глава Ростуризма Олег Сафонов сообщил в письме генсеку Всемирной туристской организации ООН (UNWTO) Талебу Рифаи. Ростуризм просит Рифаи «еще раз обратить внимание на недопустимость в отношении туристов подобных действий».';
$Host="127.0.0.1";
$sock = fsockopen ($Host, 4396, $errno, $errstr); //открываем сокет
fputs ($sock, "20010,0,$Flag,$Text");//фигачим сообщение
//sleep(2);
$result=fread ($sock,1000000);//читаем
fclose($sock);
echo '<h2>Результат</h2>:'.$result;
Где косяк блин?
Ну то есть он возвращает исходный и необработанный текст.
http://jsbin.com/yabiyo/3/edit?js,console
И так примитивно любой решит. Думается мне, что тут по-другому решается, ведь так?
Что делает вот эта строка?
return this[arr[1]](+arr[0], +arr[2]);
Что значит this[arr[1]]? Почему не this.[arr[1]]?
К сожалению, нет. Есть 2 неплохих книги, в плане уровня, это Зандстра и Шлоссгнейл, они есть в ОП-посте, но они не совсем новые. А другие книги, которые я видел, по уровню ниже плинтуса. И часто это перепечатки старых книг, где тупо mysql заменили на mysqli.
Так что ответом наверно будет прочесть одну из этих книг + погуглить статьи типа «что нового в php 5.3», 5.4, 5.5 и так далее — они есть на хабре точно, они там появляются когда выходит новая версия.
Насчет работы с БД — PDO конечно: http://habrahabr.ru/post/137664/
>>372555
Оно перенаправляет только ссылки, которые заканчиваются на .jpg и если это ссылка на несуществующую картинку. Например, /do_not_exist.jpg
Так, а вообще, странно, конечно, должно работать.
Может у тебя на сервере как-то отключено выполнение .htaccess ? Может ты файл неправильно назвал, не .htaccess, а как-то по-другому?
Какой сервер ты используешь? Апач? Денвер? WAMP? В конфигах менял что-нибудь?
В настройках Апача (httpd.conf и файлы, на которые он ссылается) можно использовать специальные команды, включающие и отключающие обработку htaccess. Вот они:
AllowOverride None — отключает выполнение .htaccess
AllowOverride All — включает
Причем эти команды могут быть заданы для отдельных сайтов и папок. Проверь-ка, не менял ли ты что-то в конфиге Апача? Не вписывал ли туда подобные команды?
Ага, подумаю, надо тем чтобы сделать обнвляемую пасту со ссылками. Сделал для начала: https://gist.github.com/codedokode/98a0f0976ef454436d0c
>>372574
О, мне нравится, как сделан вывод информации. Жаль, правда, с длинными предложениями будет не очень удобно, ну да ладно, это мелочи.
Но, увы, не видит ошибки в слове «Зделаем»: http://ideone.com/PuiyoX
> кончатся знаком препинания
«кончаться» же. Может надо еще проверку ться/тся запилить? шучу, не запиливай, а то мы тебя потеряем
>>372602
> Далее проверять существует ли картинка по пути /image/thumb/,
> если да, то создавать переменную на картинку и ее отдавать
Выглядит как усложнение. Не, не надо. Надо чтобы при обращении к картинке со стороны браузера генерировалась.
>>372614
> $creditBalance=$creditBalance-$monthlyPayment;
Во-первых, стоит ставить пробелы вокруг арифметических знаков, чтобы слова не слипались, во-вторых, тут можно использовать -=:
$creditBalance -= $monthlyPayment;
Ну и код через phpformatter пропустить. А так, считает верно, замечания только к оформлению.
Ага, подумаю, надо тем чтобы сделать обнвляемую пасту со ссылками. Сделал для начала: https://gist.github.com/codedokode/98a0f0976ef454436d0c
>>372574
О, мне нравится, как сделан вывод информации. Жаль, правда, с длинными предложениями будет не очень удобно, ну да ладно, это мелочи.
Но, увы, не видит ошибки в слове «Зделаем»: http://ideone.com/PuiyoX
> кончатся знаком препинания
«кончаться» же. Может надо еще проверку ться/тся запилить? шучу, не запиливай, а то мы тебя потеряем
>>372602
> Далее проверять существует ли картинка по пути /image/thumb/,
> если да, то создавать переменную на картинку и ее отдавать
Выглядит как усложнение. Не, не надо. Надо чтобы при обращении к картинке со стороны браузера генерировалась.
>>372614
> $creditBalance=$creditBalance-$monthlyPayment;
Во-первых, стоит ставить пробелы вокруг арифметических знаков, чтобы слова не слипались, во-вторых, тут можно использовать -=:
$creditBalance -= $monthlyPayment;
Ну и код через phpformatter пропустить. А так, считает верно, замечания только к оформлению.
Здравствуй ОП, давно не обращался к тебе, пришло время.
https://github.com/Purplepeak/TestHub
Полноценная регистрация оказалась не такой простой задачей, как я себе представлял.
Вроде привел все в божеский вид. Вывел регистрацию и вход через социальные кнопки в отдельное расширение. Также расширением сделал рекапчу, не уверен удачный ли это вариант не для тестового проекта.
>>372619
>>372620
О, я вижу, аноны тоже выучили эту задачу наизучть. А уж как я ее выучил...
>>372742
Ну давай по шагам разберем, как создается объект. Я говорил, что есть фактически 2 способа: через Object.create() и через new (ну и плюс, литеральный синтаксис var x = { a: 1, b: 2 } который мы не рассматриваем).
Начнем с нового способа (который появился то ли в ES5, то ли еще где-то):
var newObj = Object.create(oldObj); // oldObj — любой объект или null
Это создает новый, пустой объект и делает его прототипом oldObj. То есть можно записать как:
var tmp = {};
tmp.[[proto]] = oldObj;
newObj = tmp;
C этим все понятно? Этот способ соответствует идеологии яваскрипт — объекты создаются на основе других обхектов, а не классов (которых в языке нет, по крайней мере до версии ES6). Странно, впрочем, что яваскрипт как-то прожил 20 лет без этого способа.
Второй способ — через new и функцию-конструктор. Функцей-конструктором может быть абсолютно любая функция. Конструктором она называется потому, что может в момент создания добавить в объект какие-то свойства. Но она может быть и пустой.
var x = new Func(...);
Опишем по шагам, чтот происходит:
1) создается новый пустой объект
var tmp = {};
2) Его прототипом ставится то, что хранится в свойстве prototype у конструктора:
tmp.[[proto]] = Func.prototype;
По умолчани, когда ты создаешь функцию, в ее свойство prototype записывается объект с единственным свойством конструктор, указывающим на нее же (функцию): Func.prototype = (по умолчанию) { constructor: Func }; Если ты не менял это свойство, то этот объект и становится прототипом нового объекта.
3) Вызывается функция-конструктор, и в качестве this передается временный объект:
var result = Func.call(tmp, ... аргументы конструктора ...);
4) Если функция Func ничего не вернула (точнее, вернула undefined, который возвращается по умолчанию), то new возвращает новый созданный объект (и он копируется в переменную):
var x = tmp;
5) Если же функция что-то вернула, то временный объект tmp выкидывается, и конструкция new возвращает это значение:
var x = result;
Если что-то непонятно, задавай конкретные вопросы.
Ссылки:
http://habrahabr.ru/post/140810/
http://habrahabr.ru/company/enterra/blog/153365/
>>372619
>>372620
О, я вижу, аноны тоже выучили эту задачу наизучть. А уж как я ее выучил...
>>372742
Ну давай по шагам разберем, как создается объект. Я говорил, что есть фактически 2 способа: через Object.create() и через new (ну и плюс, литеральный синтаксис var x = { a: 1, b: 2 } который мы не рассматриваем).
Начнем с нового способа (который появился то ли в ES5, то ли еще где-то):
var newObj = Object.create(oldObj); // oldObj — любой объект или null
Это создает новый, пустой объект и делает его прототипом oldObj. То есть можно записать как:
var tmp = {};
tmp.[[proto]] = oldObj;
newObj = tmp;
C этим все понятно? Этот способ соответствует идеологии яваскрипт — объекты создаются на основе других обхектов, а не классов (которых в языке нет, по крайней мере до версии ES6). Странно, впрочем, что яваскрипт как-то прожил 20 лет без этого способа.
Второй способ — через new и функцию-конструктор. Функцей-конструктором может быть абсолютно любая функция. Конструктором она называется потому, что может в момент создания добавить в объект какие-то свойства. Но она может быть и пустой.
var x = new Func(...);
Опишем по шагам, чтот происходит:
1) создается новый пустой объект
var tmp = {};
2) Его прототипом ставится то, что хранится в свойстве prototype у конструктора:
tmp.[[proto]] = Func.prototype;
По умолчани, когда ты создаешь функцию, в ее свойство prototype записывается объект с единственным свойством конструктор, указывающим на нее же (функцию): Func.prototype = (по умолчанию) { constructor: Func }; Если ты не менял это свойство, то этот объект и становится прототипом нового объекта.
3) Вызывается функция-конструктор, и в качестве this передается временный объект:
var result = Func.call(tmp, ... аргументы конструктора ...);
4) Если функция Func ничего не вернула (точнее, вернула undefined, который возвращается по умолчанию), то new возвращает новый созданный объект (и он копируется в переменную):
var x = tmp;
5) Если же функция что-то вернула, то временный объект tmp выкидывается, и конструкция new возвращает это значение:
var x = result;
Если что-то непонятно, задавай конкретные вопросы.
Ссылки:
http://habrahabr.ru/post/140810/
http://habrahabr.ru/company/enterra/blog/153365/
> на php я бы использовал __ construct,
В яваскрипте это функция-конструткор — она вызвается при создании оюъекта.
> а еще __ set
Зачем? В яваскрипт в новых версиях есть конечно Object.defineProperty, который позволяет делать геттеры/сеттеры, вызваемые при обращении к свойству, но в этой задаче это не требуется.
> Мне нужно, чтобы при создании объекта автоматически вызывались ...
Конструктор вызывается при создании объекта. Пиши там код.
> А именно, при создании объекта сразу же рассчитывался this.cost.
Это невозможно так как в момент создания мы еще не знаем какие добавки выбраны (мы же не передаем их значения в конструктор?).
В любой задаче на ООП надо определить, какие у нас есть объекты, какие у них свойства и методы. Давай, подумаем, какие свойства и методы должны быть у объекта гамбургера? Свойства:
- тип гамбургера
- начинка
- используемые добавки
Методы:
- добавить добавку
- посчитать цену
- посчитать калорийность
Ну и конструктор, где надо указать тип гамбургера и начинку (так как это обязательные свойства, мы указываем их в конструкторе, чтобы без них нельзя было создать объект).
Для обозначения типов добавок логично использовать константы, по типу Hamburger.FILLING_CHEESE
Свойство cost нам не нужно. Зачем его хранить, если его в любой момент можно вычислить из имеющихся данных? Наоборот, это ненужный геморрой, хранить его и обновлять это свойство при любых изменениях в объекте. Это лишний код, усложняющий программу.
То, что у тебя, похоже на то, что нужно. Продолжай делать.
> this.setCost
Этот метод не нужен, так как мы не можем задать гамбургеру произвольную цену, она считается из имебщихся данных.
> if (this.size == 'small') {
Тут надо использовать константу
> Что тут может быть константами?
Очевидно, типы гамбургеров, добавок и начинок.
> на php я бы использовал __ construct,
В яваскрипте это функция-конструткор — она вызвается при создании оюъекта.
> а еще __ set
Зачем? В яваскрипт в новых версиях есть конечно Object.defineProperty, который позволяет делать геттеры/сеттеры, вызваемые при обращении к свойству, но в этой задаче это не требуется.
> Мне нужно, чтобы при создании объекта автоматически вызывались ...
Конструктор вызывается при создании объекта. Пиши там код.
> А именно, при создании объекта сразу же рассчитывался this.cost.
Это невозможно так как в момент создания мы еще не знаем какие добавки выбраны (мы же не передаем их значения в конструктор?).
В любой задаче на ООП надо определить, какие у нас есть объекты, какие у них свойства и методы. Давай, подумаем, какие свойства и методы должны быть у объекта гамбургера? Свойства:
- тип гамбургера
- начинка
- используемые добавки
Методы:
- добавить добавку
- посчитать цену
- посчитать калорийность
Ну и конструктор, где надо указать тип гамбургера и начинку (так как это обязательные свойства, мы указываем их в конструкторе, чтобы без них нельзя было создать объект).
Для обозначения типов добавок логично использовать константы, по типу Hamburger.FILLING_CHEESE
Свойство cost нам не нужно. Зачем его хранить, если его в любой момент можно вычислить из имеющихся данных? Наоборот, это ненужный геморрой, хранить его и обновлять это свойство при любых изменениях в объекте. Это лишний код, усложняющий программу.
То, что у тебя, похоже на то, что нужно. Продолжай делать.
> this.setCost
Этот метод не нужен, так как мы не можем задать гамбургеру произвольную цену, она считается из имебщихся данных.
> if (this.size == 'small') {
Тут надо использовать константу
> Что тут может быть константами?
Очевидно, типы гамбургеров, добавок и начинок.
Одна таблица на все разделы, зачем отдельные таблицы?
> Можно для этого создать отдельную таблицу типа description,
Таблица вида раздел -> описание
> но не лучше ли тогда каждому разделу давать отдельную БД?
Ну давай еще и код копировать для каждого раздела отдельно, будет 50 одинаковых файлов, да?
>>372992
И в чем смысл этих синонимайзеров? Плодить текст дляроботов и замусоривать поисковую выдачу? дурным делом занимаешься, нормальные сайты как-то без этого обходятся.
> Где косяк блин?
Может косяк в том, что ты разделяешь параметры запятыми, а они могут встретиться в тексте?
А так, напиши какую именно ошибку выводит код, если она есть (проверь, что у тебя включено отображение ошибок display_errors = on или читай логи). Экстрасенсы в отпуске, и по самому коду вряд ли что скажут.
> Ну то есть он возвращает исходный и необработанный текст.
Почитай докуметацию по АПИ, если она есть. Ты наверо что-то не то указал во флагах.
>>372998
> ". " => "/ *[.] */",
> "? " => "/ *[?] */",
Это все можно поменять одним выражением
Чтобы сделать первую букву заглавной, не нужен preg_match/preg_replace, бери просто первуй символ строки через mb_substr(), преобразуй в нужный регистр и присоедини остаток строки. Чтобы сделать это в каждом предложении, модно разбить текст на массив предложений, сделать первую букву заглавной в каждом и склеить назад. При этом наверно и код удаления лишних пробелов будет не нужен.
В общем,оно работает, но давай-ка сделаем код проще.
Одна таблица на все разделы, зачем отдельные таблицы?
> Можно для этого создать отдельную таблицу типа description,
Таблица вида раздел -> описание
> но не лучше ли тогда каждому разделу давать отдельную БД?
Ну давай еще и код копировать для каждого раздела отдельно, будет 50 одинаковых файлов, да?
>>372992
И в чем смысл этих синонимайзеров? Плодить текст дляроботов и замусоривать поисковую выдачу? дурным делом занимаешься, нормальные сайты как-то без этого обходятся.
> Где косяк блин?
Может косяк в том, что ты разделяешь параметры запятыми, а они могут встретиться в тексте?
А так, напиши какую именно ошибку выводит код, если она есть (проверь, что у тебя включено отображение ошибок display_errors = on или читай логи). Экстрасенсы в отпуске, и по самому коду вряд ли что скажут.
> Ну то есть он возвращает исходный и необработанный текст.
Почитай докуметацию по АПИ, если она есть. Ты наверо что-то не то указал во флагах.
>>372998
> ". " => "/ *[.] */",
> "? " => "/ *[?] */",
Это все можно поменять одним выражением
Чтобы сделать первую букву заглавной, не нужен preg_match/preg_replace, бери просто первуй символ строки через mb_substr(), преобразуй в нужный регистр и присоедини остаток строки. Чтобы сделать это в каждом предложении, модно разбить текст на массив предложений, сделать первую букву заглавной в каждом и склеить назад. При этом наверно и код удаления лишних пробелов будет не нужен.
В общем,оно работает, но давай-ка сделаем код проще.
Так это простая задача, опытный программист ее за полторы минуты решит, и ты тоже решишь, если будешь усердно заниматься.
Я выше написал, лучше вместо прямого доступа к свойствам сделать методы, посчитать цену и посчитать калории — так проще, чем поддерживать это свйоство cost и постоянно его пересчитывать.
Тем более что у тебя оно само не пересчитывается, а надо сначала вызвать setProperties(). Это очень-очень плохо. Представь, другой программист (или ты спустя полгода) захочет использовать класс. Как он должен догадаться, что надо сначала вызвать setProperties(), а толкьо потом проверять свойство cost? Хуже того, если свойство setproperties() вызывать дважды, то цена вырастет в 2 раза. Представь себе состояние бедного программиста, который полночи потратит на поиск причин ошибок и отладку.
Не надо так. Сделай методы посчитать цену и калории. В таком варианте ошибиться не получится. Ой-ой, это простая задачка на основы ООП с 3 методами, а ты нагородил тут странный велосипед какой-то.
Ну и старайся все менять через методы, а не через прямой доступ к свойствам. Тебе же легче будет. Правда, в JS нет приватных свойств (что плохо), но можно договориться, что свойства мы напрямую не меняем.
Плюс, нужны костанты.
2 книги, Зандстра и Шлосснейгл, названия в первом посте. Также, есть мой мини-урок для начинающих, который все понимают: http://archive-ipq-co.narod.ru/l1/pasta.html
>>373085
> Что значит this[arr[1]]?
Взять поле с именем, которое хранится в arr[1], из объекта this. То есть если arr[1] допустим равно 'lol' то это равносильно this.lol или this['lol']
> Почему не this.[arr[1]]?
Потому что, после точки могут стоять не любые символы, а только [a-z_][a-z0-9_]*
То есть можно:
x.a
x.a1
x.hello_world
x._oh_you_
Нельзя:
x.111
x.[ololo]
x.(yyy)
x.@aaa
И так далее.
Еще обрати внимание:
obj.prop = obj['prop']
obj[prop] нельзя записать через точку, так как тут переменная prop, а не имя 'prop'
obj['234'] нельзя записать через точку так как ключ начинается с цифры
>>373098
Ок, хорошо, я гляну но не сегодня так как уже поздно.
2 книги, Зандстра и Шлосснейгл, названия в первом посте. Также, есть мой мини-урок для начинающих, который все понимают: http://archive-ipq-co.narod.ru/l1/pasta.html
>>373085
> Что значит this[arr[1]]?
Взять поле с именем, которое хранится в arr[1], из объекта this. То есть если arr[1] допустим равно 'lol' то это равносильно this.lol или this['lol']
> Почему не this.[arr[1]]?
Потому что, после точки могут стоять не любые символы, а только [a-z_][a-z0-9_]*
То есть можно:
x.a
x.a1
x.hello_world
x._oh_you_
Нельзя:
x.111
x.[ololo]
x.(yyy)
x.@aaa
И так далее.
Еще обрати внимание:
obj.prop = obj['prop']
obj[prop] нельзя записать через точку, так как тут переменная prop, а не имя 'prop'
obj['234'] нельзя записать через точку так как ключ начинается с цифры
>>373098
Ок, хорошо, я гляну но не сегодня так как уже поздно.
return this[arr[1]](+arr[0], +arr[2]);
Да как же это работает?
this[arr[1]] = '**' возведение в степень
+arr[0] = 2; плюс я как понимаю из строки в число переводит?
+arr[2] = 3;
И что получается? '**'(+2, +3)
Ерунда же. Как это работает?
Все, понял.
function makeCounter() {
var currentCount = 0;
return function() {
currentCount++;
return currentCount;
};
}
var counter = makeCounter();
// каждый вызов увеличивает счётчик
counter();
counter();
alert( counter() ); // 3
Какая разница между counter()и makeCounter()()?
Функция принимает три числа. Эти три числа могут быть как просто тремя числами, тремя числами тысяч, миллионов, миллиардов и т.д. Соответственно когда ты передаешь функции три числа являющиеся тысячами, то надо передать ей параметр isFemale = 1, что бы функция вернула верное слово, в случае же простых чисел и миллионов передается isFemale = 0, и нужные цифры берутся только из 1 массива. И да эта функция считает все что угодно, хоть триллионы, надо просто написать другую функцию которая разобьет большое число на группы из 3 и передаст их нашей функции, и полученный результат склеит в единое большое число.
Не пойму, какие три числа? Функция малых чисел переводит в строку переданные ей трёхзначные числа, тысячами и миллионами занимается уже другая функция, которая включает в себя и функцию малых чисел. Не проще ли определять род в этой другой функции, чем передавать дополнительный параметр и городить еще один массив с условием в smallNumberToText, тем более женский род нужен только для случая, когда у нас одна или две тысячи.
Ну да. Функция разбивает число 661661 на 661 и 661. И передает эти два числа в нашу функцию. В первом случае параметр isFemale будет равен 1, так как это тысячи и функция вернет "шестьсот шестьдесят одна", во втором же случае параметр isFemale = 0, так как это не тысячи и функция вернет "шестьсот шестьдесят один".
Короче, почему вызов makeCounter()() вместо counter() не приводит увеличению счетчика? Вложенная функция ведь должна постоянно существовать, так как на нее ссылается переменная counter.
Функция makeCounter()() умирает после выполнения. Память чистится.
А в counter = makeCounter(); мы сохраняем вложенную функцию, которая ссылается на makeCounter, поэтому все живы.
Объект переменных внешней функции существует в памяти до тех пор, пока существует хоть одна внутренняя функция, ссылающаяся на него через свойство.
Ну вот сохранили в переменную вложенную функцию:
counter = makeCounter();
Теперь делаю вызов функции makeCounter()(). Почему после выполнения память чистится, если существует переменная counter с вложенной функцией, которая ссылается на makeCounter?
http://jsbin.com/harira/3/edit?js,console
Если мы договариваемся, что не будем менять константу, то куда записывать гамбургер с добавленной добавкой?
Ну и makeCounter()() опять же просто вызовет внутреннюю функцию, вернет то, что надо и успокоится.
makeCounter()() вернет просто результат и забудет его.
makeCounter() вернет вложенную функцию и опять же забудет, если никуда не сохранить.
>До выполнения первой строчки её кода, на стадии инициализации, интерпретатор создает пустой объект LexicalEnvironment и заполняет его.
>В данном случае туда попадает аргумент единственная переменная currentCount.
>Далее выполняется функция.
>В конце выполнения функции объект с переменными обычно выбрасывается и память очищается.
Цитаты из учебника.
counter = makeCounter(); Тут создается и сохраняется объект LexicalEnvironment
А тут makeCounter()() создается еще один объект LexicalEnvironment, а потом удаляется.
Оп, и ты меня поправь. Вдруг я ерунду говорю. Правильно ли я сам понимаю?
А тут counter() ссылается на имеющийся LexicalEnvironment, ну тот, который сохранился.
Там скорее всего
arr[1] = '**'
Соответственно происходит вызов this[''](...), то есть вызов функции, хранящейся в свойстве с именем '' (имя свойства объекта может быть любой строкой, в том числе из звездочек).
«плюс», да, приводит значение к числу.
>>373193
Удаленно (на наших).
>>373236
> Какая разница между counter()и makeCounter()()?
Если она вызывается только один раз, то никакой. Если несколько, то counter() каждый раз возвращает новое значение, а makeCounter()() всегда одно и то же (проверь).
>>373242
Потому что число 101 пишется по-разному в зависимости от рода: «сто один» (миллион, рубль) или «сто одна» (тысяча).
> функция не считает тысячи.
Она переводит любое 3-значное число в строку, в том числе число тысяч.
>>373255
Потмоу что makeCounter() каждый раз создает новую функцию-счетчик с новым набором переменных. Смотри, когда мы входим в функцию, создается новый список локальных переменных и в него потом добавляются созданные переменные. Когжда мы вызваем makeCounter() второй раз, создается вторая функция-счетчик, второй набор переменных, неазвисимые от первого.
И когда ты пишешь makeCounter()() то создается новая функция-счетчик, вызывается один раз и удаляется (так как она никуда не сохранена, ни в какую переменную).
> Вложенная функция ведь должна постоянно существовать, так как на нее ссылается переменная counter.
Когда ты вызваешь makeCounter(), создается новая функция (не та, накоторую указывает counter) и новый набор переменных, не те, на которые указывает counter. Ты можешь хоть 10 счетчиков создать и все они будут считать независимо (проверь).
То есть делаем
var c1 = makeCounter();
var c2 = makeCounter();
Вызываем с1(), с2() и убеждаемся что они считают независимо друг от друга, так как это разные функции и у каждой привязан свой набор переменных.Также, можно убедиться что они разные, сделав c1 === c2 -> вернет false
Там скорее всего
arr[1] = '**'
Соответственно происходит вызов this[''](...), то есть вызов функции, хранящейся в свойстве с именем '' (имя свойства объекта может быть любой строкой, в том числе из звездочек).
«плюс», да, приводит значение к числу.
>>373193
Удаленно (на наших).
>>373236
> Какая разница между counter()и makeCounter()()?
Если она вызывается только один раз, то никакой. Если несколько, то counter() каждый раз возвращает новое значение, а makeCounter()() всегда одно и то же (проверь).
>>373242
Потому что число 101 пишется по-разному в зависимости от рода: «сто один» (миллион, рубль) или «сто одна» (тысяча).
> функция не считает тысячи.
Она переводит любое 3-значное число в строку, в том числе число тысяч.
>>373255
Потмоу что makeCounter() каждый раз создает новую функцию-счетчик с новым набором переменных. Смотри, когда мы входим в функцию, создается новый список локальных переменных и в него потом добавляются созданные переменные. Когжда мы вызваем makeCounter() второй раз, создается вторая функция-счетчик, второй набор переменных, неазвисимые от первого.
И когда ты пишешь makeCounter()() то создается новая функция-счетчик, вызывается один раз и удаляется (так как она никуда не сохранена, ни в какую переменную).
> Вложенная функция ведь должна постоянно существовать, так как на нее ссылается переменная counter.
Когда ты вызваешь makeCounter(), создается новая функция (не та, накоторую указывает counter) и новый набор переменных, не те, на которые указывает counter. Ты можешь хоть 10 счетчиков создать и все они будут считать независимо (проверь).
То есть делаем
var c1 = makeCounter();
var c2 = makeCounter();
Вызываем с1(), с2() и убеждаемся что они считают независимо друг от друга, так как это разные функции и у каждой привязан свой набор переменных.Также, можно убедиться что они разные, сделав c1 === c2 -> вернет false
Потому что makeCounter() каждый раз создает и возвращает новую функцию-счетчик которая к той что в counter не имеет никакого отношения.
>>373280
Константы объявляются на функции-конструторе, а не как поля объекта. Мы в PHP пишем Class::CONSTANT а не $x->CONSTANT. То есть надо писать
Hamburger.TYPE_SMALL = 'small';
И естественно, в константе должны быть числа или строки, а не массивы непонятно с чем. Где это такое видано? То, что яваскрипт позволяет так делать, не значит, что надо этим пользоваться.
> var hamburger = new Hamburger('small', 'cheese');
Тут должны быть использованы коснтанты. У тебя это типичные «волшебные строки» так как неясно, откуда они взялись и что в них еще может бть указано. Прочти-ка:
http://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D1%87%D0%B8%D1%81%D0%BB%D0%BE_(%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80)#.D0.9F.D0.BB.D0.BE.D1.85.D0.B0.D1.8F_.D0.BF.D1.80.D0.B0.D0.BA.D1.82.D0.B8.D0.BA.D0.B0_.D0.BF.D1.80.D0.BE.D0.B3.D1.80.D0.B0.D0.BC.D0.BC.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D1.8F
У тебя не числа, а строки, но по сути это та же ошибка.
> Если мы договариваемся, что не будем менять константу, то куда записывать гамбургер с добавленной добавкой?
Сделай свойства в объекте, которых хранят виды добавок.
Ага, я понял к чему ты клонишь. Я (или любой другой пользователь) в конструкторе, где надо задает true, создает новый объект гамбургер и получает нужный результат, так?
Я просто думал, что код-то вообще будет скрыт от пользователя. И будет что-то вроде:
- выберите большой или маленький?
- выберите начинку
- нужны ли добавки?
А то по сути и вправду клиент не будет знать, что нужно вводить.
Да, при каждом вызове makeCounter создается новый LexicalEnvironment (или объект активации, как его называют в стандарте), новая переменная-счетчик в нем и новая функция-счетчик, которая видит эту переменную.
При каждом входе в функцию создается новый LexicalEnvironment, и если на него никто не ссылается, то он обычно удаляется после выхода из нее.
> counter = makeCounter(); Тут создается и сохраняется объект LexicalEnvironment
Тут сохраняется в переменную counter функция-счетчик, которая содержит ссылку на LexicalEnvironment родителя (функции makeCounter) и не дает этому объекту исчезнуть. Функция вместе с удерживаемыми ей переменными из родительских функций называется замыканием (closure), если что.
> А тут makeCounter()() создается еще один объект LexicalEnvironment, а потом удаляется.
Да. И функция-счетчик создается, которая вызвается один раз и удаляется.
>>373309
И как в твоем коде сделать 2 независимых счетчика? В случае с makeCounter() и замыканием мы можем сделать сколько угодно счетчиков, а у тебя по сути состояние счетчика хранится в глобальной переменной makeCounter.currentCount и может существовать только один счетчик. Глобальные переменные — это практически всегда плохо.
> Я просто думал, что код-то вообще будет скрыт от пользователя
В этой задаче надо сделать объект для расчета стоимости, а не графический интерфейс к нему с формами и полями ввода.
> Я (или любой другой пользователь) в конструкторе, где надо задает true,
Да, только не true, а константы.
Это задача на ООП, так что надо сделать только объект. Но потом к нему можно будет прикрутить и графический интерфейс, почему бы нет. Примерно так, что при нажатии на кнопку «большой» вызвается метод
hamburger.setSize(Hamburger.SIZE_LARGE);
Но это все пока делать не надо. Кстати, это напомнило мне, что надо бы придумать задачки на интерфейсы — там тоже начинающие делают много ошибок в плане архитектуры, хотя 30 лет назад придумана MVC, бери и пользуйся.
7 констант. У всех false, пользователь ставит true у нужных констант. Создает объект и вызывает метод getResult.
Я не понимаю, что ты имеешь ввиду.
У константы нельзя ничего поставить по определению. Константа — это неизменная величина. У нее значение постоянно, задано раз и навсегда. Ты уверен, что ничего не перепутал?
>>373322
Неверно. Функция не может быть «постоянно вызванной».
Функция makeCounter() создает и возвращает новую функцию-счетчик:
return function () { ... }; // вот она
В момент создания любая функция привязывается к LexicalEnvironment ее родителя. В данном случае новая функция привязывается к L.E. функции makeCounter, и видит все ее переменные.
Обычно L.E. уничтоэжается привыходе из функции, но в данном случае наша функция-счетчик ссылается на одну из переменных в L.E и она не уничтожается, пока функция-счетчик существует.
В переменной counter хранится эта функция-счетчик (точнее, ссылка или указатель на нее). Почему именно указатель? Потому, что мы можем скопировать его и у нас будет 2 указателя на одну и ту же функию:
var counter = makeCounter();
var copy = counter; // и copy и counter указывают на одну и ту же функцию, это легко проверить, вызвая их по очереди
console.log(copy()); // 0
console.log(counter()); // 1
console.log(counter()); // 2
console.log(copy()); // 3
console.log(copy === counter); // выведет true
Заметь, если вызвать makeCounter() неесколько раз, то каждый раз создается новый L.E. и новая функция-счетчик, которая привязана к нему. И это разные функции, пруф:
var f1 = makeCounter();
var f2 = makeCounter();
console.log(f1 === f2); // false
console.log(f1()); //0
console.log(f1()); //1
console.log(f2()); //0
У константы нельзя ничего поставить по определению. Константа — это неизменная величина. У нее значение постоянно, задано раз и навсегда. Ты уверен, что ничего не перепутал?
>>373322
Неверно. Функция не может быть «постоянно вызванной».
Функция makeCounter() создает и возвращает новую функцию-счетчик:
return function () { ... }; // вот она
В момент создания любая функция привязывается к LexicalEnvironment ее родителя. В данном случае новая функция привязывается к L.E. функции makeCounter, и видит все ее переменные.
Обычно L.E. уничтоэжается привыходе из функции, но в данном случае наша функция-счетчик ссылается на одну из переменных в L.E и она не уничтожается, пока функция-счетчик существует.
В переменной counter хранится эта функция-счетчик (точнее, ссылка или указатель на нее). Почему именно указатель? Потому, что мы можем скопировать его и у нас будет 2 указателя на одну и ту же функию:
var counter = makeCounter();
var copy = counter; // и copy и counter указывают на одну и ту же функцию, это легко проверить, вызвая их по очереди
console.log(copy()); // 0
console.log(counter()); // 1
console.log(counter()); // 2
console.log(copy()); // 3
console.log(copy === counter); // выведет true
Заметь, если вызвать makeCounter() неесколько раз, то каждый раз создается новый L.E. и новая функция-счетчик, которая привязана к нему. И это разные функции, пруф:
var f1 = makeCounter();
var f2 = makeCounter();
console.log(f1 === f2); // false
console.log(f1()); //0
console.log(f1()); //1
console.log(f2()); //0
А вообще, ты ООП в PHP изучал? Мой урок про ООП читал? Вызов makeCounter() чем-т напоминает создание объекта — каждый раз возвращается новый объект, а LexicalEnvironment чем-то напоминает поля этих объектов.
Да, перепутал. Просто я не понимаю как решить. Да я могу хоть сейчас еще парой способов решить, но это слепое добавление аргументов всегда будет (магические числа). Откуда будет известно, что сначала надо написать small или TYPE_SMALL? Страдает логика у меня по ходу, написать код плёвое дело.
Вот, ОП, у меня идея давно засела. Реально ли сделать, чтобы при каждом ответе на мой пост ко мне приходила смска с этим ответом? К примеру у меня стоит автообновление, на php парсится каждый час страница и ищется пост-ответ, а потом с сайта отправления бесплатных сообщений мне приходит смска, это реально?
> Откуда будет известно, что сначала надо написать small или TYPE_SMALL?
Из названия константы и переменной. То есть допустим есть метод
setFilling(fillingType)
И есть константы Hamburger.FILLING _ TYPE _ CHEESE и FILLING _ TYPE _ MEAT. Любой более-менее грамотный программист поймет, что к чему и что надо передать в метод.
В случае с константами, мы видим какие константы есть и по названию (или комментариям рядом) догадываемся что они значат. В случае со 'small' вообще понять ничего нельзя, например какие есть другие варианты? Конечно, можно это описать в комментарии к функции, но лучше бы писать самодокументируемый код.
Но в JS, конечно, с самодокументируемостью хуже чем в других языках. В PHP мы объявляем константу словом const и ее не переопределить, мы можем запретить обращаться к свойствам и методам через private — таким образом, даже если захотеть, неправильно использовать объект не получится. В JS такого нет и остаются договоренности:
- большие буквы обозначают константу
- мы договариваемся не лезть напрямую в свойства, а использовать методы (или наоборот договариваемя, что можно лезть в свойства. Или договариваемся, что подчеркивание в начале обозначает приватное свойство)
Это все из-за того, что разработчики JS хотели пойти особым путем исделать свой вариант ООП. Ну вот, имеем то, что имеем.
Реаьно, но на бесплатных сайтах обычно капча. Есть бесплатное Апи на sms.ru: http://sms.ru/?panel=main&subpanel=programmer
Также стоит учесть, что эта борда находится за cloudflare, и там для подозрительных IP включается система борьбы с ботами, которая блокирует не-браузеры и которая может заблокировать твой скрипт.
>>373373
Трпи или аватарка например.
А что в константе-то хранить, если не цену и не калории?
TYPE_BIG = 'big'; масло масленое какое-то.
А проверку как? if (size == TYPE_BIG) и там еще множество сравнений?
Если строки выглядят как масло масляное, храни числа:
TYPE_BIG = 1;
> А проверку как? if (size == TYPE_BIG)
Ну да. Или можно сделать словарь вида тип => цена:
var prices = {};
prices[TYPE_BIG] = 100;
Вот, в примере 1 на http://php.net/manual/ru/pdostatement.closecursor.php он используется после того как мы выполнили запрос с помощью prepare, execute и вытащили кортеж через fetch. Разве fetch не тягает данные из полей объекта PDOStatement? Почему тогда после execute не закрывается соединение для запроса?
Не читал. подозреваю, что книга требует знания HTML.
>>373398
closeCursor нужен когда ты прочел не все данные, которые вернул запрос, и хочешь на этом с ним закончить. Ты не можешь просто так оставить непрочитанные данные и начать выполнять следующий запрос.
Если использовать fetchAll(), или читать все строки, то он, как я понимаю, не нужен.
Вы видите копию треда, сохраненную 18 августа 2014 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.