Хотя этот пост я обещал
очень давно, руки дошли только сейчас. До того писал велосипед в виде парсера кода, так как бывший примитивный ломался на этом участке.
Ну да не суть. Сегодня у нас довольно большой кусок кода, в котором имеется довольно обширный набор индуизмов, антипаттернов, и просто идиотских решений. Итак, добро пожаловать
в прозекторскую:
foreach($__sysReslt as $__keys => $__rows) {
switch($__keys) {
case 'id': {
$__tmpArr['id'] = $__rows;
}; break;
case 'surname': {
$__tmpArr['surname'] = $__rows;
}; break;
case 'name': {
$__tmpArr['name'] = $__rows;
}; break;
case 'patron': {
$__tmpArr['patron'] = $__rows;
}; break;
case 'is_curator_labl': {
$__tmpArr['is_curator_labl'] = $__rows;
}; break;
}
}
foreach ($__tmpArr as $__key => $__val) {
foreach($__val as $__values) {
switch($__key) {
case 'id': {
$__uIDArr[] = $__values;
}; break;
case 'surname': {
$__surnameArr[] = $__values;
}; break;
case 'name': {
$__nameArr[] = $__values;
}; break;
case 'patron': {
$__patronArr[] = $__values;
}; break;
case 'is_curator_labl': {
$__isCurBit[] = $__values;
}; break;
}
}
}
if(count($__uIDArr) != 0 && is_array($__uIDArr)) {
foreach($__uIDArr as $__key => $__val) {
if(strlen(trim(
$__surnameArr[$__key] . ' ' . $__nameArr[$__key] .
' ' . $__patronArr[$__key]
)) != 0) {
$__genResult .=
'' .
'. trim($__val) . '">' .
$__surnameArr[$__key] . ' ' . $__nameArr[$__key] .
' ' . $__patronArr[$__key] . '' .
'' .
'
:pointer;" width=12px height=12px src="imgs/deleteIcon.png" alt="Удаление эксперта" />' .
(
$__isCurBit[$__key] == '__expert__' ?
'
.png" alt="Эксперт" />' :
'
.png" alt="Куратор" />'
) .
'
:pointer;" width=12px height=12px src="imgs/E_symbol.png" alt="Отправить письмо" />' .
'' .
'';
}
}
} else {
$__genResult .=
'' .
'' .
':red;font-size:17px;text-align:center">НЕ ИМЕЕТ НИ ОДНОГО
ПРИВЯЗАННОГО ЭКСПЕРТА
-top:5px;background:green;color:#fff;font-size:12px;text-align:center;width:100%;height:0;border:green 1px solid;padding:3px">НАЖМИТЕ КНОПКУ ВЫШЕ "ДОБАВИТЬ ЭКСПЕРТА"' .
'' .
'';
}
echo $__genResult;
Итак, «что мы имеем с гусь»? А «с гусь» мы имеем:
- Парадигму for-case, описанную в литературе ранее;
- неоправданное использование тернарных операторов;
- смесь французского PHP с нижегородским HTML, причём противоестественным каким-то образом;
- потенциально некорректное (в случае, если фамилия, имя или отчество - пустые строки) формирование полного имени пользователя.
На самом деле, копирование массивов, которое осуществляется на протяжении трёх циклов foreach является прямым следствием того, что ранее человек не захотел разобраться в том, как правильно грузить данные из БД, и решил воспользоваться обманчиво коротким синтаксисом, предназначенным совсем для других нужд. Что привело к неоправданному переусложнению кода.
Вообще, как показывает мой опыт, желание добиться от кода чего-то странного является недвусмысленным намёком на то, что вы что-то не так спланировали, или не понимаете чего-то в работе прочих частей системы.
Как можно догадаться, данный кусок кода в моём исполнении выглядит примерно
так:
$imgNames = array('0' => 'point_Vlt.png',
'1' => 'point_Kpo.png');
$imgAlts = array('0' => 'Эксперт',
'1' => 'Куратор');
if (count($result) > 0) {
foreach ($result as $rowNum => $row) {
$name = $row['fio'];
if (strlen(trim($name)) != 0) {
$rowId = trim($row['id']);
$imgName = $imgNames[$row['is_curator']]
$imgAlt = $imgAlts[$row['is_curator']];
$result .= <<< EOHTML_R
$name
: pointer;" width=12px height=12px src="images/deleteIcon.png" alt="Удаление эксперта" />
: pointer;" width=12px height=12px src="images/E_symbol.png" alt="Отправить письмо" />
EOHTML_R;
}
}
} else {
$result .= <<< EOHTML
: red; font-size: 17px; text-align: center">В списке нет ни одного эксперта
-top: 2px; background: green; color: #fff; font-size: 12px; text-align: center; width: 100%; height: 0; border: green 1px solid; padding: 2px">Нажмите «Добавить эксперта»
EOHTML;
}
echo $result;
За счёт правильно сформированного массива $result получилось около одиннадцати строк кода и четырнадцати строк HTML, и то можно пооптимизировать. Правильное формирование массива, кстати, не привнесло никаких дополнительных затрат - это обычный
PDOStatement::fetchAll().
Так-то!