2012-07-23 6 views
7

Hace poco estuve trabajando en uno de los conjuntos de problemas de euler del proyecto y encontré este extraño problema. He resuelto el problema correctamente con la primera solución, pero no sé por qué la otra versión no funciona como se esperaba.Problema de clasificación de PHP, arsort vs asort + array_reverse

Este es el código que funciona:

asort($card_count, SORT_NUMERIC); 
$card_count = array_reverse($card_count, true); 

Y aquí está el código que no es así:

arsort($card_count, SORT_NUMERIC); 

Ésta es la única línea que cambio y hace una gran diferencia en el final resultado. ¿Alguna idea qué pasa con esto?

+1

¿Cómo está leyendo la matriz más adelante? ¿Qué índices está utilizando? – ametren

+1

Ambas son iguales para mí: http://codepad.org/80bWvlTv –

+0

Es una solución de póker, así que básicamente está mapeando el valor de la carta en la llave (como '2' o 'A', o 'J ') a cuántas veces apareció en la entrada, por lo que puede verse así [' A '=> 2,' 8 '=> 2,' 4 '=> 1] para representar dos ases, dos ochos y uno cuatro . Confío en el hecho de que las cantidades más altas deben estar en la parte delantera y las cantidades más bajas en la parte posterior. Si es necesario, puedo publicar una solución de código completo, pero no quiero dar la respuesta porque sé que está en contra de la política de PE. –

Respuesta

4

El problema surge cuando se ordenan los valores iguales en la matriz. Tome la matriz:

$arr = array(
    'a' => 1, 
    'b' => 1, 
    'c' => 1, 
    'd' => 1 
); 

Calling asort($arr, SORT_NUMERIC) en esta matriz se revertir la matriz. Por lo tanto, las líneas de código:

asort($arr, SORT_NUMERIC); 
$arr = array_reverse($arr, true); 

pondrán la matriz de nuevo en el orden original .

Por lo tanto, la adición de un valor que es mayor con el cambio de la matriz como por ejemplo:

$arr = array(
    'a' => 1, 
    'b' => 1, 
    'c' => 2, 
    'd' => 1 
); 

asort($arr, SORT_NUMERIC); 
$arr = array_reverse($arr, true); 

se yeild:

Array 
(
    [c] => 2 
    [a] => 1 
    [b] => 1 
    [d] => 1 
) 

mientras

arsort($arr, SORT_NUMERIC); 

se yeild:

Array 
(
    [c] => 2 
    [d] => 1 
    [b] => 1 
    [a] => 1 
) 

Esperemos que esto arroje algo de luz sobre el problema ...