Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ronaldoribe

Agrupar array e somar

Recommended Posts

Noite Galera,

 

Gente, preciso de uma grande ajuda, tenho a seguinte array

 

$lista = Array(

 

array(Rato, 20),

array(Camundongo, 15),

array(Cachorro, 13),

array(Hamster, 12),

array(Gato, 5),

array(Cavalo, 7),

array(Rato, 23),

array(Hamster, 2)

);

 

O que preciso é agrupar os animais e depois somar os valores depois da vírgula, tipo:

 

Rato => 43

Hamster => 14

Cachorro => 13

etc, etc, etc

 

grande abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, essa é uma questão de lógica mesmo, pois não é complicado de se criar uma função que atenda a esta necessidade.

 

Veja

function my_function( array $input )
{
    $result = array( );
    array_walk(        
        $input,        
        function( $value ) use( &$result )
        {
            if( isset( $result[ reset( $value ) ] ) )
            {
                $result[ reset( $value ) ] += end( $value );
            }
            else
            {
                $result[ reset( $value ) ] = end( $value );
            }          
        }        
    );
    return $result;
}

var_dump( my_function( $lista ) );

 

Saída


array
  'Rato' => int 43
  'Camundongo' => int 15
  'Cachorro' => int 13
  'Hamster' => int 14
  'Gato' => int 5
  'Cavalo' => int 7

Compartilhar este post


Link para o post
Compartilhar em outros sites

Carlos, valeu pela atenção em me responder, valeu mesmo, olhando o código, eu jamais chegaria

nessa função, me tira uma dúvida:

 

ha uma forma de se chegar nesse mesmo resultado usando foreach?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, é possível

 

function my_function( array $input )
{
    $result = array( );
    foreach( $input as $value )
    {
        if( isset( $result[ reset( $value ) ] ) )
        {
            $result[ reset( $value ) ] += end( $value );
        }
        else
        {
            $result[ reset( $value ) ] = end( $value );
        }           
    }
    return $result;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

pergunto isso pq obtenho os dados através de um for. Minha intenção é montar uma

pequena tela de informação, tipo:

 

Animal: Rato, Idade: 2 meses sexo: macho número: 20

Animal: Rato, Idade: 2 meses sexo: fêmea número: 23 Total: 43

Animal: Cachorro, Idade: 1 ano sexo: fêmea número: 2

etc, etc, etc

 

 

 

 

 

 

 



$pesquisa3 = explode(">>", $infoanimal);
$num_pesq3 = count($pesquisa3);
$num_pesq3--;
$num_pesq3;
for($i=0;$i<$num_pesq3;$i++){
$dadosx3 = explode("||", $pesquisa3[$i]);
$animais[0] = $dadosx3[0];
$namostral[0] = $dadosx3[5];


$lista = array(array($animais[0], $namostral[0]));

}



Carlos, como faço para entrar em contato com vc? te pagaria para aplicar isso em uma página

que já tenho em rede, te mostraria o que quero e vc aplica na pagina



este é o link http://www.cepunifesp.com.br/experimental/visualiza3.php, vai gerar um pdf, o que eu quero é colocar um total de animais logo abaixo de cada grupo de animais

Compartilhar este post


Link para o post
Compartilhar em outros sites

array_reduce :seta: http://php.net/manual/en/function.array-reduce.php

<?php
$lista = array(
    array('Rato', 20),
    array('Camundongo', 15),
    array('Cachorro', 13),
    array('Hamster', 12),
    array('Gato', 5),
    array('Cavalo', 7),
    array('Rato', 23),
    array('Hamster', 2)
);

$reduced = array_reduce($lista, function($reduced, $animal) {
    $name = $animal[0];

    if (!isset($reduced[$name])) {
        $reduced[$name] = 0;
    }

    $reduced[$name] += $animal[1];

    return $reduced;
});

var_dump($reduced);

Compartilhar este post


Link para o post
Compartilhar em outros sites

A função que vcs criaram é muito bem bolada, mas não estou conseguindo aplicar na minha página, pq?

 

for($i=0;$i<$num_pesq3;$i++){ AQUI EU POSSO TER UM LOOP DE N VEZES PARA ALIMENTAR O $LISTA
$dadosx3 = explode("||", $pesquisa3[$i]);
$animais[0] = $dadosx3[0];
$namostral[0] = $dadosx3[5];

$lista = array(array($animais[0], $namostral[0])); N

 

A PÁGINA QUE ESTOU CRIANDO, POSSO TER NO RELATÓRIO SOMENTE RATOS E CAMUNDONGOS DENTRO DO LOOP, ENTÃO EU NECESSITO TER ALGO ASSIM

 

 

Animal: Rato sexo: Machos quantidade: 20

Animal: Rato sexo: Femeas quantidade: 3

Total: 23

Animal: Gato sexo: Femeas quantidade: 4

Total: 4 etc, etc, etc

 

ou seja, é necessário que o código para $TOTAL

traga para cada grupo de animal o seu total específico

 

nesse link eu tenho o modelo melhor elaborado em pdf

 

www.cepunifesp.com.br/experimental/visualiza3.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

Utilize array_reduce como sugeri no post anterior. É o caminho para chegar ao seu objetivo.

 

:seta: http://php.net/manual/en/function.array-reduce.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, posto aqui o resultado que cheguei sem "function", talvez seja interessante para algum colega

 

<?php
$animais = array(
array("Rato", 20),
array("Cachorro", 3),
array("Camundongo", 15),
array("Rato", 9)
);

foreach ($animais as $linha)
{$grupo[$linha[0]][] = $linha[1];}

foreach ($grupo as $x => $y){
$col1[] = $x;
$col2[] = array_sum($y);
}

print_r($col1);
echo "<br/>";
print_r($col2);
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Preciso fazer a mesma coisa, porém é agrupa Números de celular com minutos e soma total de cada. Número celular 9999-9999 | minutos 00:01:19, tentei implementar mais não deu certo. Eu recebo os dados de um arquivo externo (.csv) e faço a inserção no banco de dados. Fiz uma condição se o número já estiver no bd ele soma caso contrário ele insere...

Compartilhar este post


Link para o post
Compartilhar em outros sites

minha função é essa

 

 

 
 
function calculo_ligacoes_oi_outros($arquivo){
 
while (($linha = fgets($arquivo)) !== FALSE) {
    $pedacos = explode(";", $linha);
 
/*PROCURAR PALAVRA*/
$procurar = utf8_decode('Ligações de Oi para outros celulares');
$key = array_search($procurar, $pedacos); 
 
  
if($key && $pedacos['3'] != ''){
 
 
if($pedacos['4'] == $procurar){
$tipo_de_uso = '5';
}
 
$VeriNumero = read('calcule_sua_conta',"WHERE numero = '$pedacos[1]'");
 
if($VeriNumero >= 1){
foreach($VeriNumero as $Numero);
//$dados   = array ($pedacos[0], $pedacos[5] );
$tempo     = array ($Numero['id'], $Numero['duracao'] );
$tempo2     = array ($pedacos[0], $pedacos[3] );
$segundos = 0;
list( $h, $m, $s ) = explode( ':', $tempo['1'] );
list( $hh, $mm, $ss ) = explode( ':', $tempo2['1'] ); 
 
$segundos += ($h+$hh) * 3600;
$segundos += ($m+$mm) * 60;
$segundos += ($s+$ss);
 
$horas = floor( $segundos / 3600 ); 
$segundos %= 3600; 
$minutos = floor( $segundos / 60 );
$segundos %= 60;
 
$t1 += $horas;
$t2 += $minutos;
$t3 += $segundos;
while( $t3 >= 60 ) {
$t2++;
$t3 = $t3 - 60;
}
 
while( $t2 >= 60 ) {
$t1++;
$t2 = $t2 - 60;
}
 
$total_min = str_pad($t1,2,0,STR_PAD_LEFT).':'.str_pad($t2,2,0,STR_PAD_LEFT).':'.str_pad($t3,2,0,STR_PAD_LEFT);
 
$up = mysql_query("UPDATE calcule_sua_conta SET duracao = '$total_min' WHERE numero = '$pedacos[1]'") or die(mysql_error());
}else{
$cad = mysql_query("INSERT INTO calcule_sua_conta  (numero, duracao, tipo_de_uso) 
VALUES ('$pedacos[1]', '$pedacos[3]', '$tipo_de_uso')") or die(mysql_error());
}
 
echo '<pre>';
  echo 'Celular: '.$pedacos['1']. ' | Minutos: '.$pedacos['3']. ' | TIPO: '.$pedacos['4'];
  echo '</pre>';
 
} //fim key search
 
 
 
}//fim leitura
 
 
}//function
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma forma mais simplificada da que o Carlos postou é consideravelmente mais eficaz que a do João:

 

$lista = Array(

    array( 'Rato',          20 ),
    array( 'Camundongo',    15 ),
    array( 'Cachorro',      13 ),
    array( 'Gato',          10 ),
    array( 'Hamster',       12 ),
    array( 'Gato',           5 ),
    array( 'Cavalo',         7 ),
    array( 'Rato',          23 ),
    array( 'Hamster',        2 )
);

$data = array();

foreach( $lista as $entry ) {

    list( $animal, $amount ) = $entry;

    if( ! array_key_exists( $animal, $data ) ) {
        $data[ $animal ] = 0;
    }

    $data[ $animal ] += $amount;
}

var_dump( $data );

 

Os dados obtidos pelo Apache Benchmark foram:

 

foreach
4347 Requisições por segundo com média de 2.3 ms por requisição
array_reduce() ou array_walk() (em substituto ao foreach)
3846 Requisições por segundo com média de 2.7ms por requisição

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.