Ordenar valores de array según valor, Ayuda!

Tunnecino

Pues eso, tengo un array en php exactamente de esta estructura (los números varían pero es básicamente así):

Array
(
    [1] => Array
        (
            [2] => 4
        )

[2] => Array
    (
        [6] => 3
    )

[3] => Array
    (
        [4] => 2
    )

[4] => Array
    (
        [3] => 1
    )

)

Y necesito ordenarlos de Mayor a Menor según el Segundo Valor, es decir necesito que quede así:

Array
(

[2] => Array
    (
        [6] => 3
    )

[3] => Array
    (
        [4] => 2
    )

[4] => Array
    (
        [3] => 1
    )

[1] => Array
    (
        [2] => 4
    )

)

He estado probando con los sort array de los manuales de php... pero no consigo hacerlo. ¿Alguna idea?

LOc0

http://www.php.net/manual/en/function.uasort.php


function cmp($a, $b)
{

list($clave1, $valor1)=each($a);

list($clave2, $valor2)=each($b);


  if ($clave1 == $clave2) {
        return 0;
    }
    
return ($clave1 < $clave2) ? -1 : 1; } uasort($tuarray, 'cmp'); print_r($tuarray);

Salu2 ;)

Tunnecino

Loco TE QUIERO!

Para el que necesite algo similar, en http://www.php.net/manual/en/function.uasort.php hay una función para diferentes tipos de ordenaciones:

# MultiSort
# Util para Noticias Relacionadas
function multisort($array)
{
    for($i = 1; $i < func_num_args(); $i += 3)
    {
        $key = func_get_arg($i);

    $order = true;
    if($i + 1 < func_num_args())
        $order = func_get_arg($i + 1);

    $type = 0;
    if($i + 2 < func_num_args())
        $type = func_get_arg($i + 2);

    switch($type)
    {
        case 1: // Case insensitive natural.
            $t = 'strcasenatcmp($a[' . $key . '], $b[' . $key . '])';
            break;
        case 2: // Numeric.
            $t = '$a[' . $key . '] - $b[' . $key . ']';
            break;
        case 3: // Case sensitive string.
            $t = 'strcmp($a[' . $key . '], $b[' . $key . '])';
            break;
        case 4: // Case insensitive string.
            $t = 'strcasecmp($a[' . $key . '], $b[' . $key . '])';
            break;
        default: // Case sensitive natural.
            $t = 'strnatcmp($a[' . $key . '], $b[' . $key . '])';
            break;
    }

    uasort($array, create_function('$a, $b', 'return ' . ($order ? '' : '-') . '(' . $t . ');'));
}

return $array;
}

Yo en mi caso he usado

multisort($ptemp, "'id'", true, 0, "'puntos'", false, 2);

y editado el array para que esté compuesto por 2 campos:

Array
(
    [2] => Array
        (
            [puntos] => 6
            [id] => 3
        )

[3] => Array
    (
        [puntos] => 4
        [id] => 2
    )

[4] => Array
    (
        [puntos] => 3
        [id] => 1
    )

[1] => Array
    (
        [puntos] => 2
        [id] => 4
    )

)

PD: Por si a alguien le entra curiosidad, es para un sistema de noticias relacionadas. Muestra las x noticias que más tengan relación con la que has leído, basándose en puntos.

Usuarios habituales

  • Tunnecino
  • LOc0