За последние 24 часа нас посетили 24036 программистов и 1655 роботов. Сейчас ищут 860 программистов ...

Как отсортировать данные турнирной таблицы(условия экзотичес

Тема в разделе "PHP для новичков", создана пользователем alexforce2, 25 апр 2014.

  1. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Re: Как отсортировать данные турнирной таблицы(условия экзот

    В элементе game_over записано какой игрок проиграл, а не выиграл (это следует из условий автора). В твоём варианте получается, что в 4-м раунде играют два проигравших. На такую нестандартную ситуацию скрипт нестандартно реагирует :)

    Добавлено спустя 30 секунд:
    Re: Как отсортировать данные турнирной таблицы(условия экзотичес
     
  2. BaranPHP

    BaranPHP Новичок

    С нами с:
    24 янв 2014
    Сообщения:
    356
    Симпатии:
    0
    Re: Как отсортировать данные турнирной таблицы(условия экзот

    Ну да. Не правильно я ввёл.
    Ну ведь круто же.)
     
  3. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Re: Как отсортировать данные турнирной таблицы(условия экзот

    попробуй. быстро привыкнешь.
     
  4. alexforce2

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

    С нами с:
    25 дек 2013
    Сообщения:
    71
    Симпатии:
    12
    Re: Как отсортировать данные турнирной таблицы(условия экзот

    Спасибо sobachnik, вы классно решили задачку, такой алгоритм мне даже в голову не пришёл, было конечно желание использовать рекурсию и in_array(), но как всё это собрать в алгоритм - не придумал. Вот моё решение, оно, конечно, не такое изящное, как у вас, (плюс к этим функциям есть ещё вывод, его выкладывать не стал)
    Код (Text):
    1.  
    2. public function TablePartitionByStage($table){
    3.         $tableByStage = array();
    4.         $i=0;
    5.         for($k=1; $k<count($table); $k++){
    6.             if(isset($table[$k-1]) && $table[$k]['stage'] == $table[$k-1]['stage']){
    7.                 if($k===1)
    8.                     $tableByStage[$i][]=$table[$k-1];
    9.                 $tableByStage[$i][]=$table[$k];
    10.             }else{
    11.                 $i++;
    12.                 $tableByStage[$i][]=$table[$k];
    13.             }
    14.         }
    15.         return $tableByStage;
    16.     }
    17.  public function StageTableSort($stages1, $stages2, $stages3=false){
    18.         $stage1Sorted = array();
    19.         $stage2Sorted = $stages2;
    20.         if($stages3!=false){
    21.             $stage2Sorted = array();
    22.             foreach($stages3 as $stage3){
    23.                 foreach($stages2 as $stage2){
    24.                     if(  ($stage2['id_first_opponent']==$stage3['id_first_opponent']) || ($stage2['id_first_opponent']==$stage3['id_second_opponent']) ||
    25.                         ($stage2['id_second_opponent']==$stage3['id_first_opponent']) || ($stage2['id_second_opponent']==$stage3['id_second_opponent']) ) {
    26.                         $stage2Sorted[]=$stage2;
    27.                     }
    28.                 }
    29.             }
    30.         }
    31.         foreach($stage2Sorted as $stage2){
    32.             foreach($stages1 as $stage1){
    33.                 if(  ($stage1['id_first_opponent']==$stage2['id_first_opponent']) || ($stage1['id_first_opponent']==$stage2['id_second_opponent']) ||
    34.                     ($stage1['id_second_opponent']==$stage2['id_first_opponent']) || ($stage1['id_second_opponent']==$stage2['id_second_opponent']) ) {
    35.                     $stage1Sorted[]=$stage1;
    36.                 }
    37.             }
    38.         }
    39.         return ($stages3 != false)?array_merge($stage1Sorted, $stage2Sorted, $stages3):array_merge($stage1Sorted, $stage2Sorted);
    40.     }
    Сначала функцией TablePartitionByStage() исходный массив разбивается в массив с подмассивы по уровням, потом полученный массив частями(подмассив 1 уровня, подмассив 2 уровня, подмассив 3 уровня) передаётся в StageTableSort().