2012-06-16 21 views
10

Considere la siguiente matriz asociativamulti-especie de matriz asociativa en PHP

$arr = Array 
(  
    [banana] => 2 
    [cherry] => 1 
    [orange] => 3 
    [grapefruit] => 1 
    [apple] => 1 
) 

Quiero a solucionar el problema de una manera que sería similar al término PLSQL: A DESC, B ASC (donde A es el valor y B es la clave) significado:

$arr = Array 
(
    [orange] => 3 
    [banana] => 2 
    [apple] => 1 
    [cherry] => 1 
    [grapefruit] => 1   
) 

modo que naranja y plátano son primero por el valor, pero luego tengo manzana, cereza y pomelo en orden alfabético, ya que tienen el mismo valor.

lo que he intentado:
1. ksort() para correr y luego asort()/rsort() la esperanza de que el segundo tipo se topará en naranja y plátano para el comienzo de la matriz sin alterar la clasificación alfabética de los otros 3 artículos . Estaba equivocado. lo estropea todo. Así que eché un vistazo:
2. sort functions y array_multisort(). Pero aparentemente ordena varias matrices a la vez, o una matriz multidimensional.
3. También trataron de definir la siguiente función de comparación:

function cmp($a, $b) 
{ 
    foreach ($a as $key1 => $val1) { 
     foreach ($b as $key2 => $val2) { 
      if($val1 == $val2){ 
       return strcmp($key1,$key2); 
      } 
      else if ($val1 > $val2){ 
       return 1; 
      } 
      else{ // $val1 < $val2 
       return -1; 
      } 
     } 
    }  
} 

y llamarlo con usort() pero también no funcionó.

Así que mi pregunta es: ¿hay un método PHP que implementa el comportamiento solicitado?

Para Eugen:
Lo he probado y no funciona antes de la clasificación:

Array 
(
    [lamb] => 3 
    [rule] => 1 
    [children] => 1 
    [teacher] => 2 
    [eager] => 1 
) 

y después de la clasificación:

Array 
(
    [children] => 1 
    [eager] => 1 
    [rule] => 1 
    [teacher] => 2 
    [lamb] => 3 
) 
+0

¿Cómo va a usar la matriz resultante? – Galen

+0

@Galen de una manera muy sofisticada y poderosa que nunca se vio en la tierra;) – alfasin

+1

En cuanto a su primer enfoque, no funcionó porque la clasificación de PHP no es estable (es decir, mantiene el orden en valores iguales). – Sarke

Respuesta

12

Usted puede utilizar array_multisort

<?php 
    $arr = Array 
    (  
     'banana' => 2, 
     'cherry' => 1, 
     'orange' => 3, 
     'grapefruit' => 1, 
     'apple' => 1 
    ); 

    $values = array_values($arr); 
    $keys = array_keys($arr); 

    //first sort by values desc, then sort by keys asc 
    array_multisort($values, SORT_DESC, $keys, SORT_ASC, $arr); 

    print_r($arr); 
    // output: 
    /* 
    Array 
    (
     [orange] => 3 
     [banana] => 2 
     [apple] => 1 
     [cherry] => 1 
     [grapefruit] => 1 
    ) 
    */ 

?> 

Funciona así:

  • para cada columna utilizada para ordenar (valores y las claves para usted), crear nueva matriz 1d con su contenido
  • pasan esas matrices 1d a array_multisort función de su clasificación orden (por lo que $ valores primero, luego $ teclas), se suman orden de clasificación para cada matriz
  • el último argumento tiene que ser la matriz que desea ordenar

(Tal vez se encuentra this explanation más fácil de entender)

+0

No sé por qué obtuviste -1, obtuviste +1 de mi parte ya que tu solución funciona, ¡¡¡gracias !!! – alfasin

+2

@alfasin gracias :), las personas son tan rápidas en la votación negativa y no explican por qué ... – Zbigniew

+0

Si queremos agregar varias banderas de ordenamiento para cada elemento que queremos ordenar, ¿funcionará? –

3
function polysortcmp($a, $b) { 
    if ($a[1]<$b[1]) return 1; 
    if ($a[1]>$b[1]) return -1; 
    if ($a[0]<$b[0]) return -1; 
    if ($a[0]>$b[0]) return 1; 
    return 0; 
} 


function polysort(&$arr) { 
    foreach ($arr as $k=>$v) $arr[$k]=array($k,$v); 
    uasort($arr, "polysortcmp"); 
    foreach ($arr as $k=>$v) $arr[$k]=$v[1]; 
} 
+0

no funciona. Actualizo la pregunta para mostrarte cuál es el resultado si lo intento a tu manera. – alfasin

+0

Lo siento, te lo leí mal: ordené primero por clave, luego por valor: actualicé mi respuesta. –

+0

Ahora ordena alfabéticamente, pero los VALORES están en orden ASC en lugar de DESC. Actualicé mi pregunta para mostrarle el resultado actual de su código. Puedes tomar el ejemplo que di y ejecutarlo. – alfasin

0

matriz función de clasificación arsort utiliza ..

$arr = array(  
     'banana' => 2, 
     'cherry' => 1, 
     'orange' => 3, 
     'grapefruit' => 1, 
     'apple' => 1 
    ); 

arsort($arr); 
print_r($arr); 

salida

Array ([orange] => 3 [banana] => 2 [apple] => 1 [grapefruit] => 1 [cherry] => 1) 
+0

Intenté arsort() y no funciona. podría funcionar en ese ejemplo específico que di, pero no funcionará en un caso general. – alfasin

Cuestiones relacionadas