[PHP] Applicare natsort usando un array

giannit

Nuovo Utente
30 Mar 2017
31
2
8
55
Ciao, rieccomi con un altro problema, sto cercando di capire come si fa per ordinare delle righe di un file di testo sfruttando un array.
questo e ciò che ho attualmente: un file chiamato squadra.txt
cosi composto:
Codice:
Carlo>Portiere
Marco>Attaccante
Paolo>Difensore
Antonio>Ala destra
Andrea>Ala sinistra
e questo e quello che vorrei riuscire ad ottenere, riscrivendo il file squadra.txt:
Codice:
Carlo>Portiere
 Paolo>Difensore
 Antonio>Ala destra
 Andrea>Ala sinistra
 Marco>Attaccante
sto cercando di venirne a capo e ho provato in questo modo:
PHP:
<?php
$array = array("Portiere", "Difensore", "Ala destra", "Ala sinistra", "Attaccante");

$file = "squadra.txt";

$righe = file($file);
$array = count($righe);

$sorted = array($array);
for ($nome=0; $nome<=$array; $nome++)
{
$sorted[$nome]    = $righe[$nome];
}

natsort($sorted);
print_r ($sorted);

$newfile = @fopen ("prova.txt", "a+");
for ($nome=0; $nome<=$array; $nome++)
{
@fwrite($newfile, $sorted[$nome]);
}

@fclose ($newfile);
?>
in pratica, finora riesco solo a leggere il file e stamparlo a video, ma vorrei riuscire a dargli l'ordine come riporto nell'array, ma non so come applicare l'array e riscrivere il file con il nuovo ordine dato. Grazie
 
Ultima modifica di un moderatore:

Eduadie

Utente Attivo
22 Mar 2013
58
7
8
www.mrrobotbet.altervista.org
Sei obbligato a memorizzare i dati in file squadra.txt in quel modo? Potresti fare una furbata per renderlo più semplice.

In ogni caso però dovresti manipolare ciò che leggi dal file magari arrivando ad ogni riga al carattere separatore (nel tuo caso >) e leggere ciò che c'è dopo. Magari raggruppare i nomi per questo valore e ordinarli ruolo per ruolo.

Altrimenti se puoi salvarli in altro modo identifichi 0 portieri, 1 difensore, 2 ala destra, 3 ala sinistra, 4 attaccante e il file squadra.txt in questo modo:

0Carlo
4Marco
1Paolo
2Antonio
3Andrea

e applicando un algoritmo di ordinamento li ordina in automatico bene :)

Spero di essere stato chiaro.

Edit: Ho visto che hai modificato il code ma non è chiaro cosa hai provato a fare...
 
Ultima modifica:

giannit

Nuovo Utente
30 Mar 2017
31
2
8
55
grazie per la risposta, il file che in realtà e molto più lungo, mi viene passato gia compilato in quel modo, pensavo proprio di sfruttare il carattere separatore > in effetti, ma va a capire come :):) ho voluto aggiornare il post, con una modifica in cui il file lo leggo e lo scrivo, ma non riesco ad avere modifiche, in pratica l'array non agisce
 
Ultima modifica:

giannit

Nuovo Utente
30 Mar 2017
31
2
8
55
Abbi pazienza ma sono veramente mooolto scarso in questo settore, mi puoi dare qualche esempio? sto guardando in rete e la mia domanda é ? se converto la stringa dopo il > in un intero, associando ad ogni stringa un ruolo di gioco con l'intero, potrei ottenere il risultato voluto? ma come si fa?
 

Eduadie

Utente Attivo
22 Mar 2013
58
7
8
www.mrrobotbet.altervista.org
PHP:
<?php
$file = "squadra.txt";
$righe = file($file);
$numrighe = count($righe);

$portieri = array();
$difensori = array();
$aladestra = array();
$alasinistra = array();
$attaccante = array();


for($i=0; $i < $numrighe;$i++) {
    $riga = $righe[$i];
    list($giocatore, $ruolo) = split("[>]", $riga);
    if(strcmp($ruolo,"Portiere")) { array_push($portieri, $giocatore); }
    else if(strcmp($ruolo,"Difensore")) { array_push($difensori, $giocatore); }
    else if(strcmp($ruolo,"Ala destra")) { array_push($aladestra, $giocatore); }
    else if(strcmp($ruolo,"Ala sinistra")) { array_push($alasinistra, $giocatore); }
    else if(strcmp($ruolo,"Attaccante")) { array_push($attaccante, $giocatore); }      
}

?>
Una cosa del genere anche se non l'ho provato non avendo un file squadra.
Questo riguarderebbe magari la parte riguardante la gestione dei giocatori.
 
Ultima modifica:

giannit

Nuovo Utente
30 Mar 2017
31
2
8
55
Ciao, grazie ancora, in questi giorni sono un po' incasinato e solo ora ho potuto provare lo script, ma pare non funzionare, stranamente mi riporta l'errore Deprecated: Function split() is deprecated on line 15 eppure il simbolo per lo split e quello ">",
Edit:
Ho modificato lo script e cambiato split ( ) con preg_split ( ), in questo modo non più l'errore
quindi pare funzionare, ma come riscrivo il nuovo file ordinato?
 
Ultima modifica:

giannit

Nuovo Utente
30 Mar 2017
31
2
8
55
Proprio basandomi su questo che ho provato a mettere preg_split ( ) e pare funzonare per testare lo script sto usando XAMPP può essere questo il problema? o no? sono molto confuso, pur avendo molta voglia di imparare qualcosa della programmazione
 

Eduadie

Utente Attivo
22 Mar 2013
58
7
8
www.mrrobotbet.altervista.org
Nono Xampp è giusto come ambiente di sviluppo php, al termine dell'operazione dovresti scrivere su file ruolo per ruolo.

Svuoti gli array che hai riempito dei ruoli con a fianco >RUOLO utilizzando le funzioni per scrivere su file.
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
il problema del deprecate non dipende da XAMP ma dalla versione php installata con XAMP
potresti comunque provare una cosa del genere
PHP:
<?php
/* esempio file squadra.txt
Carlo>Portiere
Marco>Attaccante
Paolo>Difensore
Giuseppe>Difensore
Antonio>Ala destra
Andrea>Ala sinistra
*/

$file="squadra.txt";
$righe=file($file);
$squadra=array();
foreach($righe as $riga){
    $elemento=explode(">",$riga);
    $elemento[1]=strtr($elemento[1]," ","_");//per key array
    $squadra[$elemento[1]][]=$elemento[0];
}
/*come risulta l'arry $quadra
$squadra['Portiere'][0]= Carlo
$squadra['Attaccante'][0]= Marco
$squadra['Difensore'][0]= Paolo
$squadra['Difensore'][1]= Giuseppe
$squadra['Ala_destra'][0]= Antonio
$squadra['Ala_sinistra'][0]= Andrea
*/
echo "la squadra è composta da<br />";
foreach($squadra as $ruoli => $elementi){
    //sort($elementi)://se vuoi mettere i nomi in ordine alfabetico
    $ruolo=strtr($ruoli,"_"," ");
    foreach($elementi as $nome){
        $n[]=$nome;
    }
    $nomi=implode(", ", $n);
    echo "$ruolo: $nomi<br />";
}
/* output
la squadra è composta da
Portiere: Cerlo
Attaccante; Marco
Difensore: Paolo, Giuseppe
Ala destra: Antonio
Ala sinistra: Andrea
*/
?>
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
il problema dell'ordinamento devi risolvero manina manina, utilizzando i vari tipi di sort ordini o per chiave o per contenuto sia che tu utilizzi il metodo Eduadie o il mio.
il tentativo che hai fatto con $array = array("Portiere", "Difensore", "Ala destra", "Ala sinistra", "Attaccante");
potrebbe essere una strada
PHP:
<?php
//....quello che ho fatto io per leggere...
//in questo modo determini tu l'ordine di scrittura dei ruoli
$ordine_di_scrittura=array("Portiere", "Difensore", "Ala_destra", "Ala_sinistra", "Attaccante");//dove puoi aggiungere intertire eliminare ruoli (le chiavi degli arrai senza spazi)
$newfile = fopen ("prova.txt", "a+");//NON usare i silent @ gli errori NON vanno nascosti ma eliminati
if(!$newfile){exit();}//ho semplificato il controllo
foreach($ordine_di_scrittura as $ruolo){
    //qui la verifica che la $squadra[$ruolo] esista
    if(isset($squadra[$ruolo])){
        foreach($squadra[$ruolo] as $nomi){//il $nomi è un array es a che ne so i difensori sono due
            sort($nomi);//nomi in ordine alfabetico
            foreach($nomi as $nome){
                $da_scrivere="$nome>$ruolo/r";
                if(!fwrite($newfile, $da_scrivere)){
                    echo "$nome non inserito";
                }else{
                    echo "$nome ok";
                }
            }
        }
    }
}
fclose($newfile);
?>
 
  • Like
Reactions: Eduadie

giannit

Nuovo Utente
30 Mar 2017
31
2
8
55
Ciao, mi scuso per non aver risposto ma in questi giorni sono molto indagfarato con altro e ho accantonato al momento il problema. Grazie cmq per le risposte.