Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
E ai pessoal beleza.
Estou com a seguinte dúvida, vi que o PHP ordena os números de 1 a 10 por exemplo normalmente, mas caso for de 1 a 11 ele vai numerar:
1,11,2,3,4 ...
Gostaria de saber como fazer pra ele ordenar corretamente, ou seja, 1,2,3,4,5,6,7,8,9,10,11.
Desde de já agradeço a atenção.
>
(previsao mode=on) Os dados a serem ordenados no seu banco de dados são de que tipo? CHAR, VARCHAR, INT, DATE... ??
Lembre-se que se for ordenar uma coluna CHAR, VARCHAR, ela será ordenada alfabeticamente. Ou seja, 11 vem antes de 2, por exemplo.
Na realidade não tem haver com banco de dados, seguinte.
Eu to 'tentando' pegar os nomes de imagens de um diretorio, ex.: imagem_1, imagem_2...
Ate ai tudo bem, ate a imagem_10 não tenho problemas.
Então tenho um while para fazer a contagem de qual vai ser o proximo numero, nesse while dou um explode no nome da imagem, o que me retorna somente o numero.
Ai é que vem meu problema, pois como ele ta ordenando os numeros assim: 1,11,2,3,4...
quando a imagem é salva ele substitui a imagem_2, quando deveria criar a imagem_12.
Abaixo segue o código com o meu while:
$i = 0;
$condicao = false;
while ($item = readdir($pasta)) {
if ($item != "." && $item != "..") {
$nome = basename($item, '.' . $ext);
$contagem = explode("_", $nome);
if ($i > $contagem[1] || $i != $contagem[1]) {
$this->NewName = "imagem_" . $i . "." . $ext;
$condicao = true;
break;
} else {
$i++;
$condicao = false;
}
}
}mas isso é porque o nome está sendo tratado como texto então o 11 vem antes do 2 mesmo
precisará formatar os números para evitar isso com inclusão de zeros a esquerda para os números teremos a mesma quantidade de caracteres
Saudações!
Uma idéia:
Separe esse processo em duas partes:
1) Monte um array indexado numericamente com os arquivos e ordene
2) Foreach no array pra rodar o processo na ordem correta
Olha:
While ($item = readdir($pasta))
{ if ($item != "." && $item != "..")
{ $nome = basename($item, '.' . $ext);
$contagem = explode("_", $nome);
// NOVO ARRAY
$Arquivos[$contagem[1]] = $nome;
}
}
// Ordenacao
sort($Arquivos, SORT_NUMERIC);
// Execucao ordenada
$i = 1;
Foreach ($Arquivos as $nome)
{ $contagem = explode("_", $nome);
if ($i > $contagem[1] || $i != $contagem[1])
{ $this->NewName = "imagem_" . $i . "." . $ext;
$condicao = true;
break;
}
else { $i++;
$condicao = false;
}
}InterPlanet, valeu pela dica, fiz poucas alterações no código que me passou mas agora ta funcionando certinho, segue abaixo:
While ($item = readdir($pasta)) {
if ($item != "." && $item != "..") {
$nome = basename($item, '.' . $ext);
$contagem = explode("_", $nome);
// NOVO ARRAY
$Arquivos[] = $contagem[1];
}
}
// Ordenacao
sort($Arquivos, SORT_NUMERIC);
// Execucao ordenada
$i = 0;
Foreach ($Arquivos as $contagem) {
if ($i > $contagem || $i != $contagem) {
$this->NewName = "imagem_" . $i . "." . $ext;
$condicao = true;
break;
} else {
$i++;
$condicao = false;
}
}
Mário, me diga uma coisa se possivel, qual seria a forma mais correta de formatar os numeros adicionando zeros a esquerda?
Agradeço a atenção de todos..
Abrass
>
Mário, me diga uma coisa se possivel, qual seria a forma mais correta de formatar os numeros adicionando zeros a esquerda?
Agradeço a atenção de todos..
Abrass
Não sou o @Mario Monteiro, hehe, mas, creioq ue seja sim a melhor opção. Se usar db com codigos numericos isto pode ser feito automaticamente atraves do atributo UNSIGNED ZEROFILL ao campo. Pra ajudar, função pra gerar os zeros a esquerda:
/ CODIGO /
Function Geral_FormataCodigo($Codigo = 0, $Digitos = 5)
{
$Tamanho = strlen(strval($Codigo));
$RT = $Codigo;
for ($i = $Tamanho; $i < $Digitos; $i++)
{ $RT = '0'.$RT; }
Return $RT;
}
// USO
$i = 27;
$i = Geral_FormataCodigo($i);Foi mal Inter, a pergunta era para o Mário mesmo, mas agora que li soou estranho mesmo..hehe
Bom, valeu pelas respostas, agora é so estudar tudo que me passou..
Abrass
printf() faz isso para você:
printf( '%03d', 7 );// imprime 007
sprintf() retorna o valor em vez de imprimir na tela
>
printf() faz isso para você:
printf( '%03d', 7 );// imprime 007
sprintf() retorna o valor em vez de imprimir na tela
Boa, mais uma pra minha coleção! Vlw @Beraldo.
Legal, vlw pela diga Beraldo..
(previsao mode=on) Os dados a serem ordenados no seu banco de dados são de que tipo? CHAR, VARCHAR, INT, DATE... ??
Lembre-se que se for ordenar uma coluna CHAR, VARCHAR, ela será ordenada alfabeticamente. Ou seja, 11 vem antes de 2, por exemplo.