@arnostik
Учусь программированию на PHP

Как «проредить» многомерный массив по образцу?

Есть начальная выборка данных из базы данных. 1. id группы 2. название группы, 3.id группы более высокого порядка для этой группы 4. Активность группы

1 - Школа 9 - Null - 1.
2 - Класс 3 - 1 - 1
3 - Класс 3А - 2 - 1
4 - Класс 3Б - 2 - 0
5 - Школа 10 - Null - 1.
6 - Класс 4- 5 -1
7 - Класс 5- 5 -0
8 - Класс 5А - 7 - 1
9 - Класс 6 - 5 - 1
10 - Класс 6А - 9 - 0

Как видим, в школе номер 10, неактивность группы установлена для всех 5 классов (хотя 5А числится активным, но группа более высокого порядка делает его также неактивным). И класс 6А 3Б числится также неактивным.

И есть входящий список

$list[Школа 11][Класс 11][Класс 11А]="54654.doc";
$list[Школа 10][Класс 9]{Класс 9А}="56.doc";
$list[Школа 9][Класс 3][Класс 3А]="434.doc";
$list[Школа 9][Класс 3][Класс 3Б]="564.doc";
$list[Школа 10][Класс 5][Класс 5Е]="454.doc";


В данном списке мы видим новые группы (которых нет в нашей базе данных и их нужно создать в базе - школа 11, класс 11 и класс 11а (с зависимостью между ними) и отбросить из обработки те классы, которые в базе данных помечены как неактивные, то есть необрабатывать все пятые классы из школы 10 и не обрабатывать класс 3б из девятой школы и.т.д. Данный список необзательно 3 уровневый. Например, в школе может не быть А, Б, В классов и быть всего 1 класс. То есть 2 уровень иерархии может быть последним, к примеру. Может быть и ситуация обратная, когда, например, в 3А классе, будет две подгруппы, тогда уровень иерархии будет состоять из 4 звеньев.

Есть две проблемы - во входящем списке нет id искать можно только по наименованию, при этом есть полный путь к этой группе (то есть нельзя перепутать 5 класс одной школы с другой школой).

Помогите, пожалуйста, с задачей, нужно отфильтровать из обработки те группы, которые неактивны и внести в базу данных информацию о новых появившихся группах и взаимосвязи между ними. Понятно, что новые группы можно внести в базу данных поочередно, получив id группы более высокого порядка, если такая в базе данных до этого не была
  • Вопрос задан
  • 327 просмотров
Пригласить эксперта
Ответы на вопрос 2
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
используйте бинарный фильтр: 2^N+.....+2^2+2^1+2^0 для проставления состояний наследования.
(обычно подобный подход применяют в контроле прав к объектам)
Ответ написан
Комментировать
Kwisatz
@Kwisatz
Больше web-приложений, хороших и разных
Пройдитесь рекурсивной функцией, делов то
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы