Я пытаюсь преобразовать функцию, написанную в 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
Заранее спасибо за потраченное время