2011-04-12 14 views
7

Necesito una función en php para ordenar una lista de palabras de acuerdo con un orden arbitrario.PHP ordenar por orden arbitrario

Cualquier palabra en la lista que no esté en mi orden predefinida debe ordenarse alfabéticamente al final de la lista.

Debajo está mi primer intento, no es ni elegante ni eficiente. ¿Puedes sugerir una mejor manera de lograr esto?

Gracias

public static function sortWords(&$inputArray){ 
    $order=array("Banana","Orange", "Apple", "Kiwi"); 
    sort($inputArray); 
    for($i=0;$i<count($inputArray));$i++){ 
     $ac = $inputArray[$i]; 
     $position = array_search($ac,$order); 
     if($position !== false && $i != $position){ 
      $temp=$inputArray[$position]; 
      $inputArray[$position]=$inputArray[$i]; 
      $inputArray[$i]=$temp; 
     } 
    } 
} 
+0

Puede ordenar las dos listas primero (NlogN + MlogM time), luego recorra las listas de coincidencias (tiempo N + M). Ya que debes ordenar de todos modos, esto es óptimo. – bdares

+0

Sé que no importa su pregunta, pero tiene un error en la instrucción 'for', dos paréntesis de cierre en lugar de uno para' $ i AJJ

Respuesta

1
public static function sortWords($inputArray){ 
    $order=array("Banana","Orange", "Apple", "Kiwi"); 
    $sorted_array = array_diff($inputArray,$order); 
    sort($sorted_array); 
    $rest_array = array_intersect($order,$inputArray);  
    $result = array_merge($rest_array,$sorted_array); 
    return $result; 
} 

no hemos probado, pero probar esto.

+0

Lo he editado, por lo que inténtalo de nuevo si no funcionó. – Headshota

1

Probablemente más lento que la solución de Headshota, pero sólo para proporcionar otra posibilidad (no probado):

function sortWordsCmp($a, $b) { 
    $order=array("Banana","Orange", "Apple", "Kiwi"); 
    $a = array_search($a, $order); 
    $b = array_search($b, $order); 

    if ($a === $b) 
    return 0; 

    return (($b===false) || ($a < $b)) ? -1 : +1; 
} 

public static function sortWords($inputArray){ 
    usort($inputArray, 'sortWordsCmp'); 
    return $inputArray; 
} 
12

PHP proporciona los usort() y uksort() funciones que le permite escribir sus propias rutinas de clasificación. De estos dos, querrás usort().

Ambas funciones esperan que escriba una función independiente, que toma como entrada dos elementos de la matriz de entrada, y devuelve el orden en el que se deben ordenar. La función usort() luego ejecuta su propio algoritmo de clasificación, llamando a su función para establecer el orden de clasificación a menudo según sea necesario hasta que haya ordenado todo el conjunto.

Por lo que iba a escribir algo como esto ....

function mycompare($a, $b) { 
    if ($a == $b) {return 0;} 
    $order=array("Banana","Orange", "Apple", "Kiwi"); 
    $position = array_search($a,$order); 
    $position2 = array_search($b, $order); 

    //if both are in the $order, then sort according to their order in $order... 
    if ($position2!==false && $position!==false) {return ($position < $position2) ? -1 : 1;} 
    //if only one is in $order, then sort to put the one in $order first... 
    if($position!==false) {return -1;} 
    if($position2!==false) {return 1;} 

    //if neither in $order, then a simple alphabetic sort... 
    return ($a < $b) ? -1 : 1; 
} 

... luego simplemente llamar usort($inputarray,'mycompare'); para ordenarlos.

0
public static function sortByArbitraryKeys(&$inputArray, $sort_order) { 
    $sort_order = array_flip($sort_order); 
    uksort($inputArray, function ($a, $b) use ($sort_order) { 
     return $sort_order[$a] - $sort_order[$b]; 
    } 
} 

lo tanto, un ejemplo sería el siguiente ...

// Doe, John L. 
$this->full_name = ['last_name'=>'Doe', 'first_name'=>'John', 'middle_initial'=>'L.']; 

// John L. Doe 
$this->sortByArbitraryKeys($this->full_name, ['first_name', 'middle_initial', 'last_name']); 

Desde aquí se puede refactorizar esto por lo que su caso de uso específico es.

+0

¿Qué es '$ sort_array'? – crmpicco

+0

Oh, ese soy yo haciendo el tonto. – kjg61pt

Cuestiones relacionadas