Ir para conteúdo

POWERED BY:

Arquivado

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

horacio2009

ordenando um array por data

Recommended Posts

bom dia a todos!!

pessoal...tenho essa array cujos valores são inseridos dentro em um while...

 

 

$dados=array(
"nome" =>$ar['cliente'],
"data" =>$ar['data'],
"CodigoCompra" =>$ar['cod_compra'],
"NovoCodigo" =>$ar['infoNova'],
"modelo" =>$ar['modelo'],
"valor" =>$ar['valor'],
);
$array[]=$dados;
funciona corretamente, porém, eu quero ordenar a exibição dessa array por hora, pela data, hora, pelo nome(dependendo de como o cliente ordenar)....
tem como controlar as ordens dessa array???tentei o ksort, mas, ou eu fiz errado, ou não funciona mesmo com essa função...
enfim...o que podem dizer sobre isso??
Sem mais, obrigado!!!
Horácio

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para usar o array_multisort();

 

1 - Crie uma array "irmã", somente com as datas a partir da primeira

 

foreach ($array as $ar) {
  $irma[] = $ar['data'];
}

 

2 - Ordene a array $array a partir da array $irma

array_multisort($irma, $array);

Compartilhar este post


Link para o post
Compartilhar em outros sites

ola!! então...deu certo!!! muito obrigado!!!
mas testando aqui, eu passei os mesmo dados da "matriz" para a irmã, e consegui posicionamento de acordo com o primeiro valor da array...

fiz assim:

foreach ($novaArray as $ar)

{
$irma[] = array(
"nome" => $ar['nome'],
"CodigoCompra" => $ar['CodigoCompra'],
"modelo" => $ar['modelo'],
"valor" => $ar['valor'],
"NovoCodigo" => $ar['NovoCodigo'],
);
}
array_multisort($irma,SORT_ASC, $novaArray);



agora tá bem fácil de controlar!!
muito obrigado!!!
Horácio

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei não, mas do ponto de vista de uma GUI, uksort() não seria mais adequado?

Também achei estranho... não era para ordenar por cada coluna de cada vez? Pelo que entendi, isso seria algo como um datagrid, mas só com opções de ordenação.

 

Eu até preparei uma resposta pare esse tópico (usando usort) mas desisti de postar depois que vi que a resposta do Massaki foi satisfatória. Outra coisa, esse dados vem de onde? Se vierem de um banco de dados SQL, então faz muito mais sentido usar [inline]ORDER BY[/inline].

 

De qualquer forma, aí vai:

// Array exemplo
$dados = [
  [
    "nome"          => "Fulano",
    "data"          => "2013-06-17",
    "CodigoCompra"  => "5555",
    "NovoCodigo"    => "5555",
    "modelo"        => "Branco",
    "valor"         => 200.44
  ],[
    "nome"          => "Sicrano",
    "data"          => "2013-05-10",
    "CodigoCompra"  => "5533",
    "NovoCodigo"    => "5523",
    "modelo"        => "Cobalto",
    "valor"         => 200.43
  ],[
    "nome"          => "Beltrano",
    "data"          => "2013-04-05",
    "CodigoCompra"  => "5515",
    "NovoCodigo"    => "5522",
    "modelo"        => "Amarelo",
    "valor"         => 200.42
  ]
];


// Array com o nome de todas as colunas ("nome", "data", etc.)
$cols = array_keys($dados[0]);

/*
  Identificando o campo ordenador
*/

// Verificar se há um parametro de URL chamado 'order-by'
// e se o valor desse parametro corresponde a um dos nomes de colunas
if (!isset($_GET['order-by']) or !in_array($_GET['order-by'], $cols)) {
    // Caso contrário, será usada a primeira coluna
    $order = array_keys($dados[0])[0];
} else {
    $order = $_GET['order-by'];
}

// Verificar se a ordem será decrescente (caso contrário, será crescente)
$desc = isset($_GET['desc']);


// Função de ordenação
function cmp($a, $b)
{
    global $order, $desc;

    if ($a[$order] == $b[$order]) {
        return 0;
    }
    return ($a[$order] < $b[$order]) ? ($desc ? 1 : -1) : ($desc ? -1 : 1);
}

// Chamada da funcão usort
usort($dados, "cmp");



// Mostrar o resultados em uma tabela HTML
?>
<table border="1" cellspacing="0" cellpadding="0">
  <tr>
    <?php foreach ($cols as $h) { ?>
    <th><a href="?order-by=<?php echo $h; if ($order == $h and !$desc) { echo "&desc"; } ?>"><?php echo $h; ?> <?php if ($order == $h) { echo $desc ? "↓": "↑"; } ?></a></th>
    <?php } ?>
  </tr>
  <?php foreach ($dados as $lin) { ?> 
  <tr>
    <?php foreach ($lin as $d) { ?>
    <td><?php echo $d; ?></td>
    <?php } ?>
  </tr>
  <?php } ?>
</table>

Compartilhar este post


Link para o post
Compartilhar em outros sites

E só pra enriquecer o teor do tópico, caso esteja rodando a aplicação sob PHP 5.3 ou superior pode, alternativamente, fazer o uso do usort() do mangakah dessa maneira:

usort(
 
    $dados,
 
    function( $a, $b ) use( $order, $desc ) {
 

        if ($a[$order] == $b[$order]) {
            return 0;
        }
 
        return ($a[$order] < $b[$order]) ? ($desc ? 1 : -1) : ($desc ? -1 : 1);

    }
);


Assim evita-se o uso da palavra-chave global :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

É... misturei as coisas. Defini o array usando a sintaxe nova e usei global no lugar de use().

 

Valeu a "enriquecida", Bruno. :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Assim é melhor por ser mais curto, sem precisar criar uma função, mas use() e global são a mesma coisa, muda apenas a sintaxe.

 

Seu chato, com use() fica mais bonito :P

Compartilhar este post


Link para o post
Compartilhar em outros sites

pessoal, em primeiro lugar, muito obrigado a todos pelas respostas!! estou estudando as dicas de todos!!

,mas ainda ficou uma dúvida(boba, admito, mas dúvida é dúvida )...

bom, vamos lá...a função ksort, mme pareceu bem interessante, mas estou na duvida,com relação a função usada no processo...

aí vai:

 

function ordena( $a, $b ) {
    $a = ereg_replace('^(a|an|the) ', '', $a);
    $b = ereg_replace('^(a|an|the) ', '', $ B);
    return strcasecmp($a, $ B);
}
 
$palavras = array("b" =>"Tutorial", "d"=>"Dicas", "a"=>"PHP", "c"=>"Tutorial de PHP");
 
print_r( $palavras );
 
uksort( $palavras, "ordena" ); 
 
print_r( $palavras );
no meu caso, como ficaria a função, presumindo uma ordenação por datas, usando o formato Y-m-d H:i:s?
fiquei perdido, nessa questão da função $ordena...
seria alguma coisa do tipo "data > date("Y-m-d H:i:s")"???

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro você tem que entender a diferença entre usort() / uksort() e sort() / ksort(). Eu sei que pode ter sido apenas um errinho de digitação, mas vale até como curiosidade seja para você, seja para quem vir a ler esse tópico no futuro.

 

O u nos nomes indica que aquela é uma forma de ordenação customizável pelo usuário, através de uma função. Se não tiver o u no nome, você está limitado as opções de ordenação "de fábrica".

 

Já o k indica que a função de comparação, nativa ou customizada, operará nas chaves do array. Se não tiver o k no nome, a operação será feita nos valores.

 

Segundo ponto, não use ereg(). Elas está depreciada e será removida se é que já não foi (não lembro). Use preg_match() em substituição.

 

Terceiro, você experimentou o que o mangakah postou ajustando às suas necessidades? Por esse fragmento de código acima, parece que não.

Compartilhar este post


Link para o post
Compartilhar em outros sites

OFF TOPIC:

 

(Quase) perfeito, Bruno. Só uma ressalva: Creio que "depreciada" não seja uma tradução adequada para "deprecated". A palavra em inglês pode até ter esse sentido, como tem vários outros. No inglês há muito reuso de palavras que tem significados diferentes dependendo do contexto. Mas não há lugar para a palavra da nossa língua "depreciada" no mundo da programação. Uma melhor tradução para "deprecated" e que respeita o contexto é "obsoleta".

Depreciar (v.t.d.): reduzir o valor ou preço de alguma coisa, geralmente de uma mercadoria. Figurado: Desprezar a essência de qualquer coisa, pessoa ou de si próprio; desdenhar.

Engraçado que eu até achei um post sobre isso:

http://blog.michaelnascimento.com.br/2010/10/01/por-que-deprecated-nao-e-depreciado/

Compartilhar este post


Link para o post
Compartilhar em outros sites

É tenso escrever alguma coisa que se apoiem em alguns neologismos estrangeiros.

 

Algumas coisas que eu escrevo de conhecimento inglês passando para o português acabo fazendo meio que pisando em ovos como append, overwritable e até mesmo o próprio deprecated.

 

O deprecated foi mais recente, não lembro onde eu li isso como uma possível tradução e "adotei".

 

Se bem que se a gente lateralizar a definição até caberia no sentido figurado. Quando desprezamos a essência de alguma coisa, consideramos supérfluo ou irrelevante e assim descartamos ou removemos de um contexto.

 

Segundo o artigo outras palavras caberiam melhor na tradução como obsoleto e naõ-aprovado. Mas essas palavras tem tradução própria e eu pelo menos nunca as vi (obsolete e unaproved, respectivamente) em referências de linguagens.

 

Enfim... Podiam padronizar essa parada...

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.