Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Помогите упростить алгоритм преобразования массива
Форумы портала PHP.SU » » Хранение данных, их вывод и обработка » Помогите упростить алгоритм преобразования массива

Страниц (1): [1]
 

1. tjomamokrenko - 17 Октября, 2014 - 15:11:34 - перейти к сообщению
В результате выборки из базы данных получаю следующий массив:

Исходный массив (Отобразить)


Из него, впоследствии, нужно получить массив такого содержания:

Конечный массив (Отобразить)


Преобразование в следующем:

Из

CODE (htmlphp):
скопировать код в буфер обмена
  1. array(1) {
  2.   [0]=>
  3.   array(6) {
  4.     ["weekday"]=>
  5.     string(6) "День недели"
  6.     ["order"]=>
  7.     string(1) "Порядок пары"
  8.     ["subject"]=>
  9.     string(29) "Название предмета"
  10.     ["teacher"]=>
  11.     string(14) "Преподаватель"
  12.     ["classroom"]=>
  13.     string(2) "Номер кабинета"
  14.     ["homework"]=>
  15.     string(33) "Домашнее задание"
  16.   }


В

CODE (htmlphp):
скопировать код в буфер обмена
  1. array(1) {
  2.   ["День недели"]=>
  3.   array(1) {
  4.     ["Порядок пары"]=>
  5.     array(1) {
  6.       [0]=>
  7.       array(4) {
  8.         ["subject"]=>
  9.         string(29) "Название предмета"
  10.         ["teacher"]=>
  11.         string(14) "Преподаватель"
  12.         ["classroom"]=>
  13.         string(2) "Номер кабинета"
  14.         ["homework"]=>
  15.         string(33) "Домашнее задание"
  16.       }
  17.     }
  18.   }
  19. }


В настоящий момент преобразование происходит так:

PHP:
скопировать код в буфер обмена
  1. $sql = "SELECT DAYNAME(`schedule`.`date`) AS `weekday`, `schedule`.`order`, `subject`.`subject`, `subject`.`teacher`, `subject`.`classroom`, `homework`.`homework`
  2.        FROM `schedule`, `subject`, `homework`, `schedule_subject_homework`
  3.        WHERE WEEK(`schedule`.`date`, 1) = WEEK(CURDATE(), 1)
  4.        AND `schedule`.`schedule_id` = `schedule_subject_homework`.`schedule_id`
  5.        AND `subject`.`subject_id` = `schedule_subject_homework`.`subject_id`
  6.        AND `homework`.`homework_id` = `schedule_subject_homework`.`homework_id`
  7.        ORDER BY `schedule`.`order` ASC";
  8.  
  9. // Выборка
  10. $schedule = $mysqli->query($sql)->fetch_all(MYSQLI_ASSOC);
  11.  
  12. foreach ($schedule as $key => $class) {
  13.   $schedule[$class['weekday']][$class['order']][] = [
  14.     'subject' => $class['subject'],
  15.     'teacher' => $class['teacher'],
  16.     'classroom' => $class['classroom'],
  17.     'homework' => $class['homework']];
  18.  
  19.   // Убираем из массива числовые ключи нулевого уровня
  20.   if (is_int($key)) {
  21.     unset($schedule[$key]);
  22.   }
  23. }


Вопрос: мне кажется, это можно сделать намного легче. Возможно, даже с помощью SQL. Как упростить? Картинку с графическим представлением структуры БД прикрепляю
2. DeepVarvar - 18 Октября, 2014 - 23:09:38 - перейти к сообщению
1) Убери апострофы из запроса, оставь их только там, где реально будет конфликтить с зарезервироваными словами.
2) Переходи на PDO.

А так - решение вполне себе. Не говнокод.

 

Powered by ExBB FM 1.0 RC1