Ir para conteúdo

POWERED BY:

Arquivado

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

Danny Dantas

Contar quantas imagens existem com o mesmo nome

Recommended Posts

Fala galera. .

Tenho um programinha em PHP que lista todas as imagens de uma determinada pasta, sendo que os 6 primeiros caracteres correspondem ao código do produto que devo gravar a imagem.

O que preciso é contar quantas vezes o código se repete para poder gravar todas as imagens, mas em campos diferentes.

 

Minha lista depois de retornar os 6 primeiros caracteres do nome das imagens aparece assim:

 

606103
606103
606103
606103
606103
606103
606080
606080
606080
605953
605953
605946
605946

 

Preciso retornar quantas vezes aparece cada código, tipo:

606103 - 6 registros

606080 - 3 registros

605953 - 1 registro
605946 - 1 registro

 

Alguém pode ajudar?

 


Compartilhar este post


Link para o post
Compartilhar em outros sites

Como é PHP, eu utilizaria vetores e adição simples.

$codigos = array();

$codigos['606103']++;

 

 

Entretanto, é bom verificar sempre o índice, pra não jogar um notice na tela quando ele não existe:

if(!isset($codigos['606103'])) {
    $codigos['606103'] = 1;
} else {
    $codigos['606103']++;
}

 

Ajuste para o seu código, dentro do loop, é simples.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei se entendi direito. .olha ai

$string_ini = "606103";

$codigos = array();
$codigos[$string_ini]++;

if(!isset($codigos[$string_ini])) {
$codigos[$string_ini] = 1;
} else {
$codigos[$string_ini]++;
}

print "qtd códigos: ".$codigos."<br>";

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só o final não está correto.

print "qtd códigos: ".$codigos."<br>";

 

Por ser um vetor, deve tratá-lo como um:

foreach($codigos AS $codigo => $quantidade) {
    printf('%s possui %d registro(s) <br />' , $codigo , $quantidade);
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que estou muito burra hoje. . ave maria rsrs.. olha o meu código.

<?php
set_time_limit(0);
include "../funcoes/conexao.php";

if($opc == 0):

	$pasta  = "catalogo_converte/vitrine_raiz";
	$imagem = glob("$pasta/{*.jpg,*.gif,*.png,*.bmp}",GLOB_BRACE);
	$file   = array();

	foreach($imagem as $img)
	{
		$tmp  = ($img);
		$file[$tmp] = $img;

		$img = getimagesize($img); //pega tamanho da imagem
		$largura = $img[0];
		$altura  = $img[1];
	}

	krsort($file);
	
	$con = conecta();

	#grava imagem por código
	foreach($file as $images)
	{
		$ext    = pathinfo($images, PATHINFO_EXTENSION); //pega extensão do arquivo
		$image  = str_replace("catalogo_converte/vitrine_raiz/","",$images);
		$image1 = explode("_",$image);

		$string = substr($image, -6);#separa os arquivos que tem finalizador correto _1, _2, _3, _4, _5 e _6 (já gravados OK)

		$string_ini = substr($image,0,6);#retorna 6 primeiros caracteres do nome do arquivo que é referente ao código do produto
		print $string_ini."<br>";

		  if($string != '_1.jpg' and $string != '_2.jpg' and $string != '_3.jpg' and $string != '_4.jpg' and $string != '_5.jpg' and $string != '_6.jpg'):

			$query  = "select * from ti_produtos where ds_imagem2 ='' and ds_imagem3 ='' and cd_produto ='".$image1[0]."'";
			$result = mysql_query($query);
			$numr   = mysql_num_rows($result);
				while($row = mysql_fetch_object($result)):

				$c = 1;
				$n = 7;

					while($c < $n):

					#conta quantas imagens existe por código
					$codigos = array();
					$codigos[$string_ini]++;

					if(!isset($codigos[$string_ini])) {
						$codigos[$string_ini] = 1;
					} else {
						$codigos[$string_ini]++;
					}

					foreach($codigos AS $codigo => $quantidade) {
						printf('%s possui %d registro(s) <br />' , $codigo , $quantidade);
					}
					#fim de conta quantas imagens existe por código

						$image_n = $row->cd_produto."_".$c.".".$ext;
						$image_1 = "vitrine/".$row->cd_produto."_".$c.".".$ext."";
								
						$origem  = "catalogo_converte/vitrine_raiz/".$image;
						$destino = $image_1;
						//copy($origem, $destino);

						$query1 = "update ti_produtos set ds_imagem".$c."='$image_n' where cd_produto ='$row->cd_produto'";
						//mysql_query($query1) or die(mysql_error());	
						//print $query1." - ".$c."<br>";

					$c++;
					endwhile;

				endwhile;
		
		endif;

	}
	#fim de grava imagem por código



endif;

 

Está retornando assim:

 

606103
606103
606103
606103
606103
606103
606080
606080
606080
605953
605953
605946
605946
605878
605878 possui 2 registro(s)
605878 possui 2 registro(s)
605878 possui 2 registro(s)
605878 possui 2 registro(s)
605878 possui 2 registro(s)
605878 possui 2 registro(s)
605861
605861 possui 2 registro(s)
605861 possui 2 registro(s)
605861 possui 2 registro(s)
605861 possui 2 registro(s)
605861 possui 2 registro(s)
605861 possui 2 registro(s)
602983
602983
602976
602976

Compartilhar este post


Link para o post
Compartilhar em outros sites

Coloque o código de impressão após este comentário:

#fim de grava imagem por código


A variável códigos

$codigos = array();

deve ir lá em cima, antes do comentário:

#grava imagem por código

 

Acho que seria isso, estou sem muito tempo de analisar tudo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Galera HELP.

 

Estou listando os arquivos de uma pasta da seguinte forma:

 

foreach($file as $images)
{
 $ext    = pathinfo($images, PATHINFO_EXTENSION); //pega extensão do arquivo
 $image  = str_replace("catalogo_converte/vitrine_raiz/","",$images);
 $image1 = explode("_",$image);
 print "imagem: ".$image1[0]."<br>";
}

 

Retorna a lista:

 

imagem: 606103
imagem: 606103
imagem: 606103
imagem: 606103
imagem: 606103
imagem: 606103
imagem: 606080
imagem: 606080
imagem: 606080
imagem: 605953
imagem: 605953
imagem: 605946
imagem: 605946
imagem: 605878
imagem: 605861
imagem: 602983

Preciso contar quantas vezes aparece o mesmo código, exemplo:

 

imagem: 606103 6 vezes

imagem: 606080 3 vezes

e assim por diante

 

Alguém pode ajudar????

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nomes dos arquivos de teste (para definir um padrão para a ER)

606105_02.jpg
606103_02.png
606103_03.gif
606104_01.bmp
606104_01.jpg

 

Script que faz a mágica :yay:

<?php

$pictures = glob( '{*.jpg,*.bmp,*.gif,*.png}', GLOB_BRACE );
$codes    = preg_replace( '/_.+$/', null, $pictures );
$codes    = array_count_values( $codes );

var_dump( $codes );

?>

 

Saída

array (size=3)
  606103 => int 2
  606104 => int 2
  606105 => int 1

 

:thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Carlos Coelho,

Tenho uma lista de arquivos com sequência iguais a que mandou no exemplo. .essas eu consigo carregar na boa.

O problema são com as imagens que não tem essa sequência, pois preciso gravar as imagens disponíveis para cada produto.

Tá triste viu rsrsrsrs

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema são com as imagens que não tem essa sequência

 

Dê exemplos da nomenclatura destas imagens, para que possamos montar uma ER que atenda a este padrão diferenciado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Carlos Coelho, segue exemplos:

 

Produto 587785
587785_587785_47LV3700_site.jpg
587785_587785_47LV3700_2site.jpg
587785_587785_47LV3700_3site.jpg
587785_587785_47LV3700_4site.jpg

 

Produto 557450
557450_557450_1143 aberto_site.jpg
557450_557470_fechado_site.jpg

 

Produto 289078
289078_289078 parte01.jpg
289078_289078 parte02.jpg

 

Os que estão com padrão _1, _2 e _3 no final, consigo carregar e incluir no banco de dados certinho, sendo _1 a imagem principal e assim por diante.

 

Produto 254649
254649_254649_1.jpg
254649_254649_2.jpg

 

Estou retornando os 6 primeiros dígitos de cada imagem da seguinte forma:

$pasta  = "catalogo_converte/vitrine_raiz";
$imagem = glob("$pasta/{*.jpg,*.gif,*.png,*.bmp}",GLOB_BRACE);

$file = array();

foreach($file as $images)
{
 $ext    = pathinfo($images, PATHINFO_EXTENSION); //pega extensão do arquivo
 $image  = str_replace("catalogo_converte/vitrine_raiz/","",$images);
  
 #retorna 6 primeiros dígitos que equivalem ao código do produto
 $image1 = explode("_",$image);
 print "produto: ".$image1[0]."<br>";
}

 

Retorna:

587785
587785
587785
587785
557450
557450
289078
289078
254649
254649


Preciso gravar as imagens nos campos dependendo da quantidade de imagens da pasta, assim:


Produto 587785, grava até a imagem 4;
ti_produtos.ds_imagem1='587785_587785_47LV3700_site.jpg' where cd_produto='587785'
ti_produtos.ds_imagem2='587785_587785_47LV3700_2site.jpg' where cd_produto='587785'
ti_produtos.ds_imagem3='587785_587785_47LV3700_3site.jpg' where cd_produto='587785'
ti_produtos.ds_imagem4='587785_587785_47LV3700_4site.jpg' where cd_produto='587785'


Produto 557450, grava até a imagem 2;
ti_produtos.ds_imagem1='557450_557450_1143 aberto_site.jpg' where cd_produto='557450'
ti_produtos.ds_imagem2='557450_557470_fechado_site.jpg' where cd_produto='557450'


Sem contar que ainda tenho que renomear as imagens rsrs e jogar em outra pasta, assim:


587785_587785_47LV3700_site.jpg >> 587785_1.jpg
587785_587785_47LV3700_2site.jpg >> 587785_2.jpg
587785_587785_47LV3700_3site.jpg >> 587785_3.jpg
587785_587785_47LV3700_4site.jpg >> 587785_4.jpg


Trampo rsrs
Dani

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deu para perceber que sua modelagem do banco de dados não é a correta, lei sobre normalização de dados

 

Devido a este fato, não tem como resolver seu problema sem complicar um pouco.

 

<?php

$pictures = array(
	'587785_587785_47LV3700_site.jpg',
	'587785_587785_47LV3700_2site.jpg',
	'587785_587785_47LV3700_3site.jpg',
	'587785_587785_47LV3700_4site.jpg',
	'557450_557450_1143 aberto_site.jpg',
	'557450_557470_fechado_site.jpg',
	'289078_289078 parte01.jpg',
	'289078_289078 parte02.jpg',
	'254649_254649_1.jpg',
	'254649_254649_2.jpg'
);

$result = array( );

array_walk( 
	$pictures,
	function( &$picture ) use( &$result )
	{
		static $image;
		$code      = substr( $picture, 0, 6 );
		$extension = explode( '.', $picture );
		$extension = end( $extension );	
		$old_name  = $picture;
		$picture   = array( );
		$new_name  = sprintf( '%s_1.%s', $code, $extension );
		$image[ $code ] [ 'name' ] = $new_name;
		$picture[ 'new_name' ] = $image[ $code ] [ 'name' ];
		$picture[ 'old_name' ] = $old_name;
		$picture[ 'code' ] = $code;
		
		if( in_array( $image[ $code ] [ 'name' ], $result ) )
		{
			$new_name  = sprintf( '%s_%u.%s', $code, ++$image[ $code ] [ 'counter' ], $extension );
			$picture[ 'new_name' ] = $new_name;
			$result[ ] = $new_name;
		}
		else
		{
			$result[ ] = $image[ $code ] [ 'name' ];
			$image[ $code ] [ 'counter' ] = 1;
		}
		
		$picture[ 'sql' ]  = sprintf( 'ti_produtos.ds_imagem%u = "%s" WHERE cd_produto = "%s"', $image[ $code ] [ 'counter' ], $old_name, $code );
	}
);

var_dump( $pictures );

?>

 

Isso vai lhe retornar um array com as informações que vc necessita juntamente com parte do SQL montada.

 

 


array
  0 => 
    array
      'new_name' => string '587785_1.jpg' (length=12)
      'old_name' => string '587785_587785_47LV3700_site.jpg' (length=31)
      'code' => string '587785' (length=6)
      'sql' => string 'ti_produtos.ds_imagem1 = "587785_587785_47LV3700_site.jpg" WHERE cd_produto = "587785"' (length=86)
  1 => 
    array
      'new_name' => string '587785_2.jpg' (length=12)
      'old_name' => string '587785_587785_47LV3700_2site.jpg' (length=32)
      'code' => string '587785' (length=6)
      'sql' => string 'ti_produtos.ds_imagem2 = "587785_587785_47LV3700_2site.jpg" WHERE cd_produto = "587785"' (length=87)
  2 => 
    array
      'new_name' => string '587785_3.jpg' (length=12)
      'old_name' => string '587785_587785_47LV3700_3site.jpg' (length=32)
      'code' => string '587785' (length=6)
      'sql' => string 'ti_produtos.ds_imagem3 = "587785_587785_47LV3700_3site.jpg" WHERE cd_produto = "587785"' (length=87)
  3 => 
    array
      'new_name' => string '587785_4.jpg' (length=12)
      'old_name' => string '587785_587785_47LV3700_4site.jpg' (length=32)
      'code' => string '587785' (length=6)
      'sql' => string 'ti_produtos.ds_imagem4 = "587785_587785_47LV3700_4site.jpg" WHERE cd_produto = "587785"' (length=87)
  4 => 
    array
      'new_name' => string '557450_1.jpg' (length=12)
      'old_name' => string '557450_557450_1143 aberto_site.jpg' (length=34)
      'code' => string '557450' (length=6)
      'sql' => string 'ti_produtos.ds_imagem1 = "557450_557450_1143 aberto_site.jpg" WHERE cd_produto = "557450"' (length=89)
  5 => 
    array
      'new_name' => string '557450_2.jpg' (length=12)
      'old_name' => string '557450_557470_fechado_site.jpg' (length=30)
      'code' => string '557450' (length=6)
      'sql' => string 'ti_produtos.ds_imagem2 = "557450_557470_fechado_site.jpg" WHERE cd_produto = "557450"' (length=85)
  6 => 
    array
      'new_name' => string '289078_1.jpg' (length=12)
      'old_name' => string '289078_289078 parte01.jpg' (length=25)
      'code' => string '289078' (length=6)
      'sql' => string 'ti_produtos.ds_imagem1 = "289078_289078 parte01.jpg" WHERE cd_produto = "289078"' (length=80)
  7 => 
    array
      'new_name' => string '289078_2.jpg' (length=12)
      'old_name' => string '289078_289078 parte02.jpg' (length=25)
      'code' => string '289078' (length=6)
      'sql' => string 'ti_produtos.ds_imagem2 = "289078_289078 parte02.jpg" WHERE cd_produto = "289078"' (length=80)
  8 => 
    array
      'new_name' => string '254649_1.jpg' (length=12)
      'old_name' => string '254649_254649_1.jpg' (length=19)
      'code' => string '254649' (length=6)
      'sql' => string 'ti_produtos.ds_imagem1 = "254649_254649_1.jpg" WHERE cd_produto = "254649"' (length=74)
  9 => 
    array
      'new_name' => string '254649_2.jpg' (length=12)
      'old_name' => string '254649_254649_2.jpg' (length=19)
      'code' => string '254649' (length=6)
      'sql' => string 'ti_produtos.ds_imagem2 = "254649_254649_2.jpg" WHERE cd_produto = "254649"' (length=74)

 

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

É apenas incompatibilidade devido as sua versão ser inferior.

 

apenas crie a função separadamente.

$result = array( );

function my_func( &$picture, $key, &$result )
{
	static $image;
	$code      = substr( $picture, 0, 6 );
	$extension = explode( '.', $picture );
	$extension = end( $extension );	
	$old_name  = $picture;
	$picture   = array( );
	$new_name  = sprintf( '%s_1.%s', $code, $extension );
	$image[ $code ] [ 'name' ] = $new_name;
	$picture[ 'new_name' ] = $image[ $code ] [ 'name' ];
	$picture[ 'old_name' ] = $old_name;
	$picture[ 'code' ] = $code;
	
	if( in_array( $image[ $code ] [ 'name' ], $result ) )
	{
		$new_name  = sprintf( '%s_%u.%s', $code, ++$image[ $code ] [ 'counter' ], $extension );
		$picture[ 'new_name' ] = $new_name;
		$result[ ] = $new_name;
	}
	else
	{
		$result[ ] = $image[ $code ] [ 'name' ];
		$image[ $code ] [ 'counter' ] = 1;
	}
	
	$picture[ 'sql' ]  = sprintf( 'ti_produtos.ds_imagem%u = "%s" WHERE cd_produto = "%s"', $image[ $code ] [ 'counter' ], $old_name, $code );
}
	
array_walk( $pictures, 'my_func', $result );

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.