Имя: Пароль:
1C
 
Как массив массивов превратить в многомерный массив?
,
0 D_Pavel
 
07.09.16
08:28
Есть несколько одномерных массивов лежащих в другом массиве:

Массив["Название"] = ("Яблоки", "Груши", "Арбузы", .......);
Массив["Цвет"] = ("Красные", "Желтые", "Зеленые", ......);
....................................
Массив["Вкус"] = ("Кислые", "Сладкие", .......);

Нужно придумать такой цикл, чтобы составить все возможные комбинации, то есть перемножить все массивы, чтобы получилось что-то типа того:

(Яблоки, Красные, Кислые), (Яблоки, Красные, Сладкие), (Яблоки, Желтые, Кислые), ...... (Арбузы, Зеленые, Сладкие)

В общем как если бы я написал столько циклов, сколько всего у меня есть вложенных массивов. Но количество массивов может быть разным, я не могу написать заранее все возможные циклы. А писать код программы динамически через Выполнить("Циклы всякие") как-то тупо.

Как сделать по другому можно?
1 DrZombi
 
гуру
07.09.16
08:30
(0) Огласите язык, на котором вы хотите это видеть :)
2 mkalimulin
 
07.09.16
08:30
(0) Используй рекурсивный вызов.
3 DrZombi
 
гуру
07.09.16
08:31
>>>> Выполнить("Циклы всякие") как-то тупо.

Лень, это движитель прогресса :)
4 D_Pavel
 
07.09.16
08:31
(1) ну например 1С или ПХП или Бейсик. Смотря на каком умеете писать. Можно просто своими словами
5 D_Pavel
 
07.09.16
08:32
(2) Спасибо. Попробую. Если никто ничего лучше не придумает, то темку можно закрыть
6 D_Pavel
 
07.09.16
08:33
(3) Факт
7 DrZombi
 
гуру
07.09.16
08:33
(4) Цикл, в цикле
Рекурсия, но по сути тот же цикл, только памяти кушает больше.

Все заключается не в красивости или банальности рутины, а в использовании предоставленных ресурсов ПК :)
8 D_Pavel
 
07.09.16
08:34
(7) Цикл в цикле хотел сделать, но не получается.
9 Ёпрст
 
07.09.16
08:35
(0) https://forum.antichat.ru/threads/172028/

на 1с-ине NS в своё время реализовывал, еще на клюшках.
10 Asmody
 
07.09.16
08:36
(0)
шаг 1: написать функцию, которая перемножает два массива.
шаг 2: результирующим объявить первый массив
шаг 3: вызвать функцию для результирующего и следующего массива, результат функции объявить результирующим
шаг 4: повторить шаг 3 для всех остальных массивов
11 Ёпрст
 
07.09.16
08:37
12 Ёпрст
 
07.09.16
08:37
там есть формулы приведения многомерного массива к одномерному.
13 Asmody
 
07.09.16
08:38
(12) Информатика, 9й класс.
14 D_Pavel
 
07.09.16
08:39
Спасибо, доны. Ушел писать кот.
15 Ластик
 
07.09.16
08:39
Загнать все массивы в запрос и источники указать через запятую (без указания полей по которым соедиять). На выходе будет таблица всех комбинаций.
16 D_Pavel
 
07.09.16
08:41
(15) О! Супер! SQL сервер все сделает за меня
17 DrZombi
 
гуру
07.09.16
08:42
(8) Печально. Нужно делать 3 цикла с формированием динамического цикла соответствующей структуры :)
18 Asmody
 
07.09.16
08:42
(16) Это очень неоптимальное решение.
19 D_Pavel
 
07.09.16
08:42
(17) Почему три цикла? Массивов могло быть и шесть
20 DrZombi
 
гуру
07.09.16
08:42
(15) А это интересней, и делать почти нечего не надо :)
21 DrZombi
 
гуру
07.09.16
08:43
(19) Тогда и циклов будет 6-ть :)
22 Asmody
 
07.09.16
08:44
(20) Всего-то прогнать пачку массивов на сервер и обратно
23 DrZombi
 
гуру
07.09.16
08:44
+(19) Каждый массив уже идет отдельным массивом, чем он хуже отдельного цикла? :)
24 DrZombi
 
гуру
07.09.16
08:44
(22) Ага, ладно там будет 10 элементов. А когда дойдет до миллиона? :)
25 DrZombi
 
гуру
07.09.16
08:45
+ А если это будет уже 10 массивов :)
26 DrZombi
 
гуру
07.09.16
08:46
Как ни крути, но есть ограничения. И каждый способ будет хорош в своем случаи :)
27 Мыш
 
07.09.16
08:54
(14) > Ушел писать кот
Не мучай животинку, сам пиши.
28 D_Pavel
 
07.09.16
09:03
(22) Лучше прогнать на сервер несколько одномерных массивов чем рекурсия.
29 Asmody
 
07.09.16
09:04
(28) Можно написать без рекурсии.
30 D_Pavel
 
07.09.16
09:17
(29) Можно. Но все равно быстрее на сервер массивы загнать, чем перемножать массивы на языке высокого уровня.
31 CMblCL
 
07.09.16
10:58
(0)
Алгоритм:
Имеем, например массивы
[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]

1. Копируем полностью первый массив в результат - массив массивов так, что каждый элемент представляет из себя массив с единственным элементом:

Результат:
[[1], [2], [3]]

2. Вычисляем количество элементов второго массива из дано [3] и в результате каждый массив копируем столько раз

Результат:
[[1], [1], [1],
[2], [2], [2],
[3], [3], [3]]

3. записываем элементы второго массива из дано в массивы результата пока не запишем в каждый по одному элементу, (когда массив заканчивается идем сначала)

Результат:
[[1, 4], [1, 5], [1, 6],
[2, 4], [2, 5], [2, 6],
[3, 4], [3, 5], [3, 6]]

4. Повторить пункты 2 и 3 для всех массивов из дано

5. В результате получаем то, что надо