Add initial implementation of Fantacalcio application

This commit is contained in:
Simone
2026-03-07 17:15:34 +01:00
parent 6e74a538ea
commit dc6fc7b7e0
41 changed files with 2086 additions and 0 deletions
+192
View File
@@ -0,0 +1,192 @@
<?php
require_once 'logic.php';
/**
* IMPORTA GIOCATORI
* CSV → JSON { "numero": { "nome": "...", "cognome": "...", ... } }
*/
function importaGiocatori(string $csvContent): string|false
{
$separators = detectSeparators($csvContent);
$delimiter = $separators['delimiter'];
$result = [];
$lines = preg_split('/\r\n|\n|\r/', trim($csvContent));
$headers = null;
foreach ($lines as $index => $line) {
$row = str_getcsv($line, $delimiter);
if (empty($row) || trim(implode('', $row)) === '') {
continue;
}
if ($headers === null) {
$headers = array_map('trim', $row);
continue;
}
$data = [];
foreach ($headers as $i => $header) {
$value = isset($row[$i]) ? trim($row[$i]) : '';
if ($value !== '') {
$data[$header] = $value;
}
}
$key = $data['numero'] ?? '';
if ($key === '') continue;
unset($data['numero']);
// conversioni tipi speciali (isDestro rimane booleano)
if (isset($data['isDestro'])) {
$lower = strtolower($data['isDestro']);
$data['isDestro'] = in_array($lower, ['true', '1', 'si', 'yes', 'vero', 't']) ? true : false;
}
// Conversione esplicita per i campi che devono essere numeri interi
foreach (['partiteGiocate', 'assist', 'goal'] as $field) {
if (isset($data[$field]) && is_numeric($data[$field])) {
$data[$field] = (int)$data[$field];
}
}
$result[$key] = $data;
}
ksort($result, SORT_NATURAL);
return json_encode($result, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
}
/**
* ESPORTA GIOCATORI
* JSON → CSV
*/
function esportaGiocatori(string|array $giocatoriJson, string $delimiter = ';'): string
{
$data = is_string($giocatoriJson) ? json_decode($giocatoriJson, true) : $giocatoriJson;
if (!is_array($data) || empty($data)) {
return '';
}
// raccogliamo tutte le chiavi possibili (per gestire giocatori con campi extra)
$allKeys = ['numero'];
foreach ($data as $obj) {
$allKeys = array_merge($allKeys, array_keys($obj));
}
$allKeys = array_unique($allKeys);
$csvLines = [];
$csvLines[] = implode($delimiter, array_map(fn($k) => csvEscape($k), $allKeys));
foreach ($data as $numero => $giocatore) {
$row = ['numero' => $numero];
foreach ($allKeys as $key) {
if ($key === 'numero') continue;
$value = $giocatore[$key] ?? '';
// Gestione speciale per i booleani
if ($key === 'isDestro' && is_bool($value)) {
$row[$key] = $value ? 'true' : 'false';
} else {
$row[$key] = $value;
}
}
$csvLines[] = implode($delimiter, array_map('csvEscape', $row));
}
return implode("\n", $csvLines);
}
/**
* IMPORTA VOTI
* CSV → JSON { "numero": [voto1, voto2, ...] }
*/
function importaVoti(string $csvContent): string|false
{
$separators = detectSeparators($csvContent);
$delimiter = $separators['delimiter'];
$result = [];
$lines = preg_split('/\r\n|\n|\r/', trim($csvContent));
foreach ($lines as $index => $line) {
if ($index === 0) continue; // skip header
$row = str_getcsv($line, $delimiter);
if (empty($row) || trim($row[0] ?? '') === '') continue;
$key = trim($row[0]);
if ($key === '') continue;
$voti = [];
// I voti sono tutti gli elementi dalla seconda colonna in poi
for ($i = 1; $i < count($row); $i++) {
$val = trim($row[$i]);
// Normalizza SEMPRE la virgola in punto per gestire contenuti misti.
// Questo è sicuro per i voti, che non usano separatori per le migliaia.
$normalizedVal = str_replace(',', '.', $val);
if ($val !== '' && is_numeric($normalizedVal)) {
$voti[] = (float)$normalizedVal;
}
}
if (!empty($voti)) {
$result[(string)$key] = $voti;
}
}
ksort($result, SORT_NATURAL);
return json_encode($result, JSON_PRETTY_PRINT);
}
/**
* ESPORTA VOTI
* JSON → CSV
*/
function esportaVoti(string|array $votiJson, string $delimiter = ';', string $decimal = '.'): string
{
$data = is_string($votiJson) ? json_decode($votiJson, true) : $votiJson;
if (!is_array($data) || empty($data)) {
return '';
}
$csvLines = [];
$csvLines[] = 'numero' . $delimiter . 'voti'; // Intestazione
foreach ($data as $numero => $votiArray) {
if (!is_array($votiArray)) {
continue;
}
// Converti i voti nel formato decimale richiesto
$formattedVoti = array_map(function($voto) use ($decimal) {
return str_replace('.', $decimal, (string)$voto);
}, $votiArray);
// Crea una riga con il numero del giocatore seguito dai suoi voti
$row = array_merge([$numero], $formattedVoti);
// Implode della riga con il delimitatore
$csvLines[] = implode($delimiter, $row);
}
return implode("\n", $csvLines);
}
/**
* Utility: escaping CSV
*/
function csvEscape($value): string
{
$value = (string)$value;
if (str_contains($value, ',') || str_contains($value, '"') || str_contains($value, "\n")) {
return '"' . str_replace('"', '""', $value) . '"';
}
return $value;
}