Add initial implementation of Fantacalcio application
This commit is contained in:
Executable
+192
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user