Qual é a maneira mais simples e que usa menos poder computacional para verificar se uma matriz multidimensional tem alguns valores iguais nas subchaves e, se for o caso, fazer a soma deles?
Olhe para a entrada . É algo assim:
$array[] = ['number' => 1, 'values' => ['a' => 1, 'b' => 2]];
$array[] = ['number' => 2, 'values' => ['a' => 4, 'b' => 1]];
$array[] = ['number' => 2, 'values' => ['a' => 1, 'b' => 4]]; // same "number" as the previous so get the sum between "a" of the previous and "a" of this, the same for "b"
$array[] = ['number' => 2, 'values' => ['a' => 1, 'b' => 1]]; // same "number" as the previous so get the sum between "a" of the previous and "a" of this, the same for "b"
$array[] = ['number' => 3, 'values' => ['a' => 2, 'b' => 4]];
Então a saída deve ser
$array[0] : ['number' => 1, 'values' => ['a' => 1, 'b' => 2]];
$array[1] : ['number' => 2, 'values' => ['a' => 6, 'b' => 6]]; //a = 4 + 1 + 1 //b = 1 + 4 + 1
$array[2] : ['number' => 3, 'values' => ['a' => 2, 'b' => 4]];
Para falar a verdade, tenho dificuldade em fazer isso até mesmo com um foreach simples.
Meu cérebro só consegue ir até certo ponto e nada mais.
$array_output = [];
foreach ($array as $k => $v){
foreach ($array as $kk => $vv){
if ($v['number'] == $vv['number']) {
// ????
}
}
}
Alguém me ajuda?
Outra pergunta na mesma pergunta
Como fazer a mesma coisa para$array[] = ['number' => 1, 'a' => 1, 'b' => 2];
$array[] = ['number' => 2, 'a' => 4, 'b' => 1];
$array[] = ['number' => 2, 'a' => 1, 'b' => 4];
$array[] = ['number' => 2, 'a' => 1, 'b' => 1];
$array[] = ['number' => 3, 'a' => 2, 'b' => 4];
então como obter a soma da mesma variável number
para variáveis a
e ?b
verificando resultado
me dá isso
edição: voltei e vi o comentário do CH sobre um posicionamento de incremento incorreto, código agora corrigido.
Só para acrescentar, para responder à pergunta seguinte, você pode remover todas as menções de
['values']
para usar a mesma lógica para o exemplo mais simples do segundo array.Usando funções de array. A ideia é construir um array onde o "número" é a chave com
array_reduce
e então remover essas chaves comarray_values
. Dessa forma você sabe facilmente se um número já foi encontrado e se você tem que somar ou definir uma nova chave.array_values
é finalmente usado para remover essas chaves.demonstração
Note que este código foi escrito para PHP >= 8.0. Para torná-lo compatível com versões mais antigas, remova os rótulos de parâmetros em chamadas de função (
callback:
,key:
,array:
, etc.).Para que você não precise controlar os índices de dados inseridos na matriz de resultados nem reindexar o resultado, insira variáveis de referência na matriz de resultados para representar cada grupo.
Supondo que todas as linhas terão as mesmas colunas no
values
subarray, você pode somar incondicionalmente em um loop aninhado sempre que um grupo for encontrado mais de uma vez. ( Demonstração )Este conselho se assemelha a muitas das minhas respostas anteriores sobre o tópico de agrupamento e soma de dados de array. Minhas postagens marcadas com arrays + agrupamento + soma