Foros del Web » Programando para Internet » PHP »

Ordenando array con asort()

Estas en el tema de Ordenando array con asort() en el foro de PHP en Foros del Web. Buen día, Lo que hago es usar asort() para ordenar los valores de un array de forma ascendente, pongo el siguiente ejemplo de cómo lo ...
  #1 (permalink)  
Antiguo 10/05/2006, 16:03
Avatar de hieloverde  
Fecha de Ingreso: julio-2005
Ubicación: México, D.F
Mensajes: 467
Antigüedad: 18 años, 8 meses
Puntos: 5
Ordenando array con asort()

Buen día,

Lo que hago es usar asort() para ordenar los valores de un array de forma ascendente, pongo el siguiente ejemplo de cómo lo hago, se que el array lo puedo declarar mas condensado: ( $array=array(8,13,8... etc ) pero es como ejemplo solamente:

Código PHP:
<?

$array
[0]=8;
$array[1]=13;
$array[2]=8;
$array[3]=5;
$array[4]=5;

arsort($array);

foreach(
$array as $i=>$v)
{
    echo 
'array['.$i.']='.$v.'<br>';
}
?>
La salida que me entrega es asi:

array[4]=5
array[3]=5
array[2]=8
array[0]=8
array[1]=13

Y yo necesito que si hay valores iguales, por ejemplo dos 8, no me los desordene, sino que solamente los suba de posicion, por ejemplo que quedara asi:

array[3]=5
array[4]=5
array[0]=8
array[2]=8
array[1]=13

¿me explico? por que el array puede llegar a contener tanto valores distintos completamente (en cuyo caso no tendria problemas con asort() ) o todos los valores pueden ser iguales, por ejemplo si tengo esto:

array[0]=8
array[1]=8
array[2]=8
array[3]=8
array[4]=8

Usando asort() me entrega esto:

array[4]=8
array[3]=8
array[2]=8
array[1]=8
array[0]=8

Siendo que si todos tiene igual valor, no tiene para que cambiar el orden entonces, ¿como seria para que respete un poco mas el orden? por que noto que asort() comienza a leer el array de abajo hacia arriba, no se probablemente haya una forma de impedir esto ¿?.

Lo que pasa es que los indices tienen mucha importancia en mi script y asi como uso el asort, globalmente los resultados llegan a ser un tanto inesperados .

Bueno, gracias .

Saludos,
__________________
<? echo("1 <script> dice + que 1000 palabras"); ?> EspacioMéxico
  #2 (permalink)  
Antiguo 11/05/2006, 11:11
Avatar de hieloverde  
Fecha de Ingreso: julio-2005
Ubicación: México, D.F
Mensajes: 467
Antigüedad: 18 años, 8 meses
Puntos: 5
Alguna idea?, se me estaba ocurriendo que mejor seria no usar asort() sino programar una pequeña funcion, que sugerencia me dan ¿?

Saludos,
__________________
<? echo("1 <script> dice + que 1000 palabras"); ?> EspacioMéxico
  #3 (permalink)  
Antiguo 11/05/2006, 11:16
Avatar de mauled  
Fecha de Ingreso: marzo-2005
Ubicación: Cd. de México.
Mensajes: 3.001
Antigüedad: 19 años
Puntos: 33
Creo que lo mejor va ser que crees una funcion que vaya recorriendo el arreglo y vaya ordenandolo.

Saludillos.
  #4 (permalink)  
Antiguo 12/05/2006, 12:53
Avatar de hieloverde  
Fecha de Ingreso: julio-2005
Ubicación: México, D.F
Mensajes: 467
Antigüedad: 18 años, 8 meses
Puntos: 5
Pues bien, la función me quedo así, consiste en ordenar por dos factores (el indice y el valor):

Código PHP:
<?
function Prioridad($arreglo)
{
    function 
OrdenarFactores($ar1$ar2)
    {
        if (
$ar1['a']<$ar2['a']) { return -1; }
        else if (
$ar1['a']>$ar2['a']) { return 1; }
        if (
$ar1['b']<$ar2['b']) { return -1; }
        else if (
$ar1['b']>$ar2['b']) { return 1; }
        return 
0;
    }    
        
    foreach(
$arreglo as $i=>$v)
    {
        
$arreglo_factores[$i]=array('a'=>$v,'b'=>$i);
    }
        
    
uasort($arreglo_factores'OrdenarFactores'); 
    unset(
$arreglo);
    foreach(
$arreglo_factores as $i=>$v)
    {
        
$arreglo[$i]=$v['a'];
    }
        
    return 
$arreglo;
}
?>


En el siguiente ejemplo les muestro como usarla:

Código PHP:
<?
/* Array de ejemplo */
$array[0]=8;
$array[1]=8;
$array[2]=2;
$array[3]=10;
 
/* Ordenamos el array por los dos factores usando la funcion 'Prioridad()' */
$array=Prioridad($array); 
   
/* Lo mostramos en pantalla */
foreach($array as $i=>$v)
{
    echo 
'array['.$i.']='.$v.'<br>';
}
?>


El resultado da justamente esto:

array[2]=2
array[0]=8
array[1]=8
array[3]=10


Como podran darse cuenta al encontrar valores iguales simplemente los sube o los baja de posicion pero nunca los invertira como sucede con asort()

Espero que le sirva a alguien mas

Saludos,
__________________
<? echo("1 <script> dice + que 1000 palabras"); ?> EspacioMéxico
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 21:16.