return; return;
continue 2
catch(Excepton1|Exception2 $e)
isset($param1, $param2, $param3)
!empty(array_intersect(['firstname','lastname'], array_keys(array_filter($array))))
iterator_to_array(new \RecursiveIteratorIterator(new \RecursiveArrayIterator($array)))
preg_match("/(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})/", $dateString, $coordinates)
Това са функционалности на PHP, които не са описани в началните курсове или не се покриват в повечето уроци свързани с PHP. Исках да извадя някои от скорошните ми способи за подобрение на кода. Всяка една функционалност може да се напише и по друг начин, но с повече редове или по-бавни (както ги срещам най-често). Бих казал, че това са най-кратко написаните решения на даден проблем. Ако все пак някой знае по-добър ще се радвам да го науча.
return; return;
Добре де, return; return;
не е всъщност нещо което работи – поне след първия return
, но исках да напомня да внимавате за неизпълним код. По-лошото от код който трудно се поддържа е само код, които никога и не се използва. До преди време исках да покрия всичко което правя и да включа допълнителна функционалност – FUTURE PROOF. Но ако имаш 10 такива библиотеки и използваш само 10% от написаното, всъщност ще ти е много трудно да ги поддържаш за в бъдеще (изключения са ако правите Framework, CMS,.. някоя външна библиотека)., защото изискванията винаги се сменят и неизползвания код става все по-голям.
continue 2
Ето това е нещо сравнително просто, което мноого рядко може да ви се наложи, но докато не прочетете в документацията няма да знаете дали можете да го направите. Ако няколко вложени цикъла то единственият начин да прескочите външните е като подадете втори параметър на continue. Това важи и за break
. Ето един пример:
for($i = 1; $i <= 3; $i++) {
for($h = 1; $h <= 3; $h++) {
if ($h == 2) continue;
echo $h . " ";
if ($i == 2) continue 2;
}
echo $i . "\n";
}
Така ще получите:
1 1 3 1 1 1 3 3 3
continue
може да получи броя на цикли, които трябва да прескочи, като по-подразбиране си е 1.
catch(Excepton1|Exception2 $e)
Това е нещо ново – php 7.1+, но ако често използвате try..catch
може да ви спести повторения на код. Тук хващаме грешка ако е инстанция на един от 2-та класа.
Може да провчетете документацията за да се запознаете с всички подробности –exceptions
isset($param1, $param2, $param3)
Знаехте ли, че isset
може да поема повече от 1 параметър. Накрая връща true
само когато всеки един от тях е зададен.
Друг вариант за използването му е да проверите дали елементи в масив съдържат нулеви стойности като isset(...$array)
Документация: isset
!empty(array_intersect(['firstname','lastname'], array_keys(array_filter($array))))
А с този скрипт проверявам дали някои от елементите на списъка са не-празни и се срещат в масив. Ако масива ви е ['firstname' => '', 'lastname' => 'Doe']
ще върне true
, но ако е ['firstname' => '', 'middlename' => 'Name']
ще върне false
. Удобно е когато изпращате някоя форма да проверите първо дали има не-празни стойности за желаните елементи.
Документация: array_intersect
, array_keys
, array_filter
iterator_to_array(new \RecursiveIteratorIterator(new \RecursiveArrayIterator($array)))
Обхождането на много-измерни списъци е трудно и винаги се прави с рекурсия, но по този начин с 1 ред код може да вземем плоска версия на масива. Ако искаме просто да обходим всички елементи то можем да извикаме само new \RecursiveIteratorIterator(new \RecursiveArrayIterator($array))
и да обходим неговите елементи, понеже може да загубим някои стойности ако имаме едни и същи ключове (Пример: ['key' => 'val', 'other' => ['key' => 'val2']]
, което ще доведе до ['key' => 'val2']
.
Документация: iterator_to_array
, RecursiveIteratorIterator
, RecursiveArrayIterator
preg_match("/(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})/", $subject, $matches)
Много често виждам $matches[1]/$matches[0]/$matches[2]
, което е трудно за четене може да доведе до грешки в някои по-сложни случаи. А така, като подадете ?P<name>
директно задавате ключ на параметъраname
(а 0,1,2 са си все там, ако желаете да ги използвате).
Документация: preg_match
Надявам се, че вие също ползвате подобни средства, за да улесните живота си. Ако се сещате за нещо подобно, което използвате може да оставите коментар.