За последние 24 часа нас посетили 22688 программистов и 1272 робота. Сейчас ищет 691 программист ...

Автоопределение, анализ, циклы и массивы

Тема в разделе "PHP для новичков", создана пользователем Dekabrio, 31 май 2016.

Метки:
  1. Dekabrio

    Dekabrio Активный пользователь

    С нами с:
    14 янв 2012
    Сообщения:
    26
    Симпатии:
    0
    Добрый день уважаемы форумчане, профессионалы и любители, а так же все остальные пользователи!
    Введение
    Уже который час не могу сообразить, как мне лучше сделать (собрать воедино), решил обратиться сюда за помощью. Пишу программу для отображения сборок деталей. Каждая сборка содержит в себе расходные материалы (имеющие свой шифр), а также другие сборки поменьше, которые, в свою очередь, тоже содержат в себе расходные материалы (части).
    Проблема
    Описанное выше я решил простым способом: В цикле частей для сборки я определял сборки поменьше и добавлял их в массив, затем создал цикл из количества подсборок в массиве и соответственно запрос на части подсборок. Казалось бы всё, проблема решена! Но нет.
    Оказывается, подсборки тоже могут собираться из других сборок поменьше, а те в свою очередь могут собираться из частей и подсборок еще меньше. Итого уровней может быть 3-4, как мне сказали заказчики. Да, я мог бы сделать 4 цикла подцикла и тд. Но это лишняя работа кода, и к тому же если уровней станет больше? Это не годится.
    Описание
    Существует 2 таблицы:
    1. Сборка назовем ее условно SB;
    2. Шифр - SH.
    Таблица SB проста как QBASIC:), а именно:
    id nsb sh pr, где
    id - счетчик;
    nsb - номер сборки;
    sh - шифр материала ( который может являться и сборкой тоже);
    pr - применяемость (сколько необходимо sh для nsb).​
    Таблицу SH мы рассматривать не будем, там только описание (расшифровка номеров), так же в этой таблице указаны все сборки, они отмечены специальным индексом. Эта таблица завязана в запросе, тут мы ее завязывать не будем. Нужно понимать что именно из-за этой таблицы я узнаю где сборка а где материал.
    Как сейчас сделано
    Приходит номер сборки $nsb, необходимое количество $kol.
    Далее запрос на вывод SB.sh и SB.pr из таблицы SB где SB.nsb = $nsb
    В цикле вывода идет запись в массив сборок array_push($mass_sh, $Rsbrow_TITLE);
    Далее определяем количество записей в массиве $n_mass_sh = count($mass_sh);
    Делаем запрос в цикле до $n_mass_sh в запросе выводим части из которых собираются подсборки.
    Рассуждения
    В принципе, я могу скопировать это 5 раз (сделать 5 вложений циклов). Но это будет неправильно и некрасиво, более того, это будет сложно даже видеть :).
    Я уверен, что существует выход из такой ситуации.
    Помогите.​
     
    #1 Dekabrio, 31 май 2016
    Последнее редактирование: 31 май 2016
  2. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Я дошел только до введения...
    Сколько букв...
     
  3. Dekabrio

    Dekabrio Активный пользователь

    С нами с:
    14 янв 2012
    Сообщения:
    26
    Симпатии:
    0
    Вот так ты набил 2690+ ответов :)
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Рекурсия классическая. Посмотрите задачу с сканированием дерева каталогов (когда каждый элемент каталога - либо файл, либо каталог), она много где решена, здесь примерно та же фигня будет. Конечно, не хорошо в рекурсивной функции делать запросы, но тут, по ходу, ничего другого не придумать.
     
    mahmuzar нравится это.
  5. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Можете погуглить в сторону nested sets
     
  6. Dekabrio

    Dekabrio Активный пользователь

    С нами с:
    14 янв 2012
    Сообщения:
    26
    Симпатии:
    0
    Да это бы подошло, но для этого мне необходимо будет переделать все базы которые существовали до меня по 10к позиций.
    --- Добавлено ---
    Я попробую, может что и получится. Спасибо за ответ!
     
  7. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Лучше бы ты просто показал код и вкратце сказал, что он делает... А то из того что ты написал... Сложно понять... Можно, но сложно.
     
  8. Dekabrio

    Dekabrio Активный пользователь

    С нами с:
    14 янв 2012
    Сообщения:
    26
    Симпатии:
    0
    Код большой, с множеством таблиц помимо этих двух, Что бы его показать мне пришлось бы его упрощать. Мне показалось это дольше чем объяснить все "на пальцах". Пользователь mkramer походу понял меня. Я почитал о рекурсивной функции, это реализуемо и думаю это подойдет. Но еще не приступал к выполнению. Если интересно я могу отписаться с результатами.
     
  9. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    кинь на гит и дай ссылку ) Посмотрю )
     
  10. Dekabrio

    Dekabrio Активный пользователь

    С нами с:
    14 янв 2012
    Сообщения:
    26
    Симпатии:
    0
    Ну что господа! Рекурсивная функция получилась. Все просто шикарно работает. Осталось только оформление заделать=) Спасибо за помощь