Как и чем отформатировать код
Очень важно писать код не как попало, а аккуратно, как принято. Почему? Ну потому, что другой человек, который будет смотреть твой код, вряд ли обрадуется, когда ему придется разбирать слипшиеся строчки, разбросанные в беспорядке скобки и написанные русскими словами названия переменных. Особенно плохо будет если это, например, код тестового задания, которое ты сделал, чтобы устроиться на работу. Ты же не хочешь, чтобы тебя называли быдлокодером?
Не бойся, сделать код аккуратным совсем не сложно. Самый универсальный способ — вставить его на сайт 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(...)
{
// ...
}
https://ideone.com/i0Qwdn
Ничего не понятно.
Аноны, используется ли PhP для создания чего-то большего, чем гостевух? Я имею ввиду широко и на рынке.
>>360381
Непонятно потому, что ты поленился нормально вывод сделать. Вот если сделать так, например: https://ideone.com/vuKIgt — понятнее? Сразу видно какую комбинацию мы перебираем и сколько она нам дает в сумме, а за счет отступов видно, на каком мы уровне вложенности и когда входим/выходим из функции.
Я еще уменьшил сумму из-за ограничений ideone на объем выводимого текста.
>>360392
А на какие работы можно устроиться с пхп? Только фронт-энд?
>>360397
PHP это обычно бекенд. Фронтенд — это яваскрипт.
http://spb.hh.ru/search/vacancy?text=php&clusters=true
http://brainstorage.me/jobs?q=php
Посмотри сам.
>>360402
Алсо,
http://brainstorage.me/jobs?q=haskell
http://spb.hh.ru/search/vacancy?text=haskell&clusters=true
> Найдено 10 вакансий
>>360403
Ты просто не можешь в поэзию программирования.
отхлебнул борща
>>360389
Оп, а как можно выйти из всех функций с помощью флага, вроде как дополнительной переменной? Нигде подробно не могу найти.
>>360424
Не нужно никаких дополнительных переменных. Нужно просто проверять, что вернула функция: результат или ничего, если результат то возвращаем его дальше.
>>360427
https://ideone.com/lgUPwq
Сделал. 59 шагов. Если сравнивать с началом, где было 20 000 вроде, то это значительный прорыв.
>>360429
> if (isset($x)) {
Это очень плохая конструкция,так как переменная то ли есть, то и ее нет. Как можно писать надежный код когда непонятно даже есть ли такая переменная?
Лучше в начале функции присвоить ей null, и проверять соовтственно с помощью if ($x)
Алсо, я не понимаю, зачем там 2 if-а когда $x может вернуться только из рекурсивного вызова функции и можно этот if поставить там.
Ну, насчет 59 шагов — это конечно здорово, но давай сделаем чтобы их было меньше 10 в данном примере.
>>360376
Лалка. Сосай со своим похапе.
>>360430
https://ideone.com/lgUPwq
Ну ладно, это я сделал. А как вот это реализовать:
>То есть если мы выбрали 1×500, а нам надо выдать 740, то логично брать за основу для расчета числа 100-х не 740, а 740 - 500 = 240.
Не совсем понял.
>>359870
Я вот так вот сделал без всяких сторонних парсеров и даже без регулярных выражений.
http://ideone.com/1Sq6hd
>>360458
> Костыли какие-то честно говоря.
Ну я же и так чувствую, что что-то не так, но то твоё сообщение я уже прочитал после того, как сделал.
Прописываюсь в ИТТ треде.
U2FsdGVkX1+y9QpNicLIjFjBAHdE2Sivz/ffJwUaH1s=
http://ideone.com/e.js/4y8CxN
нихуя не понимаю в чем может быть ошибка, поясните
>>360477
http://ideone.com/e.js/4y8CxN
Переделал и дописал, но все равно ругается
>>360478
Ты ошибки-то хотя бы пытаешься читать? 24 строка.
>>360480
Поясни.
В той же 15 строке вроде написано все правильно, как и в примере.
А вот с 24 не уверен, но до нее еще дойти надо.
>>360481
Тебе интерпретатор английским по белому написал, что ошибка в 24 строке. У тебя else вместо elseif.
>>360458
Ну вот эта строка к примеру:
bills 10, 4, 2, 0, sum=500
Без 10 десяток, получается 5*50+2*100=400. А выдать то надо 240. В чем подвох?
Оп, смотри.
http://habrahabr.ru/post/143452/
Там описано про необязательные теги. И якобы их лучше опускать. Стоит ли это делать? Все-таки простота кода.
Также там написано, что type можно не использовать, т.к. он уже стоит по умолчанию.
>>360504
Это потому что твой алгоритм берет слишком много, и получаются бесполезные комбинации, которые можно даже не рассматривать.
Твой алгоритм берет начальное число купюр по формуле (общая сумма / номинал). Но он не учитывает выданные ранее крупные купюры. Ну смотри, например нам надо выдать 3400.
Твой алгоритм считает:
- надо взять для начала 3×1000 (а потом 2×1000,1×1000 или 0×1000)
- переходим к купюрам номиналом 500
- надо взять для начала 6×500 <- а это уже неправильно, так как если мы уже взяли 3×1000 то остается неразменянными только 400, а не 3400, и надо считать число 500-х исходя из суммы 400 (то есть сразу брать 0×500 не проверяя варианты 6×500, 5×500 и тд). А у тебя он берет 3×1000 + 6×500 что больше чем исходная сумма и получаются лишние варианты.
По моему я про это писал несколько дней назад. Давай-ка исправим.
>>360513
Советы в общем годные.
Да, спецификация HTML разрешает пропускать некоторые теги. Например, закрывающие теги <p> и <li>:
<div>
<p>абзац1
<p>абзац2
</div>
<ul>
<li>Пункт 1
<li>Пункт 2
</ul>
Но до фанатизма доходить не следует. Я не видел чтобы кто-нибудь пропускал html, head и body — так что думаю не стоит это делать пока. Также, ты не сможешь поставить css-классы или какие-то аттрибуты на body если пропустишь его. А например для подключения тегов ogp (которые исползуются фейсбуком) надо добавлять аттрибуты то ли на html, то ли на head.
> type можно не использовать, т.к. он уже стоит по умолчанию.
Да, верно.
Главное, не заыбвай проверять код валидатором. Для браузеров есть расширения, которые добавляют кнопку для отправки текущей страницы в валидатор.
Заметь, что там написано то же, что я писал ранее:
> Для идентификаторов и классов используйте настолько длинные имена, насколько нужно, но настолько короткие, насколько возможно.
И совет про префиксы в именах классов — я советую для разных разделов/страниц использовать свои префиксы, чтобы избежать случайного совпадения имен классов.
>>360522
https://ideone.com/62Xo2X
Сделал. 4 шага всего.
Оп, копирую из старого треда:
>>359684
>>359868
http://sqlfiddle.com/#!2/d8ba9/7
> То же относится и к GROUP BY — его можно вынести наружу. И COUNT() можно вынести
Я наверное плохо понимаю, как работает GROUP BY и COUNT (только не надо посылать в мануал, уже перечитал 5 раз),
но как их вынести наружу я хоть убей не пойму.
Как мне 2 раза в 1 запросе сгруппировать и посчитать COUNT разных групп для двух отдельных столбцов?
>>360547
sqlfiddle сдох, чтоли? старая паста не отображается, новая не пастится.
Короче вот чуть упрощенный запрос:
SELECT user_id,user_name, likes_get, likes_given, likes_reciprocal
FROM users
LEFT JOIN
(
SELECT like_from_user_id, COUNT(like_from_user_id) AS likes_given
FROM likes
GROUP BY like_from_user_id
) AS sub1
ON user_id = sub1.like_from_user_id
LEFT JOIN
(
SELECT like_to_user_id, COUNT(like_to_user_id) AS likes_get
FROM likes
GROUP BY like_to_user_id
) AS sub2
ON user_id = sub2.like_to_user_id
LEFT JOIN
(
SELECT l1.like_from_user_id, l1.like_to_user_id, COUNT(l1.like_from_user_id) AS likes_reciprocal
FROM likes AS l1
JOIN likes AS l2
ON (
l1.like_from_user_id = l2.like_to_user_id AND
l1.like_to_user_id = l2.like_from_user_id
)
GROUP BY l1.like_from_user_id
) AS sub3
ON user_id = sub3.like_from_user_id
ORDER BY user_id
Таблицу Users вынес "за скобки" но как вынести GROUP BY и COUNT я не пойму
Вот, выношу на суд общественности две первых задачки посвященных регуляркам.
http://ideone.com/zV2RFe
http://ideone.com/gTFDV4
>>360570
Второй номер определяет, ну а первый номер не попадает под условия задачи. Хотя добавить [+]?[\\d] вместо 8 не проблема.
>>360572
Но второй - это не телефонный номер. Там слишком много цифр.
>>360574
Ну блин, телефонные номера очень уж разные бывают и короче и длиннее.
Вот задача от опа - Дан текст, который по идее должен быть номером телефона в виде 8-(911)-506 56 56 (т.е. человек может ввести не только цифры, но и скобки, минусы, может что-то еще). Но в реальности, пользователь может вместо номера написать что угодно. Напиши скрипт для проверки правильности введенного номера («8(911)-506 56 56» — правильный номер, «8-911-50-656-56» — правильный, «89115065656» — праивльный, «02» — неправильный, «89115065656 позвать Люду» — неправильный).
Суть в том что бы разобраться в регулярках, а не в том что бы написать регулярку детектящую телефоны всего мира. Условия ТЗ выполнены, если оп добавит еще условия буду подгонять под них
>>360575
Ну так попробуй прогнать номер, который был в задании ОПа, 8-(911)-506 56 56. Он не подойдет. А вот такой номер подойдет: 8256283562834628356283562852865.
>>360576
> 8-(911)-506 56 56
И вправду, спасибо, буду допиливать. Может подскажешь как лучше выйти из ситуации с слишком длинными номерами?
>>360577
Выход один, убедиться, что у тебя в номере ровно 11 цифр. Тебе нужно [-\\s\\d]{7,} расписать более подробно, со всеми возможными разделителями внутри, чтобы в итоге избавиться от {7,} оставив ровно 7 цифр.
>>360540
4 шага — это хорошо.
Вот еще несколько мелочей, которые стоит исправить:
Для суммы 620 не находит ответ: https://ideone.com/6ORNmR — раскомментируй там echo и посмотри почему.
> elseif ($amount == 0) {
Какой смысл это условие держать внутри цикла? Его логичнее вынести перед циклом for.
> for($i = 0; $i < count($billsCopy); $i++) {
foreach ($billsCopy as $value => $count)
Массив $result можно тоже убрать и сразу суммировать в переменную.
> findChange($amount, $keysBills, $bills, 3)
Надо чтобы 3 была не прописана жестко, а вычислялась из массива bills, чтобы если добавить/убрать виды купюр, все работало.
>>360580
Оп, сейчас доделаю.
Сейчас думал над считалкой. Гугл сказал есть формула по считалке Джозефуса. Не могу пока вникнуть. Может что подскажешь?
Есть еще решето Эратосфена, но это по-моему не то.
>>360565
Тыж программист, нажимаешь Ctrl + Shift + I в Хроме, там вкладку Network, ищешь аякс-запрос GET http://sqlfiddle.com/index.cfm/fiddles/loadContent?fragment=!2%2Fd8ba9%2F7 и видишь там:
{"sets":[{"SUCCEEDED":false,"ERRORMESSAGE":"datasource [sqlfiddle] doesn't exist"}]}
Временная ошибка какая-то.
GROUP BY всего лишь объединяет строки о указанному полю/полям (и сортирует по ним же если нет ORDER). Никаких особых секретов в нем нет.
> Как мне 2 раза в 1 запросе сгруппировать и посчитать COUNT разных групп для двух отдельных столбцов?
А, ты думаешь, получатся неправильные результаты? Давай посмотрим, какой вид имеет наша объединенная таблица если убрать COUNT/GROUP BY и оставить только джойн (юзеры × полученные × отданные лайки). Допустим юзер 1 поставил лайки юзерам 6, 7 и получил лайки от 3, 4, 5. Тогда первый джойн (на таблицу полученных лайков) дает нам 3 строки, а второй (на таблицу отданных) дает еще 2 строки, которые присоединяются к каждой из трех.
user_id likes_received likes_sent
1 3 6
1 4 6
1 5 6
1 3 7
1 4 7
1 5 7
100 NULL NULL
[code]
(надеюсь что такую таблицу ты мог построить и без меня). Вот, теперь. если мы сделаем группировку по user_id то данные из первых 6 строк сгруппируются в одну. Подумай, как из этого получить число полученных/отданных лайков. Есть идеи?
Так как тут группировка, тот очевидно, надо применять аггрегатные функции. Вот инфа по ним:
http://phpclub.ru/mysql/doc/group-by-functions.html
http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html
http://www.pyramidin.narod.ru/rusql/ch6.html
>>360582
В вики есть статья, можешь почитать: http://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%98%D0%BE%D1%81%D0%B8%D1%84%D0%B0_%D0%A4%D0%BB%D0%B0%D0%B2%D0%B8%D1%8F
Но вообще, тут можно и без хитрых алгоритмов обойтись, а просто сделать подсчет и посмотреть кто в итоге останется, какие номера.
>>360575
Телефонные номера бывают короче или длиннее, но те, что в задаче, содержат ровно 11 цифр (так как там используются российские номера, а они именно столько и содержат при полной записи с кодом города/оператора).
Правильные: 84951234567, +74951234567, 8-495-1-234-567, 8 (8122) 56-56-56, 8-911-1234567, 8 (911) 12 345 67, 8-911 12 345 67
Неправильные: 02, 84951234567 позвать люсю, 849512345, 849512345678, 8 (409) 123-123-123, 7900123467, 5005005001, 8888-8888-88, 84951a234567, 8495123456a
И знаешь, что, давай-ка добавим в программу тесты, чтобы сразу было видно, правильно все работает или нет. Сделай 2 списка номеров (правильные и нет), добавь их в программу и напиши цикл, который их по очереди прогоняет через регулярку и проверяет что они определяются как надо.
Внеси эти номера в программу и сделай тест. Чтобы сразу было видно, правильно проверяет твоя программа или нет. Если непонятно как, пиши, подскажем.
>>360582
Решето используется для поиска простых чисел (которые ни на что не делятся, например, 1, 2, 3, 5, 7, 11, 13, 17, 19, 23 и так далее). И его придумали чуть ли не древние греки.
>>360569
Пишет что ошибка в слове «антракт»: http://ideone.com/nOf2BN , хотя ее нет.
> if (preg_match_all($error1, $text)) {
Можно использовать preg_match, которая ищет только первое совпадение, этого достаточно чтобы проверить есть там ошибки или нет.
От копипасты из 4-х одинаковых if надо избавиться. Например, с помощью цикла и массива.
>>360580
https://ideone.com/KO3OZL
Думал, сейчас исправлю, а это оказалось и не такая уж и мелочь. Понаписал ерунды. Понял, что только нужно наверное новую переменную завести $leftAmount и каждый новый отсчет $leftAmount приравнивать к $amount. Но что-то не то.
Начал 3 дня назад делать уроки из оп-поста, вроде интересно, но смущает математика.
Не то чтобы совсем она не получалась (одноклассница написала ЕГЭ на минимальный проходной балл, до такого я не опускался), я ей не занимался несколько лет, но мягко говоря я там не блистал. Вот у меня был одноклассник с техническим складом ума, он не учил, и решал все хорошо.
А я не учил и не решал, потому что было скучно тупые уравнения решать, я играл в гравити.
Я не верю, что тут все - студенты мехмата.
Как вы эту ситуацию решаете?
>>360603
> Как вы эту ситуацию решаете?
Становимся студентами мехмата. Или уже являемся ими
Без математики все равно далеко не уедешь. Алсо, математика это далеко не только тупые уравнения решать.
>>360603
Для изучения PHP она тебе не понадобится, кроме сложения/вычитания/умножения/деления. Ну в конце учебника будет одна задача с синусом и косинусом, но там уже готовая формула дана, так что не парься.
Аноны, помогите!
Нужно решить с помощью вложенных циклов.
За 2 часа перепробовал кучу вариантов и остановился на этом нихуя не правильно
for ($i=1; $i<=4; $i++) {
for ($j=41; $j<=80; $j++) {
echo "$j ";
}
echo "<br/>";
}
>>360614
for ($i=4; $i<=7; $i++) {
for ($j=1; $j<=10; $j++) {
echo ($i + $j / 10).($j % 10)." ";
}
echo "<br/>";
}
>>360615
Какой же ты долбоёб.
for ($i=4; $i<=7; $i++) {
for ($j=1; $j<=10; $j++) {
echo ($j * 10 + $i)." ";
}
echo "<br/>";
}
>>360620
Бля, я тоже.
for ($i=4; $i<=7; $i++) {
for ($j=1; $j<=10; $j++) {
echo ($i * 10 + $j)." ";
}
echo "<br/>";
}
ОП, можешь клон посмотреть ?
https://github.com/Verpul/uppu.ru/
Помогите тогда уж с этими.
1. Запилино на 90%. Пытался перевернуть, все по пизде поехало.
for ($i=2; $i<=6; $i++) {
for ($k=$i; $k>=2; $k--) {
echo "$k ";
}
echo "<br/>";
}
>>360620
Цикл не обязательно должен увеличивать счетчик на 1. Можно писать for ($j=10; $j<=100; $j+=10)
А можно вообще сделать 1 цикл, просто на каждой 10-й цифре вставлять перевод строки.
Алсо, что за <br> да еще и со слешем в конце? Где такому учат? Слеш был в XHTML, в HTML4/5 его нет.
Ужас, сколько кругом плохих и неправильных учебников.
Алсо, не надо решать за студентов их задачи, мне кажется, а надо давать помогающие им изучить нужный материал ссылки.
>>360631
>Где такому учат?
Это мой любимый БРЯК
мимоборисов
>>360631>
> Можно писать for ($j=10; $j<=100; $j+=10)
Спасибо, не знал что так можно.
> Алсо, что за <br> да еще и со слешем в конце? Где такому учат? Слеш был в XHTML, в HTML4/5 его нет.
Привык с xhtml. Все равно он никакой роли не играет.
> Алсо, не надо решать за студентов их задачи, мне кажется, а надо давать помогающие им изучить нужный материал ссылки.
Но ведь давая решение задачи, я же ее запоминаю. И в следующий раз у меня больше не возникнет вопросов.
>>360626
Посоны, отбой 2 задачи. Спасибо еще раз ОПу за подсказку с >$j+=10
Помогите с 1.
>>360634
> Но ведь давая решение задачи, я же ее запоминаю.
А гораздо полезнее дойти до решения самому — тогда материал запоминается гораздо лучше. А заучивать решение, не понимая толком как оно работает, тебе никак не поможет.
>>360601
Ну посмотри, что там пишется:
> leftAmount=-480
Как остаток вообще может быть меньше нуля?
Давай еще раз разберем ошибку, которая так и осталась с предыдущего раза. Ты для расчета числа банкнот берешь исходную, полную сумму:
> $currentMaxBills = min(floor($amount / $keysBills[$billNumber]), $bills[$currentBill]);
То есть если надо выдать 3400, и мы дошли до 10-рублевых купюр, ты пытаешься взять 340×10 — при этом не считая сколько уже взято более крупных купюр, может мы там уже кучу 500-х и 100-х взяли.
Также, это место выглядит неправильно:
for ($i = $currentMaxBills; $i >= 0; $i--) {
....
if ($leftAmount == 0) {
leftAmount не меняется внутри цикла. Оно одинаково на каждом шаге. Вопрос, зачем тогда в цикле несколько раз проверять что оно равно нулю, если результат проверки всегда будет одинаков: либо всегда равно, либо всегда не равно? Тут либо ошибка, либо ошибки нет и надо просто вынести if из цикла.
>>360639
Сумма: 620
10 => 5,
50 => 0,
200 => 10,
500 => 10
Ну ладно, вот начинаем изменять этот массив:
1) 500x1, осталось 120
2) 200x0, потому что осталось 120 < 200
3) 50x0
4) 10x5, осталось 70
Все, остановились. И это ерунда.
Что не так?
>>360641
> Все, остановились. И это ерунда.
Не так. Так как нам не удалось найти соответствие, мы выходим из нескольких вложенных вызовов к первому (где мы перебирали 500-е и где в цикле i = 1) и теперь пробуем взять 0x500 (осталось соответственно 620), и снова рекурсивно вызываем себя — но в этот раз уже с целью набрать 620, и в итоге находим правильный вариант (3×200 + 2×10).
Этот алгоритм в отличие от жадного не сдается, а просто убавляет число купюр на одну и пробует снова. Для этого там и стоит цикл от N до 0 — чтобы перебрать все возможные варианты. Мы знаем, что купюр не больше чем N, но точное число мы не знаем и потому перебираем все варианты.
>>360626
https://ideone.com/0vknT5 хотя наверняка я не так понял условие и написал наркоманию какую-то
>>360587
Пока что на ум приходит только такой вариант - вырезать все кроме цифр и потом уже сравнивать. Или по другому лучше?
>>360653
Лучше написать одну регулярку, которая проверяет соответствие номера определенному шаблону. Если сложно записать в виде регулярки, попробуй описать этот шаблон сначала словами, а потом уже перевести на язык регулярных выражений.
>>360586
>Подумай, как из этого получить число полученных/отданных лайков. Есть идеи?
Ну тут кажется дошло.
SELECT user_id, user_name,
COUNT(DISTINCT l1.like_to_user_id) AS likes_given,
COUNT(DISTINCT l2.like_from_user_id) AS likes_get
FROM users
LEFT JOIN likes AS l1
ON user_id = l1.like_from_user_id
LEFT JOIN likes AS l2
ON user_id = l2.like_to_user_id
GROUP BY user_id
Теперь думаю над взаимными лайками
>>360589
http://ideone.com/C7UL6M
Пофиксил.
Есть сайт с выпадающим div-ом на джиквери. Внутри дива находится форма отправки данных методом POST. После нажатия кнопки отправки формы главная страница перезагружается и раскрывающееся меню вновь свернуто. Где копать, что бы после отправки данных с этой формы менюшка не сворачивалась? Или сворачивалась только если пользователь корректно ввел все данные?
>>360654
Я вот думаю над этим уже не один час, но как то много вариантов. Сначала у нас может быть плюс, а может и быть скобка(мало ли кому так нравится). Цифры могут быть сгруппированы как угодно и разделены пробелами знаком минуса(а вдруг кто то дефис а не минус заюзает?). Из этого вывод - что нужна регулярка которая ищет одиннадцать цифр в которой где угодно могут стоять символы ()- пробела. Ну плюс только спереди. Как это реализовать пока идей нету. Читаю книженцию Дж. Фридл - регулярные выражения. Надеюсь найти ответ там.
ОП, короче есть div, который выводит сообщение об ошибке. И есть поле ввода для текста. Свойство padding я задал одинаковым что для input[type="text"], так и для моего блока #message-div. padding: 3px 3px 3px 5px;
Через яваскрипт устанавливаю позицию блока ошибки top и left. Во-первых криво устанавливается. Немного выше, чем top input'a. А во-вторых высота блоков разная. Что можно сделать или дать информации подробней? Я думаю ты уловил, что я хочу сделать.
>>360658
Еще вопрос. В книженции есть такая вещь как \< и \> Соответственно начало и конец последовательности символов. Когда я вставил в свой код(с удвоением бэкслэша естественно, ничего не работало). Заюзал вместо этого \\b для начала слова и \\s для конца. В разных языках некоторые вещи в регулярках могут различаться или вовсе отсутствовать или я чего то не понял с этими \< \>?
>>360646
То есть, когда происходит возвращение к исходной функции ($billNumber = 3), то $amount заново должен быть равен 620?
>>360660
Поправил padding у message-div и вроде ровно стало. Всё равно интересно, почему даже если у input и блока стоят одинаковые внутренние отступы, по высоте блоки не совпадают. Это от свойства box-sizing может зависит?
>>360661
Есть разные диалекты регулярных выражений. Php использует PCRE (Перл-совместимые [на самом деле не совсем] выражения). В книге видимо другой диалект, там должно быть где-то в начале это упомянуто.
Не бойся, базовые вещи вроде * + ? | работают везде одинаково, различия там в более сложных конструкциях.
Вот описание всех возможностей pcre: http://www.php.net/manual/ru/pcre.pattern.php
В PCRE есть такое:
\\A — начало текста
\\Z — конец текста
^ — начало текста или начало любой строки в многострочном тексте если стоит флаг m (multiline)
$ — конец текста или конец любой строки если стоит флаг m
\\b — это граница слова, то есть место где с одной стороны стоит \\w (буква, цифра, подчеркивание), а с другой \\W (не-буква, цифра, подчеркивание)
\\s — это пробельный символ (пробел, перевод строки \n)
>>360663
Ну логично, что если ты меняешь например число 500-х купюр, то остаток, который ты передаешь в рекрсивный вызов, leftAmount тоже меняется.
>>360660
div справа от инпута каким способом туда помещен? Выложи код на jsbin или jsfiddle или codepad.
> Во-первых криво устанавливается.
Ты неправильно выичсляешь размер или границу блока или неправильно его позиционируешь. Покажи код.
> Через яваскрипт устанавливаю позицию блока ошибки top и left.
Ты делаешь большую глупость. Это можно решить через CSS и оно будет корректно работать при изменении размеров страницы, шрифта, и чего угодно еще. Надо изучать CSS, а не лепить костыли.
http://phpliveregex.com/
Для тех, кто познает регулярки и для тех, кто уже познал. Есть еще один ресурс, удобнее, но он почему-то в спам листе (http://goo.gl/wMz7ZR гугл ссылка).
>>360669
Высота у них как раз совпадает, ты просто позиционируешь его неправильно.
>>360658
>нужна регулярка которая ищет одиннадцать цифр в которой где угодно могут стоять символы ()- пробела.
Ну вообще ты на верном пути, да, цифры могут быть разделены дополнительными символами.
>>360656
[\\S] равносильно просто \\S
Не видит ошибки если после но есть запятая (перед — нету): http://ideone.com/wy3bke
>>360655
Молодец, думай теперь дальше.
Подсказка: Я кстати ранее, несколько тредов назад, решил это через 4 джойна. То есть для взаимных лайков добавил еще 2 джойна. Но сейчас я подумал, посмотрел — можно ничего больше не добавлять, имеющихся данных достаточно. Нарисуй пример вроде того, что я рисовал выше, и подумай, как посчитать число взаимных лайков из имеющихся там id
>>360672
Через css я никак не задам положение блока в зависимости от ситуации. Этот блок ошибки появляется рядом с ошибочным полем. Пример на пике.
Ну вот рабочий пример с высчитанным padding'ом для message-div. http://jsbin.com/diqohiso/2/
В принципе, оно работает и хорошо. Можешь направить на путь истинный, если что-то следует поменять.
>>360676
http://ideone.com/jvlYHv
То есть символ \\b можно спокойно юзать обрамляя им с двух сторон слово. Этакий аналог \<\> ?
>>360682
Забыл пик.
>>360682
Тащемта, размеры не совпадали, потому что у input ещё граница задана была размером в 1px.
>>360676
http://ideone.com/rkSUCC
Я чуть не кончил радугой когда увидел что оно определяет верные и неверные номера (по крайне мере те номера что ты мне дал), с утра о регулярки мозг ломаю.
>>360639
https://ideone.com/FXlyPl
i=0, billNumber = 2, amount=620, bills 5, 0, 0, 0, sum=50
Вот здесь по сути должно быть:
bills 5, 0, 3, 0
Но нет, рисуется 0. Зачем тут 3 вообще нужна, 0 подавай.
Эта задача меня уже с ума сводит.
>>360674
Да, хороший сайт.
>>360682
Ты можешь сделать несколько блоков (1 на каждое поле) и скрывать/показывать нужные или перемещать блок с помощью:
$errorBlock.appendAfter($input); (если jquery)
parent.insertBefore(block, null); (если использовать методы DOM).
А позиционировать средствами CSS.
Достаточно обернуть input и блок в див и применить абсолютное позиционирование или, что лучше, флоат.
Но раз уж ты решил попробовать определение позиции через явакрипт, я должен тебя предупредить о всех возможных подвохах, тем более что это мало где описано и мало кто разбирается в этой теме.
Определение положения элемента через JS
Вычисление, которое ты используешь через offsetTop, неправильное, вот почему:
- offsetLeft/Top дает нам смещение относительно ближайшего позиционированного элемента (или корневого элемента если такого нет). Ты вычисляешь сумму всех offsetLeft/Top вплоть до корня, но потом используешь ее для присваивания свойству left/top которое позиционирует как раз относительно ближайшего поз-нного предка, а не относительно корневого элемента.
Пример: http://jsbin.com/diqohiso/3
Логичнее брать только первый offsetLeft/Top.
- offsetTop/Left не учитывает случай, когда родитель содержит линейку прокрутки и элементы внутри него смещены путем прокрутки: http://jsbin.com/diqohiso/4
- я точно не знаю, учитываются ли маргины/бордеры при таком подходе, как ты используешь. Скорее всего там тоже могут быть ошибки.
Есть другой способ определить позицию элемента — правда не относительно угла документа, а отсносительно края окна — но зато более простой и надежный — это getBoundingClientRect():
https://developer.mozilla.org/en-US/docs/Web/API/Element.getBoundingClientRect
http://learn.javascript.ru/coordinates#координаты-в-окне-elem-getboundingclientrect
Он возвращает объект со свойствами left, top, right, bottom, которые отмеряются от краев экрана. Чтобы из них получить позицию относительно начала документа, достаточно прибавить величину на которую прокручена страница (documentElement.scrollTop/Left или document.body.scrollTop/Left — единства тут нету).
Если ты например посмотришь как устроен в jquery метод offset() (который определяет позицию элемента относительно края документа) то увидишь что он использует clientRect: https://github.com/jquery/jquery/blob/master/src/offset.js#L74
Но я-то помню, что раньше он использовал метод вроде твоего, с циклом и offsetLeft. Вот старая версия кода той же функции: https://github.com/jquery/jquery/commit/77536f5cb2ab042ac8be40ba59f36d8f3bd7e4d1#diff-d38379d70ee2c5c5a0acb5b0f7acef8dL32
Обрати внимание, как там все хитро приходится учитывать — и scrollLeft/Top для прокручиваемых элементов, и ширину border, и дополнительные отступы на body. Очевидно, что это ужасно неудобный и ненадежный способ, но видимо в каких-то особо странных браузерах getBoundingClienRect не поддерживался. Я впрочем, с такими не сталкивался — этот метод прекрасно работает даже в ИЕ6.
Вот пост Резига на эту тему: http://ejohn.org/blog/getboundingclientrect-is-awesome/
Алсо, я погуглил — в фаерфоксе до 3-й версии этот метод не поддерживался, видимо потому не использовали. Ну что ж, позор мозилле за это.
В общем, давай не будем копировать примеры устаревшего ненадежного кода.
>>360683
> То есть символ \\b можно спокойно юзать обрамляя им с двух сторон слово
Можно.
Но теперь другая проблема: видит ошибку там где есть запятая перед «а»: http://ideone.com/FzykPD
>>360693
С утра? Там мало? Может тебе еще надо задачек подкинуть?
> for ($i =0; $i < count($rightNumbers); $i++) {
Используй foreach для обхода массива. Зачем писать везде [$i] если можно не писать?
Я тебе добавил еще несколько тест-кейсов, где твоя регулярка не работает: http://ideone.com/4woUeC
[(] — имей в виду, спецсимволы можно еще экранировать бекслешами: \\(
>>360695
> if ($billNumber !=0) {
> $lastAmount = $lastAmount - $currentBill*$currentMaxBills;
> }
Ты же это делаешь перед циклом. А в цикле меняешь число банкнот номиналом currentBill. то есть leftAmount должен считаться заново на каждом шаге цикла, а не вычисляться один раз и быть неизменным.
>>360695
Сделай вывод leftAmouте вместо amount, может виднее будет. Ну и вообще, если что не так — добавляй вывод переменных.
Вопрос - пикрелейтед.
**Аноны, если посты не проходят, постите их на http://www.notehub.org/ — там есть markdown-разметка и нет (по крайней мере пока) рекламы и отличный дизайн страницы**
>>360715
Ты не можешь получить доступ к $a так как статические методы вызваются на классе, а не на объекте. staticFunction() может быть вызвыан когда объекта нет или когда объектов несоклько — откуда брать эту переменную. В твоем случае, используй синглтон, но также я тебе рекомендую почитать что-нибудь по ООП, например книги
> По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
> По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
А то ты по моему ООП толком не понял.
>>360720
Я прекрасно понимаю, что конструктор без объекта вызывать не выйдет. Я и прошу пояснить мне или дать линк на то, как организовать класс, где будут использоваться статические методы, но эти методы будут как-то использовать внутриклассовые, читай, частоиспользуемые переменные. Возможно криво выразился, но надеюсь ты понял что я хотел сказать. Спасибо!
if ($billNumber == 3) {
$lastAmount = $amount;
}
ребят, кто-нибудь сталкивался с кодировкой?Дело в том что есть файл index.php, я создал отдельные файлы и подключил их к index.php, в мозиле, хроме вся страница в иероглифах,как пофиксить?
>>360756
<?php header('Content-Type text/html; charset=utf-8'); ?>
Эээ, анон с файлообменником в z2 опять выходит на связь.
Почти всё поправил согласно рекомендациям, но немного не доходит, как реализовать "отдачу файла напрямую". Начитался всякого разного и решил, что надо делать вообще без php, залез в дебри всяких .htaccsess'ов, но в целом не представляю, как это должно работать, если файлы хранятся в виде abrakadabra.tmp ну так правильно, насколько я понял, или не? и всё равно нужно лезть в БД за нормальным именем и всё это обрабатывать. Можно пинка животворящего в нужном направлении?
а я вам пасту принес
Есть опыт помощи таким начинающим.
реальный срок до запуска джуниора - полгода, никого не слушайте.
Важные моменты
веб-программирование на базе PHP - это стек технологий: PHP/SQL/CSS/HTML/JS + Linux хотя бы азы + знание важных инструментариев (FTP, Git/SVN, работа с БД)
чистый PHP плюс даже все перечисленное выше - не особо нужно и не интересно. Нужно знание конкретных платформ: фреймворков и/или CMS. (Почитайте вакансии на Хантиме по запросу PHP, обратите на это внимание). Навскидку самые востребованные (спорно конечно): Yii фреймворк, CMS Битрикс и Wordpress.
Как начать?
Смело на амбразуру!
1) Установите у себя рабочую среду LAMP/WAMP - Apache, PHP, MySQL. Для этого возьмите пакет Denwer или OpenServer, что больше понравится. Сделайте Hello World просто как HTML, потом на PHP, потом алертом на JS. Порадуйтесь.
Установите все редакторы кода. Кто там вам будет рекомендовать блокнот или notepad++ - не слушайте. Варианты: если машина мощная (4+ Гб памяти и пр.), берите редактор phpStorm (для php/html/css/js). Если не очень мощная - берите komodo edit. Для работы с БД инструмент встроен в Denwer/OpenServer, это phpMyAdmin
2) Идеально, если вы договоритесь сделать кому-нибудь сайт. Бесплатно или за небольшую плату. Если нет - сами себе поставьте задачу: сайт про котиков/про детей etc. Красивый сайт, с галереей, с эффектами, с материалами
Возьмите CMS Wordpress и попытайтесь сделать сайт у себя на компьтере. Настоящий сайт, во всей красе, как вы хотите. Правьте его, смотрите код, экспериментируйте. Сообщество огромное, вы найдете ответы на все свои вопросы
Потратьте чуть денег, купите себе домен и хостинг, залейте сайт на хостинг.
Порадуйтесь. Похвастайтесь.
3) Ищите в сети тестовые задачи и решайте их, изучайте материалы собеседований, вопросы - их много.
4) Зарегистрируйтесь на odesk.com под каким-то фейковым email, пройдите тесты по PHP, CSS, HTML, jQuery, Wordpress, а во время прохождения делайте скриншоты вопросов. Потом изучайте эти вопросы, ищите ответы, далеко не обязательно на все. Тесты вы, конечно, не пройдете, но вам нужны только вопросы.
5) Постоянно следите за вакансиями "PHP-программист", "веб-программист" на Хантиме, на hh.ru и подобных ресурсах.
И да, как только напишете первую сроку кода - начните читать про Git. Как будете готовы - сразу внедрите у себя Git, вы будете очарованы его возможностями.
Вот как раз на полгода.
После этого у вас появится масса информации, и дальше вы сами сориентируетесь.
>>360766
Возвращай из php-кода URL файла, а не сам файл и делай на него редирект. А сервер пусть сам возвращает файл.
ОП СПУСТЯ МЕСЯЦ Я СОЗРЕЛ ДЛЯ ВТОРОГО ЗАДАНИЯ
ПРОВЕРЯЙ ПОЧТУ
Назрели такие вот вопросы по пыхе: Каким образом можно вывести результат sql запроса в html'ный <select>?
То бишь, есть вручную заполненное говно:
<select>
<option value="0">null</option>
<option value="1">one</option>
<option value="2">two</option>
</select>
А давайте в этом ИТТ треде будем изучать PHP (и некоторые другие языки для веба), решать задачки и даже делать простые сайтики! Зачем? Кто-то хочет научиться программировать, кто-то хочет изучить этот язык, кто-то хочет просто размять мозги и заняться чем-то полезным.
Это тред для начинающих. Не написал за свою жизнь ни одной программы? Ты наш человек.
Требуемые знания: умение читать. Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Netbeans PHP или PhpStorm (необязательно).
Предыдущий тред был тут: >>356101 .
У нас есть первые уроки по PHP, они собраны и выложены по адресу http://archive-ipq-co.narod.ru Если ты ньюфаг, просто решай задачки оттуда, они там реально простые, и пости сюда ссылки на решения, мы посмотрим и скажем, правильно или нет и дадим совет, если можно что-то улучшить. Если не совсем ньюфаг, напиши, что ты знаешь, что нет, что хочешь изучить, я дам тебе какую-нибудь задачку посложнее. После прохождения учебника напиши, ОП даст тебе более сложные задания.
Правила: ведем себя воспитанно, помогаем новичкам, постим ссылки на решения задачек, ОП их проверяет и дает советы и замечания.
ОП, как всегда, помогает и дает советы, отвечает на самые нубские и простые вопросы. У ОПа есть почта, так что даже если он не появляется в треде уже неделю, вы всегда можете написать ему что-то хорошее.
Оформляй код аккуратно!!! например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492
Что почитать?
Начинающим: Никсон Р. - Создаем динамические веб-сайты с помощью PHP
Сайт phptherightway
По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
Мануал по PHP — http://www.php.net/manual/ru/langref.php
JS: learn.javascript.ru
Позиционирование в CSS: http://softwaremaniacs.org/blog/category/primer/ (снизу вверх).
MySQL: https://gist.github.com/codedokode/10539213
Слишком простые задачи? Напиши что знаешь, что хочешь изучить и придумаем тебе задачку посложнее.
Сайт опять упал!!!!! Не паникуй, а открой http://rghost.net/45000175
Где архивы предыдущих тредов? Известно, где, на mediafire: http://www.mediafire.com/download/gza5360wdzqd743/threads-archive-pr-1..17.zip (189Мб, треды 1-17 из pr), http://www.mediafire.com/download/kgzl1f9366gc6ed/threads-archive-11..20.zip (72 Мб, треды 11-20 из b). Также один анон выложил все на дропбокс: https://www.dropbox.com/sh/4sb69jrx9qwrpcw/-nY5ia__VC (ок, он иногда не работает)
Как начать пользоваться командной строкой — gist.github.com/anonymous/9378956452c8e4a72ac8
Если я решу твой учебник, я смогу легко устроиться на работу и стать старшим программистом в мои 23? Нет. Учебник — лишь первый шаг в начале пути.
В общем, давайте начинать уже!