Loading...
enevlogiev avatar enevlogiev 1168 Точки

[Exam problems] PHP Basics 03-05-2015 Problem{4} - Conferences

Докарах задачата до 50 точки, не мога повече - conferences

Тествах сортиране, пейджинг и принтене и не знам къде да дебъгвам. Има твърде много потенциални неща, които да се строшат. Всяка помощ е добре дошла : )

Има един var_dump по средата, игнорирайте го.

Тагове:
0
PHP Web Development Basics
Filkolev avatar Filkolev 4482 Точки

Вчера като четях условието на задачата ми се стори прекалено усложнена, но като седнах да я решавам се оказа, че е просто дълга. Не съм сигурен колко време ми отне, поне час със сигурност, може би 2. Няма обаче уловки, нещата са обяснени.

При подобен тип задача най-важното е да се измисли алгоритъм. То на всяка задача е така, но тук е ключово да си разбиеш стъпките предварително.

Ето решението ми - ЛИНК.

Хващам конференциите с един дълъг регекс с именовани групи. След това итерирам и закачам нови пропъртита - оставащи дни, парсвам числата към числа, уеднаквявам формата на датите и такива неща.

Работата с DateTime класа е доста лесна, извадил съм си функция, която да ми казва колко дни е разликата между две дати. Малко тъпо е единствено начина, по който трябва да проверя дали трябва да върна отрицателно число.

Сортировката е straight-forward. Няма нужда да се работи с датите, понеже форматът им е такъв, че може спокойно да се сравняват стрингове.

След това цялата врътка със страниците е един array_slice, на който му подаваш начален индекс и дължина. Дължината е ясна, броя записи на страница. Началния индекс е страницата - 1, умножена по броя страници. Предполагам, че няма да ми дадат страница 0. А ако дадат други числа, които попадат извън масива установих, че функцията просто връща празен масив.

Тук идва занимавката с изхода вече. За да си улесня нещата създавам нов масив с ключове датите и стойности - асоциативни масиви за конференциите. Слагам само необходимите данни. Rowspan-a ми е реално count на масива с ключ текущата дата, слагам го само ако е повече от 1. Имам една булева променлива, която казва дали съм отворил тага за нов ред (понеже форийчвам едновременно външните и вътрешните ключове - за всеки ред трябва да имам нов отварящ таг, но целта е да не събера два един след друг). Пълня си клетките като ескейпвам по-опасните стрингове и накрая вадя изхода. 

Отне ми време, но не мога да кажа, че имаше нещо крайно затрудняващо. Като се разбият логически нещата почваш да се бориш на хапки със слона и накрая го изяждаш :)

2
enevlogiev avatar enevlogiev 1168 Точки

Ако ми погледнеш решението, ще видиш, че на практика правя стъпка по стъпка същото : )

0
Filkolev avatar Filkolev 4482 Точки

Регекса може малко да го съкратиш. Двойните ескейпвания не са нужни, бачка и без тях. А като имаш 4 цифри примерно вместо \d\d\d\d по-четливо е да сложиш \d{4}.

Като стъпки е същото, но на пръв поглед не мога да видя разликите. Ще погледна в джъджа дифчекъра. Освен нещо сортирането да не се е получило, нз.

0
Filkolev avatar Filkolev 4482 Точки

Ами да, сортирането е като гледам.

Аз лично така и не разучих докрай тоя multisort, доста хора са ми казвали че е удобен. Но предпочитам сам да си разпиша подробно как точно искам да се сортират нещата. Пробвай да приложиш моята сортираща функция без да променяш други неща да видим дали ще даде 100.

0
Filkolev avatar Filkolev 4482 Точки

Мисля, че разбрах къде ти е грешката. Пробвай да сложиш array_slice вместо твоя алгоритъм, би трябвало да тръгне.

Ако е от това кажи дали да давам хинтове или искаш сам да разследваш :)

0
Filkolev avatar Filkolev 4482 Точки

Оф, пробвах го, не е от това. Но това, което правиш би довело до грешка, защото $events е обикновен масив с ключове от 0 до дължината минус 1, а мултисорта запазва ключовете, т.е. сортираш го, но като тръгнеш да итерираш по индекс ще итерираш несортиран масив. За целта или трябва да се ползва slice (който очевидно при мен сработи), или да форийчваш и да държиш индекса в отделна променлива отвън.

0
Filkolev avatar Filkolev 4482 Точки

Така е, който не е ползвал мултисорт се излага. Все пак е хубаво да се имат предвид тия неща, че може да изядат нечия глава.

0
Kamigawa avatar Kamigawa 750 Точки

Eдно решение, което дава 100 точки (преди малко му оправих роуспановете). Много изговорих за тази задача вчера и не ми се повтаря. За жалост за 4 часа(които имах - в 11:30 ми е първия събмит в джъжда, с който си вземам хтмл-а, да не го преписвам) не успях да докарам напълно работещо вадене на таблицата. Отешителна награда е, че регекса, датите и сортирането са ми правилни, единствено пренасисах днес ваденето на резултата. Разбира се имах възможност след изпита да гововя с доста хора, включително да видя тестовете, авторскoто решение и дори да нагодят моето да работи (мерси RoYaL отново за отделеното време), което със сигурност повлия на възможността ми днес да „реша“ задачата - и все пак ми отне 1 час, като знаех всичко това :D.

Както ми казваше един бивш преподавател - има различни по трудност задачи за да има различни оценки :). Аз за себе си извадих доста неща от този изпит. Жалко, че на напълно работеща задача(поне за моите стандарти, защото php-то си работи, с html-a се наиграх) имам половината резултат, но никой не ми е виновен.

1
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.