jcalebe 0 Denunciar post Postado Março 14, 2011 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
Kakashi_Hatake 267 Denunciar post Postado Março 14, 2011 Cara, dá uma olhada na função array_multisort, talvez isso lhe ajude. ;) Compartilhar este post Link para o post Compartilhar em outros sites
jcalebe 0 Denunciar post Postado Março 15, 2011 @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
Kakashi_Hatake 267 Denunciar post Postado Março 15, 2011 você chegou a testar com as constantes SORT_ASC, SORT_DESC, SORT_REGULAR, SORT_NUMERIC, SORT_STRING ? Compartilhar este post Link para o post Compartilhar em outros sites
InterPlanet 7 Denunciar post Postado Março 15, 2011 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
Kakashi_Hatake 267 Denunciar post Postado Março 15, 2011 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
jcalebe 0 Denunciar post Postado Março 15, 2011 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 7 Denunciar post Postado Março 15, 2011 @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
jcalebe 0 Denunciar post Postado Março 15, 2011 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
InterPlanet 7 Denunciar post Postado Março 15, 2011 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
jcalebe 0 Denunciar post Postado Março 15, 2011 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
InterPlanet 7 Denunciar post Postado Março 15, 2011 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
jcalebe 0 Denunciar post Postado Março 15, 2011 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
InterPlanet 7 Denunciar post Postado Março 15, 2011 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
Kakashi_Hatake 267 Denunciar post Postado Março 15, 2011 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
jcalebe 0 Denunciar post Postado Março 16, 2011 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
Kakashi_Hatake 267 Denunciar post Postado Março 16, 2011 Ok, o importante é que você conseguiu resolver o seu problema Compartilhar este post Link para o post Compartilhar em outros sites