2013-07-24 2 views
0

J'ai ce scriptfonction de PHP dans le tri par ordre alphabétique usort pas

$todos=array(
    '0' => array('id' => 46, 'nombre' => 'b2 miami downtown','precio' => 149.01,'tipo' => 'expedia'), 
    '1' => array('id' => 242,'nombre' => 'b2 Miami Downtown','precio' => 176.98,'tipo' => 'hotelbeds'), 
    '2' => array('id' => 240,'nombre' => 'b2 Miami Downtown','precio' => 131.62,'tipo' => 'hotelbeds'), 
    '3' => array('id' => 241,'nombre' => 'b2 Miami Downtown','precio' => 131.62,'tipo' => 'hotelbeds'), 
    '4' => array('id' => 178,'nombre' => 'Z Ocean Hotel South Beach','precio' => 400.93,'tipo' => 'expedia'), 
    '5' => array('id' => 254,'nombre' => 'Whitelaw Hotel','precio' => 142.29,'tipo' => 'hotelbeds'), 
    '6' => array('id' => 124, 'nombre' => 'Whitelaw Hotel','precio' => 132.04,'tipo' => 'tourico'), 
    '7' => array('id' => 62, 'nombre' => 'Westin Colonnade Coral Gables','precio' => 138.39,'tipo' => 'tourico'), 
    '8' => array('id' => 275, 'nombre' => 'Westgate South Beach','precio' => 166.79,'tipo' => 'hotelbeds'), 
    '9' => array('id' => 44, 'nombre' => 'W South Beach','precio' => 374.55,'tipo' => 'tourico'), 
    '10' => array('id' => 206, 'nombre' => 'Holiday Inn Express West Doral Miami Airport','precio' => 103.22,'tipo' => 'hotelbeds'), 
    '11' => array('id' => 117, 'nombre' => 'Holiday Inn Express Miami International Airport','precio' => 106.3,'tipo' => 'expedia'), 
    '12' => array('id' => 114, 'nombre' => 'Holiday Inn Express Miami Airport Doral Area','precio' => 113,'tipo' => 'tourico'), 
    '13' => array('id' => 78, 'nombre' => 'Holiday Inn Express Doral','precio' => 93.36,'tipo' => 'expedia'), 
    '14' => array('id' => 62, 'nombre' => 'Holiday Inn Express & Suites Kendall East Miami','precio' => 128.46,'tipo' => 'expedia'), 
    '15' => array('id' => 18, 'nombre' => 'Best Western Plus Kendall Hotel & Suites','precio' => 429.55,'tipo' => 'tourico'), 
    '16' => array('id' => 19, 'nombre' => 'Best Western Plus Kendall Hotel & Suites','precio' => 429.55,'tipo' => 'expedia'), 
    '17' => array('id' => 120, 'nombre' => 'Best Western Kendall Hotel & Suites','precio' => 114.27,'tipo' => 'expedia'), 
    '18' => array('id' => 69, 'nombre' => 'Holiday Inn Express & Suites Kendall','precio' => 126.5,'tipo' => 'expedia')); 

    echo "<pre>"; 
    print_r($todos); 

    function comp($a,$b){ 
     if(soundex($a['nombre'])==soundex($b['nombre'])) return($a['precio']-$b['precio']); 
     if(soundex($a['nombre'])!=soundex($b['nombre'])) return strcmp($a['nombre'], $b['nombre']); 
    } 
    usort($todos,'comp'); 
    print_r($todos); 
    echo "<pre>"; 

je dois trier le tableau, d'abord par nom d'hôtel, et après que chaque hôtel par prix (precio). La raison d'utiliser soundex, est parce que le même hôtel peut avoir un nom différent selon le fournisseur (prouver), donc je dois agrouper les hôtels, et mettre d'abord le prix le plus bas, pour supprimer les autres afin que je puisse offrir seulement le meilleur prix.

La sortie:

Array 
(
    [0] => Array 
     (
      [id] => 46 
      [nombre] => b2 miami downtown 
      [precio] => 149.01 
      [tipo] => expedia 
     ) 

    [1] => Array 
     (
      [id] => 242 
      [nombre] => b2 Miami Downtown 
      [precio] => 176.98 
      [tipo] => hotelbeds 
     ) 

    [2] => Array 
     (
      [id] => 240 
      [nombre] => b2 Miami Downtown 
      [precio] => 131.62 
      [tipo] => hotelbeds 
     ) 

    [3] => Array 
     (
      [id] => 241 
      [nombre] => b2 Miami Downtown 
      [precio] => 131.62 
      [tipo] => hotelbeds 
     ) 

    [4] => Array 
     (
      [id] => 178 
      [nombre] => Z Ocean Hotel South Beach 
      [precio] => 400.93 
      [tipo] => expedia 
     ) 

    [5] => Array 
     (
      [id] => 254 
      [nombre] => Whitelaw Hotel 
      [precio] => 142.29 
      [tipo] => hotelbeds 
     ) 

    [6] => Array 
     (
      [id] => 124 
      [nombre] => Whitelaw Hotel 
      [precio] => 132.04 
      [tipo] => tourico 
     ) 

    [7] => Array 
     (
      [id] => 62 
      [nombre] => Westin Colonnade Coral Gables 
      [precio] => 138.39 
      [tipo] => tourico 
     ) 

    [8] => Array 
     (
      [id] => 275 
      [nombre] => Westgate South Beach 
      [precio] => 166.79 
      [tipo] => hotelbeds 
     ) 

    [9] => Array 
     (
      [id] => 44 
      [nombre] => W South Beach 
      [precio] => 374.55 
      [tipo] => tourico 
     ) 

    [10] => Array 
     (
      [id] => 206 
      [nombre] => Holiday Inn Express West Doral Miami Airport 
      [precio] => 103.22 
      [tipo] => hotelbeds 
     ) 

    [11] => Array 
     (
      [id] => 117 
      [nombre] => Holiday Inn Express Miami International Airport 
      [precio] => 106.3 
      [tipo] => expedia 
     ) 

    [12] => Array 
     (
      [id] => 114 
      [nombre] => Holiday Inn Express Miami Airport Doral Area 
      [precio] => 113 
      [tipo] => tourico 
     ) 

    [13] => Array 
     (
      [id] => 78 
      [nombre] => Holiday Inn Express Doral 
      [precio] => 93.36 
      [tipo] => expedia 
     ) 

    [14] => Array 
     (
      [id] => 62 
      [nombre] => Holiday Inn Express & Suites Kendall East Miami 
      [precio] => 128.46 
      [tipo] => expedia 
     ) 

    [15] => Array 
     (
      [id] => 18 
      [nombre] => Best Western Plus Kendall Hotel & Suites 
      [precio] => 429.55 
      [tipo] => tourico 
     ) 

    [16] => Array 
     (
      [id] => 19 
      [nombre] => Best Western Plus Kendall Hotel & Suites 
      [precio] => 429.55 
      [tipo] => expedia 
     ) 

    [17] => Array 
     (
      [id] => 120 
      [nombre] => Best Western Kendall Hotel & Suites 
      [precio] => 114.27 
      [tipo] => expedia 
     ) 

    [18] => Array 
     (
      [id] => 69 
      [nombre] => Holiday Inn Express & Suites Kendall 
      [precio] => 126.5 
      [tipo] => expedia 
     ) 

) 

LA TRIEE MATRICE

Array 
(
    [0] => Array 
     (
      [id] => 120 
      [nombre] => Best Western Kendall Hotel & Suites 
      [precio] => 114.27 
      [tipo] => expedia 
     ) 

    [1] => Array 
     (
      [id] => 19 
      [nombre] => Best Western Plus Kendall Hotel & Suites 
      [precio] => 429.55 
      [tipo] => expedia 
     ) 

    [2] => Array 
     (
      [id] => 18 
      [nombre] => Best Western Plus Kendall Hotel & Suites 
      [precio] => 429.55 
      [tipo] => tourico 
     ) 

    [3] => Array 
     (
      [id] => 78 
      [nombre] => Holiday Inn Express Doral 
      [precio] => 93.36 
      [tipo] => expedia 
     ) 

    [4] => Array 
     (
      [id] => 206 
      [nombre] => Holiday Inn Express West Doral Miami Airport 
      [precio] => 103.22 
      [tipo] => hotelbeds 
     ) 

    [5] => Array 
     (
      [id] => 117 
      [nombre] => Holiday Inn Express Miami International Airport 
      [precio] => 106.3 
      [tipo] => expedia 
     ) 

    [6] => Array 
     (
      [id] => 114 
      [nombre] => Holiday Inn Express Miami Airport Doral Area 
      [precio] => 113 
      [tipo] => tourico 
     ) 

    [7] => Array 
     (
      [id] => 69 
      [nombre] => Holiday Inn Express & Suites Kendall 
      [precio] => 126.5 
      [tipo] => expedia 
     ) 

    [8] => Array 
     (
      [id] => 62 
      [nombre] => Holiday Inn Express & Suites Kendall East Miami 
      [precio] => 128.46 
      [tipo] => expedia 
     ) 

    [9] => Array 
     (
      [id] => 44 
      [nombre] => W South Beach 
      [precio] => 374.55 
      [tipo] => tourico 
     ) 

    [10] => Array 
     (
      [id] => 275 
      [nombre] => Westgate South Beach 
      [precio] => 166.79 
      [tipo] => hotelbeds 
     ) 

    [11] => Array 
     (
      [id] => 62 
      [nombre] => Westin Colonnade Coral Gables 
      [precio] => 138.39 
      [tipo] => tourico 
     ) 

    [12] => Array 
     (
      [id] => 124 
      [nombre] => Whitelaw Hotel 
      [precio] => 132.04 
      [tipo] => tourico 
     ) 

    [13] => Array 
     (
      [id] => 254 
      [nombre] => Whitelaw Hotel 
      [precio] => 142.29 
      [tipo] => hotelbeds 
     ) 

    [14] => Array 
     (
      [id] => 178 
      [nombre] => Z Ocean Hotel South Beach 
      [precio] => 400.93 
      [tipo] => expedia 
     ) 

    [15] => Array 
     (
      [id] => 240 
      [nombre] => b2 Miami Downtown 
      [precio] => 131.62 
      [tipo] => hotelbeds 
     ) 

    [16] => Array 
     (
      [id] => 241 
      [nombre] => b2 Miami Downtown 
      [precio] => 131.62 
      [tipo] => hotelbeds 
     ) 

    [17] => Array 
     (
      [id] => 46 
      [nombre] => b2 miami downtown 
      [precio] => 149.01 
      [tipo] => expedia 
     ) 

    [18] => Array 
     (
      [id] => 242 
      [nombre] => b2 Miami Downtown 
      [precio] => 176.98 
      [tipo] => hotelbeds 
     ) 

) 

Comme vous le voyez devrait être "b2 Miami Downtown" en haut du tableau ne durera pas.

Aidez-nous s'il vous plaît.

Merci !!!.

Répondre

3

A partir du manuel PHP pour strcmp:

Notez que cette comparaison est sensible à la casse.

lettres A-Z vienne avant lettres A-Z. Essayez plutôt strcasecmp.

EDIT: même si vous utilisez strcasecmp, sachez que son insensibilité à la casse s'applique uniquement au jeu de caractères anglais. Si vous utilisez des noms dans d'autres langues (espagnol, français, allemand, etc.), ces caractères ASCII non basiques seront toujours comparés de manière binaire. Par exemple,

posada el Ñandú rengo n'est pas équivalent à posada el ñandÚ rengo.

Vous pouvez utiliser les fonctions multibyte string telles que mb_convert_case ou mb_strtolower avant de procéder à la comparaison.