Ir para conteúdo

POWERED BY:

Arquivado

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

jcalebe

[Resolvido] Ordenar array

Recommended Posts

Olá pessoal!

Hoje eu fiz um sistema gigante de leitura de mp3 e estou me pegando com isso.

O PHP faz a leeitura de uma pasta com o readdir() e cria um Array que tem os dados fora da ordem que quero. Mandei um print_r(), vejam:

 

Array
(
   [0] => 08-01-2011.mp3
   [1] => 29-01-2011.mp3
   [2] => 02-03-2011.mp3
   [3] => 09-02-2011.mp3
   [4] => 15-01-2011.mp3
   [5] => 23-02-2011.mp3
   [6] => .
   [7] => 22-01-2011.mp3
   [8] => 09-03-2011.mp3
   [9] => 19-01-2011.mp3
   [10] => 12-01-2011.mp3
   [11] => 26-02-2011.mp3
   [12] => ..
   [13] => 19-02-2011.mp3
   [14] => 05-01-2011.mp3
   [15] => 05-03-2011.mp3
   [16] => 05-02-2011.mp3
   [17] => 01-01-2011.mp3
   [18] => index.php
   [19] => 26-01-2011.mp3
   [20] => 02-02-2011.mp3
   [21] => 12-02-2011.mp3
)

 

Está com as datas bagunçadas, era pra ficar assim:

Array
(
   [0] => 01-01-2011.mp3
   [1] => 12-01-2011.mp3
   [2] => 23-01-2011.mp3
   [3] => 09-02-2011.mp3
   [4] => 15-02-2011.mp3
   [5] => 23-02-2011.mp3
...
)

 

Já tentei um sort() mas não funciona.

Obrigado. :closedeyes:

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Kratos, não sei se estou fazendo errado, mas array_multisort() não resolveu. Ficou semelhante ao resultado da função sort().

 

Valeu! B)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi!

 

Como o seu problema ai, pelo que percebi, e ordenar as datas dos arquivos de audio, a solucao seria voce usar o formato americano pra estas datas.

Ou seja, ao inves de gravar os arquivos no formato de data local 12/01/2011 (no caso 12-01-2011), use 2011-01-12 (formato americano), assim voce conseguira ordenar corretamente com sort() e afins.

 

Se voce nao puder mudar a nomenclatura dos arquivos ou isto for dar muito trabalho, poderia criar um segundo array com os dados do readdir() e usar array_reverve() que, no contexo do seu script, vai inverter as datas (tipo, seu 12-01-2011 vai virar 2011-01-12, reverso) e usar este array como novo indice para os arquivo reais.

 

Claro que vai ter de estudar um forma de mesclar, um foreach pode resolver, os dados reais com o indice ordenado, dai e so ordenar. Isto e so uma sugestao...

 

Espero que tenha entendido o meu raciocinio e se precisar de ajuda, poste ai.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dá um var_export() no seu array e posta.

Ela é similar a var_dump() com uma exceção: a representação retornada é um código PHP válido.

Assim dá pra fazer alguns testes em cima.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

@Kratos Zohr: Sim, tentei essas constantes, mas acho que fiz algo errado pois como já disse, não funfou;

 

@InterPlanet: Não posso inverter os nomes dos arquivos, mas dá pra implementar array_reverse() no foreach existente em teoria. Como eu faria isto?

 

@Kratos Zohr: O var_export() retornou

array (
 0 => '08-01-2011.mp3',
 1 => '29-01-2011.mp3',
 2 => '02-03-2011.mp3',
 3 => '09-02-2011.mp3',
 4 => '15-01-2011.mp3',
 5 => '23-02-2011.mp3',
 6 => '.',
 7 => '22-01-2011.mp3',
 8 => '09-03-2011.mp3',
 9 => '19-01-2011.mp3',
 10 => '12-01-2011.mp3',
 11 => '26-02-2011.mp3',
 12 => '..',
 13 => '19-02-2011.mp3',
 14 => '05-01-2011.mp3',
 15 => '05-03-2011.mp3',
 16 => '05-02-2011.mp3',
 17 => '01-01-2011.mp3',
 18 => 'index.php',
 19 => '26-01-2011.mp3',
 20 => '02-02-2011.mp3',
 21 => '12-02-2011.mp3',
)

 

só que esse array é reescrito em outro foreach, que tira o '.mp3' dos nomes, remove '.' , '..' e 'index.php' além de "jogar" o valor do array para o índice, e o valor fica em branco.

 

Mas o array que deve ser reordenado é esse mesmo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

@InterPlanet: Não posso inverter os nomes dos arquivos, mas dá pra implementar array_reverse() no foreach existente em teoria. Como eu faria isto? Não seria melhor usar strrev()?

 

só que esse array é reescrito em outro foreach, que tira o '.mp3' dos nomes, remove '.' , '..' e 'index.php' além de "jogar" o valor do array para o índice, e o valor fica em branco.

 

Mas o array que deve ser reordenado é esse mesmo.

 

O problema de usar strrev() e que teria de fazer dentro de um outro foreach, sugeri array_reverse() porque o reverso seria feito em todo o array pois voce nao adiantou que ja existia uma "limpeza" do seu array original. Contudo, aproveitando a novidade vou adaptar um exemplo, edito ja este post com o codigo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

só estou com esses problemas hoje por preguiça de fazer uma automação no sistema quando o criei. Hoje que não dá mais pra fazer do jeito antigo, tive que atualizar tudo.

 

Esse sistema lê todos os mp3 de uma pasta, cria uma tabela com links para uma outra página que tem um player. A outra página faz a leitura de alguns dados do mp3 como tamanho, duração, taxa de bits e algumas id3 tags.

 

Sugiro a quem está começando um projeto: NÃO SEJA PREGUIÇOSO, POIS VOCÊ PODE TER MAIS TRABALHO DEPOIS!!!

:joia:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Huhauahhuhuaua!

 

Olha brother:

 

<?php
// ARARY ORIGINAL
$aOriginal = array (
 0 => '08-01-2011.mp3',
 1 => '29-01-2011.mp3',
 2 => '02-03-2011.mp3',
 3 => '09-02-2011.mp3',
 4 => '15-01-2011.mp3',
 5 => '23-02-2011.mp3',
 6 => '.',
 7 => '22-01-2011.mp3',
 8 => '09-03-2011.mp3',
 9 => '19-01-2011.mp3',
 10 => '12-01-2011.mp3',
 11 => '26-02-2011.mp3',
 12 => '..',
 13 => '19-02-2011.mp3',
 14 => '05-01-2011.mp3',
 15 => '05-03-2011.mp3',
 16 => '05-02-2011.mp3',
 17 => '01-01-2011.mp3',
 18 => 'index.php',
 19 => '26-01-2011.mp3',
 20 => '02-02-2011.mp3',
 21 => '12-02-2011.mp3',
);

// ARRAY LIMPO
$aLimpo            = Array();

// ER - Expressao Regular pra pegar o conteudo que interessa do array
$RegExp            = '/^([0-9]{2})(.)+$/'; // A string tem que comecar com dois numeros e quaisquer caracteres depois

Foreach($aOriginal as $Chave => $Arquivo)
{ // Aplicacao da ER
 If (preg_match($RegExp, $Arquivo))
    { $Valor      = substr($Arquivo, 0, strrpos($Arquivo, '.')); // isola do . em diante
      $Valor      = array_reverse(explode('-', $Valor)); // Separa a data pelo - e reverte
      $Valor      = implode('-', $Valor); // junta novamente com o - como separador
      $aLimpo[]   = $Valor;
    }
}

// Ordena como string
sort($aLimpo, SORT_STRING);

// print
Echo '<pre>';
print_r($aLimpo);
Echo '</pre>';
?>

Adapta ai! A saida foi:

 

Array
(
   [0] => 2011-01-01
   [1] => 2011-01-05
   [2] => 2011-01-08
   [3] => 2011-01-12
   [4] => 2011-01-15
   [5] => 2011-01-19
   [6] => 2011-01-22
   [7] => 2011-01-26
   [8] => 2011-01-29
   [9] => 2011-02-02
   [10] => 2011-02-05
   [11] => 2011-02-09
   [12] => 2011-02-12
   [13] => 2011-02-19
   [14] => 2011-02-23
   [15] => 2011-02-26
   [16] => 2011-03-02
   [17] => 2011-03-05
   [18] => 2011-03-09
)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beleza! Obrigado pela ajuda!

Só mais uma coisa: Essa array precisa ter a data na ordem inicial (dd-mm-aaaa) pra meu código funcionar. Como a transformo novamente?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beleza! Obrigado pela ajuda!

Só mais uma coisa: Essa array precisa ter a data na ordem inicial (dd-mm-aaaa) pra meu código funcionar. Como a transformo novamente?

 

Entendo, pra destranformar a data para o formato BR denovo faz o reverso novamente, algo assim, usando o registro 10 do array limpo:

 

$Valor        = $aLimpo[10];
$Valor        = array_reverse(explode('-', $Valor)); // Separa a data pelo - e reverte
$Valor        = implode('-', $Valor); // junta novamente com o - como separador

Echo $Valor;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui! Obrigado pessoal!

 

Fiz uma alteração interessante, aproveitei a dica do @Kratos Zohr e usei o array_multisort() pois ele me permite adicionar duas constantes. O sort() só permite uma.

 

Veja:

//troquei este
sort($aLimpo, SORT_STRING);

//por este
array_multisort($aLimpo, SORT_STRING, SORT_DESC);

 

Tudo funcionando nos conformes, e até rápido para a quantidade de loops cheios de funções. B)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui! Obrigado pessoal!

 

Fiz uma alteração interessante, aproveitei a dica do @Kratos Zohr e usei o array_multisort() pois ele me permite adicionar duas constantes. O sort() só permite uma.

 

Veja:

//troquei este
sort($aLimpo, SORT_STRING);

//por este
array_multisort($aLimpo, SORT_STRING, SORT_DESC);

 

Tudo funcionando nos conformes, e até rápido para a quantidade de loops cheios de funções. B)

 

Show brother!

Esse e o espirito, compartilhar, aprender e aperfeicoar (sempre)!

Abraço e boa sorte!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cheguei atrasado, mas ainda tá valendo né ? :D

<?php
$array = array (
 0 => '08-01-2011.mp3',
 1 => '29-01-2011.mp3',
 2 => '02-03-2011.mp3',
 3 => '09-02-2011.mp3',
 4 => '15-01-2011.mp3',
 5 => '23-02-2011.mp3',
 6 => '.',
 7 => '22-01-2011.mp3',
 8 => '09-03-2011.mp3',
 9 => '19-01-2011.mp3',
 10 => '12-01-2011.mp3',
 11 => '26-02-2011.mp3',
 12 => '..',
 13 => '19-02-2011.mp3',
 14 => '05-01-2011.mp3',
 15 => '05-03-2011.mp3',
 16 => '05-02-2011.mp3',
 17 => '01-01-2011.mp3',
 18 => 'index.php',
 19 => '26-01-2011.mp3',
 20 => '02-02-2011.mp3',
 21 => '12-02-2011.mp3'
);
array_walk($array,
function(&$value)
{
	$value =(stristr($value, '.mp3') !== FALSE)? implode('-',array_reverse(explode('-',substr($value,0,-4)))): null;
});
$array = array_filter($array);	
array_multisort($array,SORT_ASC);
array_walk($array,
function(&$value)
{
	$value = implode('-',array_reverse(explode('-',$value))).'.mp3';
});
var_dump($array);
?>

 

A saída foi

array
 0 => string '01-01-2011.mp3' (length=14)
 1 => string '05-01-2011.mp3' (length=14)
 2 => string '08-01-2011.mp3' (length=14)
 3 => string '12-01-2011.mp3' (length=14)
 4 => string '15-01-2011.mp3' (length=14)
 5 => string '19-01-2011.mp3' (length=14)
 6 => string '22-01-2011.mp3' (length=14)
 7 => string '26-01-2011.mp3' (length=14)
 8 => string '29-01-2011.mp3' (length=14)
 9 => string '02-02-2011.mp3' (length=14)
 10 => string '05-02-2011.mp3' (length=14)
 11 => string '09-02-2011.mp3' (length=14)
 12 => string '12-02-2011.mp3' (length=14)
 13 => string '19-02-2011.mp3' (length=14)
 14 => string '23-02-2011.mp3' (length=14)
 15 => string '26-02-2011.mp3' (length=14)
 16 => string '02-03-2011.mp3' (length=14)
 17 => string '05-03-2011.mp3' (length=14)
 18 => string '09-03-2011.mp3' (length=14)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu @Kratos Zohr pelo esforço, mas eu já resolvi adaptando o código do @InterPlanet.

 

Flw brother! :thumbsup:

 

:ninja:

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.