2013-07-24 53 views
0

我有此腳本PHP的strcmp在usort功能不按字母順序排序

$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>"; 

我需要對數組進行排序,第一個由酒店的名字,之後,每家酒店的價格(PRECIO)。 使用同音究其原因,是因爲在同一酒店可能有diferent名取決於提供商(proveedor),所以我需要agroup酒店,並把第一個最低的價格,刪除他人,所以我可以提供只有最好的價格。

輸出:

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 
     ) 

) 

數組排序

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 
     ) 

) 

正如你看到的 「B2邁阿密市中心」 應該是在數組沒有持續的頂部。

請幫忙。

謝謝!!!

回答

3

從PHP手冊strcmp

注意,這個比較是區分大小寫。

字母A-Z來到之前字母a-z。改爲嘗試strcasecmp

編輯:即使使用strcasecmp,請注意它的大小寫不敏感只適用於英文字符集。如果您使用其他語言環境中的名稱(西班牙語,法語,德語,您將其命名),那些非基本ASCII字符仍將以二進制方式進行比較。例如,

posada el Ñandú rengo不等同於posada el ñandÚ rengo

您可能需要在比較之前使用multibyte string功能,如mb_convert_case或mb_strtolower。