Arf bon du coup ça m'a donné envie de le faire en erlang. c'était marrant mais il faut savoir avant toute chose que ce n'est pas du tout adapté à ce langage. Erlang est bien en dessous de php pour la gestion de tels tableaux.
Version avec des dicts
%%% pour Jeuweb
-module(php_array_add).
%%% Utils
-export([array_add/1]).
%%% Tests
-export([test/0]).
test() ->
Array1 = [{trucs, 12},{machins, 3},{choses, -4}],
Array2 = [{machins, 1},{choses, 80}, {'FAIL!', "pas un int()"}],
Array3 = [{machins, 12},{bidules, 24},{trucs, "ici non plus"}],
array_add([Array1, Array2, Array3]).
%% Si un seul tableau est passé on le retourne
array_add([Ar|[]]) -> Ar;
%% Quand il ne reste que 2 tableaux à traiter, on renvoie leur "somme"
array_add([A1, A2|[]]) -> addition(A1,A2);
%% ici on pioche les deux premiers tableaux de la liste
%% et on repose leur "somme" sur la liste
array_add([A1, A2|Arrays]) -> array_add([addition(A1,A2)|Arrays]).
%% ici on se sert d'un accumulateur Acc, il joue le rôle de $result
addition(A1, A2) -> addition(A1, A2, []).
%% cette fonction n'est pas du tout performante, c'est pour l'exemple,
%% ici on parcourt maintes fois A2, bien plus que nécessaire
addition([], A2, Acc) -> A2 ++ Acc;
addition([{Key, Value}|A1], A2, Acc) when is_integer(Value)->
ToAdd = case proplists:get_value(Key, A2, 0) of
X when is_integer(X) -> X;
_ -> 0
end,
NewPair = {Key, Value + ToAdd},
addition(A1, proplists:delete(Key, A2), [NewPair|Acc]);
%% Si la value n'est pas un entier, j'ai pris comme parti de la zapper
addition([{_Key, _Value}|A1], A2, Acc) -> addition(A1, A2, Acc).
29> c(php_array_add).
{ok,php_array_add}
30> php_array_add:test().
[{bidules,24},{trucs,12},{machins,16},{choses,76}]
31>
Version avec des dicts
-module(jeuweb).
-export([dict_melt/1,test/0,add_only_int/3]).
dict_melt([]) ->
dict:new();
dict_melt([Dict|[]]) ->
dict:to_list(Dict);
dict_melt([Dict1,Dict2|Dicts]) ->
dict_melt([melt(Dict1,Dict2)|Dicts]).
melt(D1,D2) ->
dict:merge(fun(K,V,VV)->add_only_int(K,V,VV) end, D1, D2).
add_only_int(_K, V1, V2) when is_integer(V1), is_integer(V2) ->
V1 + V2;
add_only_int(_K, V1, _V2) when is_integer(V1) -> V1;
add_only_int(_K, _V1, V2) when is_integer(V2) -> V2.
test() ->
Arrays = [
[{trucs, 12},{machins, 3},{choses, -4}],
[{machins, 1},{choses, 80}, {'FAIL!', "pas un int()"}],
[{machins, 12},{bidules, 24},{trucs, "ici non plus"}]
],
dict_melt(lists:map(fun(L) -> dict:from_list(L) end, Arrays)).