За последние 24 часа нас посетили 16755 программистов и 1643 робота. Сейчас ищут 899 программистов ...

Сортировка массива по вложенным элементам

Тема в разделе "PHP для новичков", создана пользователем boo, 24 фев 2010.

  1. boo

    boo Активный пользователь

    С нами с:
    16 мар 2008
    Сообщения:
    84
    Симпатии:
    0
    Появилась необходимость сортировки:
    PHP:
    1.  
    2.    [Ukraine] => Array(
    3.       [Lvov] => 1
    4.       [Odessa] => 3
    5.    )
    6.    [Russia] => Array (
    7.       [Moskow] => 5
    8.       [St. Petersburg] => 3
    9.    )
    10.    [France] => ( Array (
    11.       [Paris] => 2
    12.       [Nice] => 1
    13.    )
    14. )
    15.  
    Надо вывести страны с большем количеством городов, вверху.
    PHP:
    1.  
    2. Russia 8
    3. Ukraine 4
    4. France 3
    5.  
    ! при этом не должны теряться города и кол-во в них элементов
    По комаднам сортировки в php не нашёл нужного.
    Буду пробывать перебором foreach, если что отпишу своё решение

    Если кто знает как проще... ?
     
  2. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    $countrysCount = array();
    foreach ($countries as $country => $cities) {
    $countrysCount[$country] = array_sum($cities);
    }
     
  3. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    http://php.net/usort
     
  4. boo

    boo Активный пользователь

    С нами с:
    16 мар 2008
    Сообщения:
    84
    Симпатии:
    0
    не внимательно прочитали мой пост.
     
  5. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    И как тогда совмещать данные? Города и счетчики должны быть отдельно. Это не объект.
     
  6. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    ногами
    PHP:
    1. <?php
    2. $list = array(
    3.         'Ukraine' => array(
    4.                 'Lvov' => 1,
    5.                 'Odessa' => 3
    6.         ),
    7.         'Russia' => array (
    8.                 'Moskow' => 5,
    9.                 'St. Petersburg' => 3
    10.         ),
    11.         'France' => array (
    12.                 'Paris' => 2,
    13.                 'Nice' => 1
    14.         )
    15. );
    16. usort($list, 'countsort');
    17. var_export($list);
    18.  
    Код (Text):
    1. array (
    2.     0 => array (
    3.         'Moskow' => 5,
    4.         'St. Petersburg' => 3,
    5.         'count' => 8, ),
    6.     1 => array (
    7.         'Lvov' => 1,
    8.         'Odessa' => 3,
    9.         'count' => 4, ),
    10.     2 => array (
    11.         'Paris' => 2,
    12.         'Nice' => 1,
    13.         'count' => 3, ),
    14. )
     
  7. boo

    boo Активный пользователь

    С нами с:
    16 мар 2008
    Сообщения:
    84
    Симпатии:
    0
    может я не так написал, вывод то сделать легко:
    Код (Text):
    1.  
    2. foreach ( $show as $k => $v ){
    3. echo $k . ' ('. array_sum ( $show [$k] ) .')';
    4. }
    мне сортировка важна

    Simpliest, спасибо, пробую
     
  8. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    И в два раза больше гемора при выводе...
     
  9. boo

    boo Активный пользователь

    С нами с:
    16 мар 2008
    Сообщения:
    84
    Симпатии:
    0
    может есть возможность сортировки по маске?
    Код (Text):
    1.  
    2. $show = array(c=>...,b=>...,a=>...,d=>...,e=>...);
    3. $mask = (a,b,c,d,e);
    что то типо того?
     
  10. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Kreker
    Нет там гемора, как хочешь так и верти его.

    Можешь добавлять count в массив - можешь не добавлять, сортировка работает в любом случае.
     
  11. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Все есть, вопрос нахрена?
    http://php.net/array_multisort
     
  12. boo

    boo Активный пользователь

    С нами с:
    16 мар 2008
    Сообщения:
    84
    Симпатии:
    0
    создаю 2ой массив, такого типа как в первом посте - Kreker написал, сортирую его и накладываю как маску.
    А в вашем примере - теряются страны, или я не прав?
     
  13. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Я же привел вывод.

    Можно использовать другую функцию из той же серии и тогда не будут теряться.
     
  14. boo

    boo Активный пользователь

    С нами с:
    16 мар 2008
    Сообщения:
    84
    Симпатии:
    0
    Код (Text):
    1.  
    2. $show = Array (
    3.    [Ukraine] => Array(
    4.        [Lvov] => 1
    5.        [Odessa] => 3
    6.    )
    7.    [Russia] => Array (
    8.        [Moskow] => 5
    9.        [St. Petersburg] => 3
    10.    )
    11.    [France] => ( Array (
    12.        [Paris] => 2
    13.        [Nice] => 1
    14.    )
    15.  );
    16.  
    17. function cmp($a, $b) {
    18.     if ($a)
    19.         if (array_sum ( $a ) == array_sum ( $b )) {
    20.             return strcmp ( $a, $b ); //сортирует вложенные массывы, а надо ключи
    21.         }
    22.     return (array_sum ( $a ) > array_sum ( $b )) ? - 1 : 1;
    23. }
    24. uasort ( $show, 'cmp' );
    не верно сортирует одинаковые элементы... с обычным не асоц. массивом всё ок....
    если можно подсказку?
    там когда сумма равна - сравнивает элементы(вложеные массивы), а нужно ключи сравнить...
     
  15. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    PHP:
    1. <?php
    2.  
    3. function cmp($a, $b) {
    4. //....
    5.   uasort($a, 'cmp');
    6.   uasort($b, 'cmp');
    7. //....
    8. }
    9.  
    10. uasort($arr, 'cmp');
     
  16. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Все вместе одной функцией не получится. Или по ключам сортируем, или по значениям.

    Если нужны изыски. комбинируйте.