Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

fo_11

Duvida ordenacao de array

Mensagens Recomendadas

fo_11

Tenho de ordenar um array mas não estou a conseguir. Vou perdendo informacao.

Aqui está o código que fiz. A ordenacao é feita por ordem crecente de habitantes.

<html>
<head></head>
<body>

<?php

$cidades=array('Lisboa','Porto','Santarém','Setúbal','Aveiro','Faro','Coimbra','Castelo Branco','Covilhã','Leiria');
$habitantes=array(489563,216080,28900,89303,55291,41307,101069,30649,34700,42745);


echo "<table border='0'>
 <tr>
    <td> <table>  
				<tr align='center'style='font-size:18'><th>Cidades</th><th>NºHabitantes</th></tr>";
					for($i=0;$i<10;$i++)   //escrver a informacao
					  echo "<tr ><td align='center'>$cidades[$i]</td><td align='right'>$habitantes[$i]</td></tr>";
					  
	echo"</table>
	</td>
	<td><table>
				<tr align='center style='font-size:18'><th>Cidades</th><th>Nº Habitantes</th></tr>";
for($i=0;$i<10;$i++)
  for($j=($i+1);$j<10;$j++)
    if($habitantes[$j]<$habitantes[$i])     //ordenação
   {$auxh=$habitamtes[$i];              //efectuar troca
    $auxc=$cidades[$i];
	$habitantes[$i]=$habitantes[$j];
	$cidades[$i]=$cidade[$j];
	$habitantes[$j]=$auxh;
	$cidades[$j]=$auxc;
   }	  
                    for($i=0;$i<10;$i++)
					  echo"<tr><td>$cidades[$i]</td><td>$habitantes[$i]</td></tr>";
		  
		  
	echo"</table>;"
?>
</body>
</html>	

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Battousai

E porque não descomplicar?

$habitantes_cidades = array_combine($habitantes, $cidades);
krsort($habitantes_cidades);


foreach($habitantes_cidades as $habitantes => $cidade){
...
}

Actualizado, esqueci-me que a array é passada por ref.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Battousai

Primeiro combina em forma de array associativa ( array( $chave => $valor ) ), as duas arrays com que começaste. (array_combine)

Depois reordenas a array pelas chaves do maior para o menor. (krsort)

Assim já podes percorrer a array.

Podes clicar nas funções, no código, que te envia para o site do manual de PHP, que explica muito melhor que eu.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fo_11

Já consegui o que pretendia... Obrigado pela ajuda

EDIT:Temos Duas Tabelas uma sem ordenacao outra com ordenacao

<html>
<head></head>
<body>

<?php

$cidades=array('Lisboa','Porto','Santarém','Setúbal','Aveiro','Faro','Coimbra','Castelo Branco','Covilhã','Leiria');
$habitantes=array(489563,216080,28900,89303,55291,41307,101069,30649,34700,42745);


echo "<table border='0'>
 <tr>
    <td> <table>  
				<tr align='center'style='font-size:18'><th>Cidades</th><th>NºHabitantes</th></tr>";
					for($i=0;$i<10;$i++)   //escrver a informacao
					  echo "<tr ><td align='center'>$cidades[$i]</td><td align='right'>$habitantes[$i]</td></tr>";
					  
	echo"</table>
	</td>
	<td><table>
				<tr align='center style='font-size:18'><th>Cidades</th><th>Nº Habitantes</th></tr>";
				$habitantes_cidades = array_combine($habitantes,$cidades);//cria um array em que as $keys são o primeiro array, neste caso $habitantesm, e o segundo funciona como o array $values
				ksort(&$habitantes_cidades);           //ordena o array de forma crescente pelo key
				foreach($habitantes_cidades as $habitantes=>$cidades)   //faz a associacao da chave ao value para podermos escrever no ecrã
					  echo"<tr><td>$cidades</td><td>$habitantes</td></tr>";
		  
		  
	echo"</table>";
?>
</body>
</html>	

PS:Se nos comentários estiverem alguma barbaridade notifica...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fo_11

Surgiu me um novo problema.

Agora quero ordenar  alfabeticamente as cidades mas a funcao que me indicas-te trasforma os array em srtings e inteiros.

Como faço para resolver o problema?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fo_11

Problema resolvido... Utilizei funcoes para ultrapassar o problema.

Daqui a pouco já coloco o código fonte para quem estiver interessado.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fo_11

Objectivo apresentar três tabelas uma deesordenada, uma ordenada por numero de habitantes e outra por ordem alfabetica utilizando o nome das cidades

Aqui está o código para quem estiver a iniciar php e tiver dúvidas:

<html>
<head><title>TABELAS CIDADES/HABITANTES</title></head>
<body>

<?php

$cidades=array('Lisboa','Porto','Santarém','Setúbal','Aveiro','Faro','Coimbra','Castelo Branco','Covilhã','Leiria');
$habitantes=array(489563,216080,28900,89303,55291,41307,101069,30649,34700,42745);


echo "<table border='0' cellpadding='50'>
 <tr>
    <td> <table>  
				<tr align='center' style='font-size:20'><td colspan='2'>ENCONTRA-SE DESORDENADO</td></tr>
				<tr align='center'style='font-size:18'><th>Cidades</th><th>NºHabitantes</th></tr>";
					for($i=0;$i<10;$i++)   //escrever a informacao
					  echo "<tr ><td align='center'>$cidades[$i]</td><td align='right'>$habitantes[$i]</td></tr>";
					  
	echo"</table>
	</td>
	<td><table>
				<tr align='center' style='font-size:20'><td colspan='2'>ORDENADO CRESC. HABITANTES</td></tr>
				<tr align='center'style='font-size:18'><th>Cidades</th><th>Nº Habitantes</th></tr>";
				//temos e devemos usar sempre funçoes para evitar certos problemas
				function ordenarPorhabitantes($habitantes,$cidades){
				$habitantes_cidades = array_combine($habitantes,$cidades);//cria um array em que as $keys são o primeiro array, neste caso $habitantesm, e o segundo funciona como o array $values
				ksort(&$habitantes_cidades);           //ordena o array de forma crescente pelo key
				foreach($habitantes_cidades as $habitantes=>$cidades)   //faz a associacao da chave ao value para podermos escrever no ecrã
					   echo"<tr><td align='center'>$cidades</td><td align='right'>$habitantes</td></tr>";}
				ordenarPorhabitantes($habitantes,$cidades);//aqui é feita a chamada da funcao
		  
		  
	echo"</table>
	</td>
	<td><table>
			    <tr align='center' style='font-size:20'><td colspan='2'> ORDENADO CRESC. CIDADES<td></tr>
				<tr align='center' style='font-size:18'><th>Cidades</th><th>NºHabitantes</th>";

				//a explicação desta funçao é a mesma que a de cima mas o critério de ordenação é diferente 
				function ordenarPorCidade($habitantes,$cidades){
				$cidades_habitantes=array_combine($cidades,$habitantes);
				ksort(&$cidades_habitantes);
				foreach($cidades_habitantes as $cidades=>$habitantes)
				       echo"<tr align='center'><td>$cidades</td><td align='right'>$habitantes</td>";}
				ordenarPorCidade($habitantes,$cidades);
	echo"</table>
	</td>
	</tr></table>";

?>
</body>
</html>			  

Agradeço ao  Battousai pela dica  :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.