2013-07-24 2 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). Причина использования soundex, потому что у одного и того же отеля может быть разное имя в зависимости от провайдера (доказано), поэтому мне нужно объединить гостиницы и поставить самую низкую цену, чтобы удалить других, чтобы я мог предложить только лучшая цена.

Выход:

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 Miami Downtown" должны быть в верхней части массива не в последнюю очередь.

Пожалуйста, помогите с этим.

Спасибо !!!.

ответ

3

От PHP руководства strcmp:

Обратите внимание, что это сравнение чувствительно к регистру.

Письма A-Z прибывают до буквы a-z. Вместо этого попробуйте strcasecmp.

EDIT:, даже если вы используете strcasecmp, имейте в виду, что его нечувствительность к регистру действительно применима только к английской кодировке. Если вы используете имена в других локалях (на испанском, французском, немецком, вы называете это), эти символы без базового ASCII будут по-прежнему сравниваться двоичным образом. Например,

posada el Ñandú rengo не эквивалентен posada el ñandÚ rengo.

Перед сопоставлением вы можете использовать функции multibyte string, такие как mb_convert_case или mb_strtolower.

 Смежные вопросы

  • Нет связанных вопросов^_^