Модуль обеспечивает массив foldl
и foldr
складывать над массивом от низкого до высокого и высокого до низки, соответственно.
Используя foldl
и рекурсии в массивы второго уровня (и далее):
-module(test).
-export([dump/1]).
dump(Array) ->
array:foldl(fun inner_dump/3, [], Array).
Функция сброса принимает массив и начинает складку. array:foldl
берет функцию сгиба, встроенный аккумулятор и массив для сгибания. Он принимает каждый элемент массива поочередно и вызывает FoldFun(Index, Element, Accumulator)
, возвращаемое значение этого вызова становится новым аккумулятором. Для этой функции я определил аккумулятор как список индексов из родительских массивов.
inner_dump(Index, ArrayOrElement, Previous) ->
case array:is_array(ArrayOrElement) of
false ->
io:format("~p ~p~n", [lists:reverse([Index|Previous]), ArrayOrElement]),
Previous;
true ->
array:foldl(fun inner_dump/3, [Index|Previous], ArrayOrElement),
Previous
end.
Это функция сгиба. Если переданный элемент не является массивом, добавьте его индекс в список родительских индексов, затем отмените этот список и распечатайте его с помощью элемента. (Это дает индекс каждого массива, начиная с самого внешнего), как ожидалось.
Если переданный элемент является вспомогательным массивом, добавьте его индекс в список родительских индексов и сложите его таким же образом.
Это позволит вам распечатать массивы произвольной глубины и будет функционировать, даже если каждый дополнительный массив не имеет одинаковый размер.
Вот пример использования массива [[a,b,c],[1,2,3],["yes","no","maybe"]]
:
2> Array.
{array,3,0,undefined,
{{array,3,10,undefined,
{a,b,c,undefined,undefined,undefined,undefined,undefined,
undefined,undefined}},
{array,3,10,undefined,
{1,2,3,undefined,undefined,undefined,undefined,undefined,
undefined,undefined}},
{array,3,10,undefined,
{"yes","no","maybe",undefined,undefined,undefined,undefined,
undefined,undefined,undefined}},
undefined,undefined,undefined,undefined,undefined,undefined,
undefined}}
3> test:dump(Array).
[0,0] a
[0,1] b
[0,2] c
[1,0] 1
[1,1] 2
[1,2] 3
[2,0] "yes"
[2,1] "no"
[2,2] "maybe"
[]
Это работало отлично, спасибо! –