Ir para conteúdo

Arquivado

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

Francispansa

[Resolvido] Ordenar números em ordem crescente

Recommended Posts

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

(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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

(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;
               }
           }
       }

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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;
              }
       }

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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);
Echo $i; // Imprime 00027

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

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.