Тема: Розділи та підрозділи (БД/Масиви)
ТЗ: Вивести список розділів форуму, під кожним розділом повинні виводитися його підрозділи.
Наприклад:
Розділ: Програмування
Підрозділи:
PHP
C++
Java
Python
Розділ: Верстка
Підрозділи:
HTML
CSS
Design
Використовується паттерн MVC, тому в View шаблон повинні передатися тільки змінні (масиви) для перебору.
В моделі написав такий метод.
public function readForumsParts(){
$resultForum = []; //масив для даних розділу
$resultPart = []; //масив для даних підрозділу
//робимо вибірку розділів форуму
$forums = $this->db->query("SELECT * FROM forums");
$forums->setFetchMode(PDO::FETCH_OBJ);
while($forum = $forums->fetch()) //збираємо результати вибірки розділів
{
$forum->name = htmlspecialchars($forum->name);
$resultForum[] = $forum; //записуємо обєкт даних поточного розділу в масив
//робимо вибірку підрозділів по поточному forum->id розділа
$parts = $this->db->prepare("SELECT * FROM forum_part WHERE id_forum = ?");
$parts->execute([$forum->id]);
$parts->setFetchMode(PDO::FETCH_OBJ);
while($part = $parts->fetch()){ //збираємо результати вибірки підрозділів
$resultPart[] = $part; //записуємо обєкт даних поточного підрозділу в масив
}
}
//повертаємо масив з двома масивами всередині
return [$resultForum, $resultPart];
}
В результаті роботи методу маємо наступний масив.
Array
(
[0] => Array
(
[0] => stdClass Object
(
[id] => 1
[name] => dfshsdfhdfh
)
[1] => stdClass Object
(
[id] => 2
[name] => тест =)
)
[2] => stdClass Object
(
[id] => 3
[name] => тестовий розділ :)
)
[3] => stdClass Object
(
[id] => 4
[name] => тееееест :)
)
)
[1] => Array
(
[0] => stdClass Object
(
[id] => 1
[id_forum] => 2
[name] => ок)))))))
)
[1] => stdClass Object
(
[id] => 2
[id_forum] => 2
[name] => паоваовпо
)
)
)
І приклад того, як я це все вививоджу..
$array = $model->readForumsParts(); //отримуємо вище вказаний масив
foreach($array[0] as $forum){ //перебираємо масив розділів форуму
echo '<b>'.$forum->name.'</b></br>'; //виводимо розділ
foreach($array[1] as $part){ //перебираємо підрозділи поточного розділу
if($forum->id == $part->id_forum) //якщо поточний id розділу = id поточного підрозділу
echo $part->name.'</br>'; //то виводимо підрозділ
}
}
Ок, все працює.
Але як можна вирішити оптимальніше?
Можливо є ще якесь рішення з самим SQL запитом (зробити якось один запит для вибірки) у звязці з PHP, або ж оптимальніше з'єднати масиви? (не просто злити в один). . . .