За последние 24 часа нас посетили 98662 программиста и 3032 робота. Сейчас ищут 1114 программистов ...

Отсортировать массив по максимальному значению и создать новый

Тема в разделе "PHP для новичков", создана пользователем Volonter, 12 июн 2023.

Метки:
  1. Volonter

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

    С нами с:
    8 авг 2009
    Сообщения:
    68
    Симпатии:
    0
    Адрес:
    Москва
    Привет! Долго думал как сформулировать заголовок, ничего лучше не придумал, не пинайте сильно. Вопрос в следующем, у меня есть массив с результатами конкурса. Выглядит так:
    PHP:
    1. $arr = array(
    2.     array('team' => 'Солнышки', 'balls' => 8),
    3.     array('team' => 'Зайчики', 'balls' => 5),
    4.     array('team' => 'Пираты', 'balls' => 3)
    5. );
    Мне нужно создать новый массив, в который бы добавились места, занятые в конкурсе в зависимости от количества балов (максимальное кол-во баллов - 1 место, поменьше - 2, еще меньше - 3 и так далее, чтобы получить вот такой новый массив:
    PHP:
    1. $new_arr = array(
    2.     array('team' => 'Солнышки', 'balls' => 8,'mesto' => 1),
    3.     array('team' => 'Зайчики', 'balls' => 5,'mesto' => 2),
    4.     array('team' => 'Пираты', 'balls' => 3,'mesto' => 3)
    5. );
    Заранее благодарю!
     
  2. Aleksandr.B

    Aleksandr.B Активный пользователь

    С нами с:
    2 фев 2023
    Сообщения:
    159
    Симпатии:
    41
    Адрес:
    Барнаул
    Как вариант.
    Cортировка
    PHP:
    1. usort($arr, function ($a, $b) {
    2.     if ($a['balls'] === $b['balls']) {
    3.         return 0;
    4.     }
    5.     return ($a['balls'] < $b['balls']) ? 1 : -1;
    6. });
    Затем в цикле заполнение массива
    PHP:
    1. array_walk($arr, function (&$value, $key) {
    2.     $value['mesto'] = $key+1;
    3. });
     
    Volonter нравится это.
  3. Volonter

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

    С нами с:
    8 авг 2009
    Сообщения:
    68
    Симпатии:
    0
    Адрес:
    Москва
    Спасибо! То что нужно!
     
  4. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    942
    Симпатии:
    145
    При совпадении кол-ва баллов места разные у записей будут.
     
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Это сейчас пишется короче
    PHP:
    1. usort($arr, fn($a, $b) => $b <=> $a);
     
    artoodetoo и MouseZver нравится это.
  6. Aleksandr.B

    Aleksandr.B Активный пользователь

    С нами с:
    2 фев 2023
    Сообщения:
    159
    Симпатии:
    41
    Адрес:
    Барнаул
    В таком случае.
    PHP:
    1. foreach ($arr as $key => $value){
    2.     if($key && $value['balls'] === $arr[$key-1]['balls']){
    3.         $arr[$key]['mesto'] = $arr[$key-1]['mesto'];
    4.     }else{
    5.         $arr[$key]['mesto'] = $key+1;
    6.     }
    7. }
    Пример скопирован из первого примера документации поменяв местами 1 : -1;.
     
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ну функция usort старше, чем оператор <=>, он относительно недавно в языке появился.