Ir para conteúdo

POWERED BY:

Arquivado

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

erison

contar array duplicada

Recommended Posts

pessoal tenho a seguinte array

Array
(
   [0] => Array
       (
           [NMfunci] => FRANCISCO ERISON SILVA DO NASCIMENTO
           [0] => FRANCISCO ERISON SILVA DO NASCIMENTO
           [iDos] => 3368
           [1] => 3368
       )

   [1] => Array
       (
           [NMfunci] => FRANCISCO ERISON SILVA DO NASCIMENTO
           [0] => FRANCISCO ERISON SILVA DO NASCIMENTO
           [iDos] => 2301
           [1] => 2301
       )

   [2] => Array
       (
           [NMfunci] => FRANCISCO ERISON SILVA DO NASCIMENTO
           [0] => FRANCISCO ERISON SILVA DO NASCIMENTO
           [iDos] => 3183
           [1] => 3183
       )

   [3] => Array
       (
           [NMfunci] => LEONARDO FARIAS CRUZ
           [0] => LEONARDO FARIAS CRUZ
           [iDos] => 3401
           [1] => 3401
       )

)

 

e queria fazer a seguinte contagem

FRANCISCO ERISON SILVA DO NASCIMENTO = 3

LEONARDO FARIAS CRUZ = 1

 

tem como?

Compartilhar este post


Link para o post
Compartilhar em outros sites

tem sim...

$array = array(
   0 => array(
           0 => 'fulano', 
           'id' => '1615', 
           2 => 'ciclano' 
        )
)

$contArrayUm = count($array[0]); // só pra contar os nós do array 0

$arrayUm = $array[0]; // pegar os dados do primeiro array 0
$arrayDois_1 = $arrayUm[0]; // pego os dados do primeiro array
$arrayDois_2 = $arrayUm['id'];
$arrayDois_3 = $arrayUm[2];

Compartilhar este post


Link para o post
Compartilhar em outros sites

tem sim...

$array = array(
   0 => array(
           0 => 'fulano', 
           'id' => '1615', 
           2 => 'ciclano' 
        )
)

$contArrayUm = count($array[0]); // só pra contar os nós do array 0

$arrayUm = $array[0]; // pegar os dados do primeiro array 0
$arrayDois_1 = $arrayUm[0]; // pego os dados do primeiro array
$arrayDois_2 = $arrayUm['id'];
$arrayDois_3 = $arrayUm[2];

 

rs rapaz isso deu muito certo não

 

echo que o retorno certo

era para ser como no array_count_values

 

que retorna

[FRANCISCO ERISON SILVA DO NASCIMENTO] => 3

[LEONARDO FARIAS CRUZ] => 1

 

mas so dar na mesma array, não sei como fazer em multidimensional

Compartilhar este post


Link para o post
Compartilhar em outros sites

amigo revise seu script ...

pois utilizo uma aplicação exatamente dessa forma e funciona perfeitamente... :huh:/>

 

 

mas a minha estrutura da array e diferente da sua, como vai da certo

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara...

acabei de fazer um teste aqui exatamente como postei acima e funcionou perfeitamente... :grin:/>

 

poste seu código aí!

 

mas isso ai você vai colocando na mão essas chaves, eu quero isso automatico

Compartilhar este post


Link para o post
Compartilhar em outros sites

tente assim:

$array[] = array(
          0 => $nome, 
         'id' => $id, 
          2 => $string
);

 

dessa forma os primeiros nós do array será criado automaticamente a partir do 0

Compartilhar este post


Link para o post
Compartilhar em outros sites

conseguie fazer desta forma,

 

$Qry = Array
(
   [0] => Array
       (
           [NMfunci] => FRANCISCO ERISON SILVA DO NASCIMENTO
           [0] => FRANCISCO ERISON SILVA DO NASCIMENTO
           [iDos] => 3368
           [1] => 3368
       )

   [1] => Array
       (
           [NMfunci] => FRANCISCO ERISON SILVA DO NASCIMENTO
           [0] => FRANCISCO ERISON SILVA DO NASCIMENTO
           [iDos] => 2301
           [1] => 2301
       )

   [2] => Array
       (
           [NMfunci] => FRANCISCO ERISON SILVA DO NASCIMENTO
           [0] => FRANCISCO ERISON SILVA DO NASCIMENTO
           [iDos] => 3183
           [1] => 3183
       )

   [3] => Array
       (
           [NMfunci] => LEONARDO FARIAS CRUZ
           [0] => LEONARDO FARIAS CRUZ
           [iDos] => 3401
           [1] => 3401
       )

);

foreach(array_map(function($a){return array_unique($a);},$Qry) as $Mst):
$MstFim[] = $Mst['NMfunci'];
endforeach;

print_r(array_count_values($MstFim));

 

mas acho que ficou meio q uma gambiarra, pesso que os administradores não coloque como resolvido.

pq acho que deve ter uma forma melhor, sem eu prescisar dar um foreach;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa,

 

Acredito que uma outra forma de se fazer, seria assim:

Lembre-se que para esse tipo de verificação, você precisa efetuar uma busca linear em todo o array.

Não há funções mágicas para te retornar algo pronto da forma que quer.

 

<?php

function hasDuplicate($array, $key) {
$unique = array();
$total = count($array);
for($i = 0; $i < $total; $i++) {
	for($j = 0; $j < $total; $j++) {
		if(isset($array[$i][$key])) {
			if($array[$i][$key] == $array[$j][$key]) {
				$unique[] = $array[$i][$key];
			}
		}
	}
}

return array_count_values($unique);
}

print_r( hasDuplicate($array, 'NMfunci') );

?>

 

Abs!

Compartilhar este post


Link para o post
Compartilhar em outros sites

o amigo Limma citou uma forma de fazer com for muito boa colocação, como eu já gosto de utilizar mais o foreach quando vo trabalhar com array então eu faria dessa forma:

 

<?php
$Qry = array(
   0 => array
       (
           'NMfunci' => 'FRANCISCO ERISON SILVA DO NASCIMENTO',
           0 => 'FRANCISCO ERISON SILVA DO NASCIMENTO',
           'IDos' => 3368,
           1 => 3368
       ),

   1 => array
       (
           'NMfunci' => 'FRANCISCO ERISON SILVA DO NASCIMENTO',
           0 => 'FRANCISCO ERISON SILVA DO NASCIMENTO',
           'IDos' => 2301,
           1 => 2301
       ),

   2 => array
       (
           'NMfunci' => 'FRANCISCO ERISON SILVA DO NASCIMENTO',
           0 => 'FRANCISCO ERISON SILVA DO NASCIMENTO',
           'IDos' => '3183',
           1 => 3183
       ),

   3 => array
       (
           'NMfunci' => 'LEONARDO FARIAS CRUZ',
           0 => 'LEONARDO FARIAS CRUZ',
           'IDos' => 3401,
           1 => 3401
       )

);

$ctCh=0;
foreach($Qry as $chave => $valor){
  foreach($valor as $ch => $vl){
     if($ch == 'NMfunci'){
        $NMfunci[$ctCh] = $vl;
     }
  }
$ctCh++;
}

print_r($NMfunci);
?>

 

acredito que seria isso que assim resolveria o problema... :grin:

Compartilhar este post


Link para o post
Compartilhar em outros sites

a questão não e com um for ou um while ou um foreach;

 

eu não quero listar toda a array, pq se for uma array muito grande ela vai demorar mais para dar o resultado.

 

mas em fim do modo que postei ai em cima deu certo,

so queria tirar esse meu foreach.

 

mas enquantanto não acha solução deixa como esta

 

vlw ai galera

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não dá pra fugir do for/foreach cara.

Uma solução mais elegante de se fazer seria utilizando SPL (Standart PHP Library) do PHP.

Um exemplo abaixo:

 

Com RecursiveArrayIterator e RecursiveIteratorIterator você "achata/flatten" o array e percorre os nós com AppendInterator.

 

<?php
$array = array();
$array[] = array('NMfunci' => 'FRANCISCO ERISON SILVA DO NASCIMENTO', 
				'0' => 'FRANCISCO ERISON SILVA DO NASCIMENTO',
				'IDos' => 3368,
				'1' => 3368);
$array[] = array('NMfunci' => 'FRANCISCO ERISON SILVA DO NASCIMENTO',
				'0' => 'FRANCISCO ERISON SILVA DO NASCIMENTO',
				'IDos' => 2301,
				'1' => 2301);

$array[] = array('NMfunci' => 'FRANCISCO ERISON SILVA DO NASCIMENTO',
				'0' => 'FRANCISCO ERISON SILVA DO NASCIMENTO',
				'IDos' => 3183,
				'1' => 3183);

$array[] = array('NMfunci' => 'LEONARDO FARIAS CRUZ',
				'0' => 'LEONARDO FARIAS CRUZ',
				'IDos' => 3401,
				'1' => 3401);

$ai = new AppendIterator;
$ai->append(new RecursiveIteratorIterator(new RecursiveArrayIterator($array)));
$counters = array();
foreach($ai as $key=>$value) {
 if ( 'NMfunci'===$key ) {
   @$counters[$value] += 1;
 }
}
print_r($counters);

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, simples e prático para uso, criei uma função e vou postar um teste que fiz:

 

 

A função:

// $arrayDeArrays = ao array multi dimensional que engloba todos os outros arrays com a chave que você quer contar
// $chave = a chave que você quer contar, que no seu caso é a 'NMfunci'


function countValueMultiArray($arrayDeArrays, $chave) {
$novoArray = array();

foreach($arrayDeArrays as $arrays) {
	if(array_key_exists($arrays[$chave], $novoArray)) {
		$novoArray[$arrays[$chave]] = $novoArray[$arrays[$chave]] + 1;
	} else {
		$novoArray[$arrays[$chave]] = 1;
	}
}

return $novoArray;
}

 

 

Exemplo de uso:

 

// Declaro o array que você postou primeiramente


$arrayTeste = array
(
   '0' => array
       (
           'NMfunci' => 'FRANCISCO ERISON SILVA DO NASCIMENTO',
           '0' => 'FRANCISCO ERISON SILVA DO NASCIMENTO',
           'IDos' => 3368,
           '1' => 3368
       ),

   '1' => array
       (
           'NMfunci' => 'FRANCISCO ERISON SILVA DO NASCIMENTO',
           '0' => 'FRANCISCO ERISON SILVA DO NASCIMENTO',
           'IDos' => 2301,
           '1' => 2301
       ),

   '2' => array
       (
           'NMfunci' => 'FRANCISCO ERISON SILVA DO NASCIMENTO',
           '0' => 'FRANCISCO ERISON SILVA DO NASCIMENTO',
           'IDos' => 3183,
           '1' => 3183
       ),

   '3' => array
       (
           'NMfunci' => 'LEONARDO FARIAS CRUZ',
           '0' => 'LEONARDO FARIAS CRUZ',
           'IDos' => 3401,
           '1' => 3401
       )
);

// chamo a minha função que mostrei anteriormente

$arrayFormatado = countValueMultiArray($arrayTeste,'NMfunci');

// faço um var_dump apenas para mostrar na tela e confirmar que a função fez o que tinha que fazer
var_dump($arrayFormatado);

 

a saída foi:

 

array (size=2)
 'FRANCISCO ERISON SILVA DO NASCIMENTO' => int 3
 'LEONARDO FARIAS CRUZ' => int 1

 

não fiz o teste com grandes arrays, pois estou sem tempo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

a questão não e com um for ou um while ou um foreach;

 

eu não quero listar toda a array, pq se for uma array muito grande ela vai demorar mais para dar o resultado.

 

mas em fim do modo que postei ai em cima deu certo,

so queria tirar esse meu foreach.

 

mas enquantanto não acha solução deixa como esta

 

vlw ai galera

 

o amigo txai criou uma função PHP ... muito bom... mas mesmo assim tem um foreach() dentro da função...

 

acredito que não exista possibilidade de fazer essa funcionalidade sem um for/foreach ou while, e se existe desconheço!

 

boa sorte na sua busca!.. B)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma das várias formas de se resolver este problema é a seguinte:

 

Array

 

 

$array = array
(
   0 => array
       (
           'NMfunci' => 'FRANCISCO ERISON SILVA DO NASCIMENTO',
           0         => 'FRANCISCO ERISON SILVA DO NASCIMENTO',
           'IDos'    => 3368,
           1         => 3368
       ),

   1 => array
       (
           'NMfunci' => 'FRANCISCO ERISON SILVA DO NASCIMENTO',
           0         => 'FRANCISCO ERISON SILVA DO NASCIMENTO',
           'IDos'    => 2301,
           1         => 2301
       ),

   2 => array
       (
           'NMfunci' => 'FRANCISCO ERISON SILVA DO NASCIMENTO',
           0         => 'FRANCISCO ERISON SILVA DO NASCIMENTO',
           'IDos'    => 3183,
           1         => 3183
       ),

   3 => array
       (
           'NMfunci' => 'LEONARDO FARIAS CRUZ',
           0         => 'LEONARDO FARIAS CRUZ',
           'IDos'    => 3401,
           1         => 3401
       )
);

 

 

 

Script

function my_array_count_values( array $array )
{
   $result = array( );
   $array  = array_chunk( $array, 1 );
   array_walk(        
       $array,        
       function( $array ) use( &$result )
       {
           $result = array_merge( $result, array_values( array_unique( array_shift( $array ) ) ) );            
       }        
   );
   return array_count_values( $result );
}

 

Teste

var_dump( my_array_count_values( $array ) );

 

Resultado

array
 'FRANCISCO ERISON SILVA DO NASCIMENTO' => int 3
 3368 => int 1
 2301 => int 1
 3183 => int 1
 'LEONARDO FARIAS CRUZ' => int 1
 3401 => int 1

 

:closedeyes:

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.