при переносе функции из javascript в php и при одинаковых входных данных результаты будут разными - PullRequest
3 голосов
/ 06 августа 2020

Я пытаюсь преобразовать функцию, написанную в Javascript, в PHP, но даже если она написана одинаково и получает те же входные данные, она возвращает разные результаты.

Небольшой контекст. Я работаю над созданием игровых дней для турнира динамичным c способом. Входные данные представляют собой столкновения, которые будут иметь место между командами на протяжении всего турнира

Таким образом

Учитывая следующие данные

combinations = [
  [ 'A', 'B' ], [ 'A', 'C' ],
  [ 'A', 'D' ], [ 'B', 'C' ],
  [ 'B', 'D' ], [ 'C', 'D' ],
  [ 'C', 'D' ], [ 'B', 'D' ],
  [ 'B', 'C' ], [ 'A', 'D' ],
  [ 'A', 'C' ], [ 'A', 'B' ],
  [ 'A', 'B' ], [ 'A', 'C' ],
  [ 'A', 'D' ], [ 'B', 'C' ],
  [ 'B', 'D' ], [ 'C', 'D' ]
]

Javascript

const getMatches = (combinations) => {
  let matches = [];
  let i = 0;

  while (combinations.length) {
    for (const [index, combination] of combinations.entries()) {
      if (combinations.length === 1) {
        matches[i - 1].push(combination);
        combinations.splice(index, 1);
        break;
      }

      if (index === 0) {
        matches.push([combination]);

        combinations.splice(index, 1);
        continue;
      }

      const [team1, team2] = combination;
      const idx = matches[i].findIndex((match) => {
        return match.includes(team1) || match.includes(team2);
      });

      if (idx !== -1) {
        continue;
      }

      matches[i].push(combination);
      combinations.splice(index, 1);
    }

    i++;
  }

  return matches;
};

PHP

function get_matches ($combinations) {
    $matches = [];
    $i = 0;

    while (count($combinations)) {
        foreach ($combinations as $index => $combination) {
            if (count($combinations) === 1) {
                array_push($matches[$i - 1], $combination);
                array_splice($combinations, $index, 1);

                break;
            }

            if ($index === 0) {
                array_push($matches, [$combination]);
                array_splice($combinations, $index, 1);

                continue;
            }

            $idx = find_index($matches[$i], $combination);

            if ($idx !== -1) {
                continue;
            }

            array_push($matches[$i], $combination);
            array_splice($combinations, $index, 1);
        }

        $i++;
    }

    return $matches;
}

Вспомогательная функция в PHP

function find_index ( $matches, $teams ) {
    [$team1, $team2] = $teams;

    foreach ( $matches as $index => $match ) {
        if (in_array($team1, $match) || in_array($team2, $match)) {
            return $index;
        }
    }

    return -1;
}

Ожидаемый результат, я получаю это в Javascript

[
  [ [ 'A', 'B' ], [ 'C', 'D' ] ],
  [ [ 'A', 'C' ], [ 'B', 'D' ] ],
  [ [ 'A', 'D' ], [ 'B', 'C' ] ],
  [ [ 'B', 'C' ], [ 'A', 'D' ] ],
  [ [ 'C', 'D' ], [ 'A', 'B' ] ],
  [ [ 'B', 'D' ], [ 'A', 'C' ] ],
  [ [ 'A', 'C' ], [ 'B', 'D' ] ],
  [ [ 'A', 'B' ], [ 'C', 'D' ] ],
  [ [ 'A', 'D' ], [ 'B', 'C' ] ]
]

PHP output

[
  [["A","B"],["C","D"]],
  [["A","C"],["B","D"]],
  [["A","D"],["B","C"]],
  [["B","C"],["A","D"]],
  [["B","D"],["A","C"]],
  [["B","C"],["A","D"]],
  [["A","D"],["B","C"]],
  [["A","B"],["C","D"]],
  [["A","C"],["C","D"]],
  [["B","C"],["C","D"]]
]

Результат PHP имеет следующие ошибки: во-первых, вместо того, чтобы возвращать массив из 9 элементов, он возвращает 10, во-вторых, в элементах 10 и 9 команда C будет играть дважды одновременно

обновление 0

Лог c функции реализован в соответствии с советом в этом ответе , в частности абзацы с 1 по 4

Заранее спасибо за потраченное время

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...