За последние 24 часа нас посетили 21189 программистов и 1487 роботов. Сейчас ищут 796 программистов ...

Массив с родительскими элементами перечислить все варианты

Тема в разделе "PHP для профи", создана пользователем sevskeef, 11 дек 2016.

  1. sevskeef

    sevskeef Новичок

    С нами с:
    11 дек 2016
    Сообщения:
    8
    Симпатии:
    0
    Приветствую всех!
    Столкнулся с пороблемой, над которой бьюсь несколько дней.
    Есть товары, у товаров есть опции. Опции разбиты на группы (opt_group). Групп пока 7 (не ограничено).
    Опции бывают зависимые или незавиcимые. Зависимость опций друг от друга показывает поле parent_id
    Нужно перечислить все варианты опций для данного товара. Т.о. мы должны получить такие строки:
    669, 1009, 1122, 1274, 1477
    669, 1009, 1202, 1274, 1477
    669, 1009, 1022, 1274, 1477
    669, 1009, 1122, 1274, 1480
    669, 1009, 1202, 1274, 1480
    669, 1009, 1022, 1274, 1480

    669, 1010, 1123, 1274, 1477
    669, 1010, 1203, 1274, 1477
    669, 1010, 1023, 1274, 1477

    669, 1010, 1123, 1274, 1480
    669, 1010, 1203, 1274, 1480
    669, 1010, 1023, 1274, 1480

    669, 1011, 1121, 1274, 1477
    669, 1011, 1133, 1274, 1477
    669, 1011, 1204, 1274, 1477

    669, 1011, 1121, 1274, 1480
    669, 1011, 1133, 1274, 1480
    669, 1011, 1204, 1274, 1480

    669, 1260, 1261, 1274, 1477
    669, 1260, 1266, 1274, 1477
    669, 1260, 1267, 1274, 1477

    669, 1260, 1261, 1274, 1480
    669, 1260, 1266, 1274, 1480
    669, 1260, 1267, 1274, 1480

    670, 1012, 1025, 1274, 1477
    670, 1012, 1125, 1274, 1477
    670, 1012, 1208, 1274, 1477

    670, 1012, 1025, 1274, 1480
    670, 1012, 1125, 1274, 1480
    670, 1012, 1208, 1274, 1480

    670, 1013, 1026, 1274, 1477
    670, 1013, 1126, 1274, 1477
    670, 1013, 1209, 1274, 1477

    670, 1013, 1026, 1274, 1480
    670, 1013, 1126, 1274, 1480
    670, 1013, 1209, 1274, 1480

    670, 1014, 1027, 1274, 1477
    670, 1014, 1127, 1274, 1477
    670, 1014, 1210, 1274, 1477

    670, 1014, 1027, 1274, 1480
    670, 1014, 1127, 1274, 1480
    670, 1014, 1210, 1274, 1480

    670, 1015, 1028, 1274, 1477
    670, 1015, 1128, 1274, 1477
    670, 1015, 1211, 1274, 1477

    670, 1015, 1028, 1274, 1480
    670, 1015, 1128, 1274, 1480
    670, 1015, 1211, 1274, 1480
    Например мы выбираем опцию 669 из 1 группы. Нам доступны следующие (зависимые от 669) опции 1009 и 1010 из 3 группы.
    Первая из них 1009 - соответственно доступны 1122, 1202 и 1022 из группы 2 и далее две независимые опции 1274 и 1477
    Количество опций для каждого товара свое и зависит от количества выбранных групп. Для данного товара их 5. Группы, как видно также могут следовать в произвольном порядке. Короче полное счастье для юзера и полная жопа для моей задачи: перечислить все товары
    со всеми опциями (для Яндекс YML).

    Главная проблема заключается как раз в этой зависимости, поэтому простой рекурсией ничего не получается (во всяком случае у меня не получается).
    К примеру с первой строкой все понятно, а вот следующая ... нужно как-то хранить 5 переменных для каждой строки, "протягивать" для каждой строки повторяющиеся и менять их проверяя зависимость.
    Короче я потерялся [​IMG](
    Нужна идея как получить этот чертов массив строк. Может не через массивы? Или вообще подключить SQL ...

    Вот ( сокращенная ) выборка опций из базы (id) для одного товара (product_id = 676):
    id product_id opt_group parent_id
    ---------------------------------------------
    669 676 1 Null
    670 676 1 Null

    1022 676 2 1009
    1023 676 2 1010
    1025 676 2 1012
    1026 676 2 1013
    1027 676 2 1014
    1028 676 2 1015

    1260 676 3 669
    1009 676 3 669
    1010 676 3 669
    1011 676 3 669
    1012 676 3 670
    1013 676 3 670
    1014 676 3 670
    1015 676 3 670

    1122 676 2 1009
    1123 676 2 1010
    1133 676 2 1011
    1121 676 2 1011
    1125 676 2 1012
    1126 676 2 1013
    1127 676 2 1014
    1128 676 2 1015
    1202 676 2 1009
    1203 676 2 1010
    1204 676 2 1011
    1208 676 2 1012
    1209 676 2 1013
    1210 676 2 1014
    1211 676 2 1015
    1261 676 2 1260
    1266 676 2 1260
    1267 676 2 1260

    1274 676 6 Null
    1477 676 7 Null
    1480 676 7 Null
    Получаю такой массив:
    array(
    [1] =>array(
    [669] =>
    [670] =>
    )
    [2] =>array(
    [1022] =>1009
    [1023] =>1010
    [1025] =>1012
    [1026] =>1013
    [1027] =>1014
    [1028] =>1015
    [1121] =>1011
    [1122] =>1009
    [1123] =>1010
    [1125] =>1012
    [1126] =>1013
    [1127] =>1014
    [1128] =>1015
    [1133] =>1011
    [1202] =>1009
    [1203] =>1010
    [1204] =>1011
    [1208] =>1012
    [1209] =>1013
    [1210] =>1014
    [1211] =>1015
    [1261] =>1260
    [1266] =>1260
    [1267] =>1260
    )
    [3] =>array(

    [1009] =>669
    [1010] =>669
    [1011] =>669
    [1012] =>670
    [1013] =>670
    [1014] =>670
    [1015] =>670
    [1260] =>669
    )
    [6] =>array(

    [1274] =>
    )
    [7] =>array(

    [1477] =>
    [1480] =>
    )
    )
     
    #1 sevskeef, 11 дек 2016
    Последнее редактирование: 11 дек 2016
  2. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    Рекурсия. И постарайтесь выгрузить все данные заранее и обходить их на стороне пышки, а не тыкать в базу мильёнами лишних запросов, хотя для разовой задачки можно и так, но это вредно !
     
  3. sevskeef

    sevskeef Новичок

    С нами с:
    11 дек 2016
    Сообщения:
    8
    Симпатии:
    0
    Да я так и делаю: все данные в массив, а потом кручу-верчу.