Trovare un array in txt e modificarlo

  • Creatore Discussione Creatore Discussione Monital
  • Data di inizio Data di inizio

Monital

Utente Attivo
15 Apr 2009
778
2
18
Rieccomi :D

ulteriore problema un pò +difficile
mi speigo
ho un file txt così composto
Citta§nome§numero

ora pesco dal database mysql tutti nomi relativi a citta con questa quey

PHP:
$nomi=array();
$sqlquery = "SELECT * FROM tabella WHERE citta='Bari'";
$result = mysql_query($sqlquery);
while ($linea = mysql_fetch_array($result, MYSQL_ASSOC)){
$nomi[]= $linea['nome'];

}

poi eseguo il seguente codice
PHP:
foreach($nome as $newnome){

$d=array();
foreach($data as $i => $riga){
	 for($z=1; $z<=count($data); $z++){
	  $indx=$i+$z;
                $d[$indx]= $data[$indx]; 
			$n=$d[$indx];
$ce_0=preg_match("/Bari§".$newnome."§/i",$n);
if($ce_0==1){
$numeroA=$i+$z;
$gia = file($file,FILE_IGNORE_NEW_LINES);
$rigaDaSostituire = $numeroA; //123-esima riga
$rigaDiSostituzione = "Bari§".$newnome."§5";
$gia[$rigaDaSostituire] = $rigaDiSostituzione;
file_put_contents($file,implode("\n",$gia));
fclose($gia);
		}

}

i problemi sono due
A) facendo una prova con
PHP:
 echo $numeroA ;
ma avendo data count($data) mi restituisce tute le righe dove $ce_0 = 1 per tutte le righe del file cioè mi ripete le righe trovate ad esempio se trova la corrispondenza alla riga 15 me lo ripete epr 14 volte questo epr ogni elemento dell'array.

se l'array e composto da 3 nomi Tizio caio e sempronio e sono rispettivamente alal riga 10 15 20
Mi restituisce
9 volte la riga 10
14 la riga 15
19 la riga 20

dove ho sbagliato il for? ma diciamo che è il problema minore daro che

B)quando vadoa sovrascrivere le stringhe mi riscrive correttamente però vorrei arrivare a due cose

1)quando non trova la corrispondenza nel file txt deve aggiungere una riga

pensavo di usare l'if ce_0!=1 ma non so come aggiugnere la riga.
2)il valore "numero della riga trovata si deve incrementare di 1, in sostanza trovato il preg_match
quando vadoa s ostituire ci deve esse na cosa del genere
PHP:
[U]$rigaDiSostituzione = "Bari§".$newnome."§(+1)";[/U]
$gia[$rigaDaSostituire] = $rigaDiSostituzione;

suggerimenti?
 
Giuro che non sono riuscito a capire che cosa fa lo script. Potresti spiegarlo a parole così magari lo rifacciamo da zero?

mmh ok

allora devo trovare la riga dove il primo elemento è uguale a bari, il secondo elemento deve corrispondere ai valori contentei nell'array

PHP:
$nomi=array();
$sqlquery = "SELECT * FROM tabella WHERE citta='Bari'";
$result = mysql_query($sqlquery);
while ($linea = mysql_fetch_array($result, MYSQL_ASSOC)){
$nomi[]= $linea['nome'];

}

quindi se c'è tizio caio e sempronio nell'array, deve trovarmi le tre righe nel file.

trovate le righe deve incrementargli di 1 il campo numero

e se non trova la riga deve aggiurgene una di nuova con valore"numero"1


questo è quanto

con quel codice(che probabilemtne non è indentato bene) riesco a sostituire le righe ma non ad incrementare il campo numero ed aggiungere una nuova riga

non è difficile soloc he non ho le idee chiare
 
Ho scritto al volo questo script:
PHP:
<?php
$city = 'Bari';
$data = array(
    'Tizio',
    'Caio',
    'Sempronio',
);

$lines = file('data.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

foreach ($lines as $num => $line) {
    $parts = explode('§', $line);

    if (in_array($parts[1], $data) && $parts[0] == $city) {
        $parts[2]++;
        $lines[$num] = implode('§', $parts);
        unset($data[array_search($parts[1], $data)]);
    }
}

foreach ($data as $name) {
    $lines[] = "{$city}§{$name}§1";
}

$contents = implode(PHP_EOL, $lines);

unlink('data.txt');
file_put_contents('data.txt', $contents);
?>
Dato questo file:
Codice:
Bari§Tizio§1
Bari§Caio§2
Roma§Tizio§1
Lo modifica così:
Codice:
Bari§Tizio§2
Bari§Caio§3
Roma§Tizio§1
Bari§Sempronio§1
Era quello che ti serviva, no?
 
grazie ale ora lo provo

però ho notato che riepte tizio nel file

quessto nond eve farmelo cmq intanto lo testo e grazie ancora

poi con calma vedo un pò le differenze
 
ho cancellato il precedente messaggio perchè non andava lo script e dopoa ver inviato il messaggio mi sono accorto dia ver dimenticato di isnerire l'array

grandioso ale sei un GRANDE :beer:

però

facendo delle prove mi so accorto di una cosa quando vadoa fare la query prendondo i nomi può capitare che ci siano anche due CAIO del tipo l'array potrebbe diventare

Tizio
Caio
Sempronio
Caio

e lo script conteggia il + 1 a Caio e l'altro Caio lo aggiunge alla fine del ffile
e non ho capito male questo dipende dal fatto che mano a mano che scorre il file trova tizio e passa oltre


non ho proprio idea di come far riconoscere nell'array gli elemnti uguali e quindi sommarli di conseguenza del tipo

Rossi
Rossi
Caio

Caio + 1 e Rossi +2
 
Ultima modifica:
Prova a modificare lo script così:
PHP:
<?php
$city = 'Bari';
$data = array(
    'Tizio',
    'Caio',
    'Sempronio',
);

$new_data = array();
foreach ($data as $k => $v) {
    $new_data[$v] = isset($new_data[$v]) ? $new_data[$v] + 1 : 1;
}

$data = $new_data;

$lines = file('data.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

foreach ($lines as $num => $line) {
    $parts = explode('§', $line);

    if (in_array($parts[1], $data) && $parts[0] == $city) {
        $key = $data[array_search($parts[1], $data)];
        
        $parts[2] = $parts[2] + $data[$key];
        $lines[$num] = implode('§', $parts);
        unset($data[$key]);
    }
}

foreach ($data as $name) {
    $lines[] = "{$city}§{$name}§1";
}

$contents = implode(PHP_EOL, $lines);

unlink('data.txt');
file_put_contents('data.txt', $contents);
?>
 
mmmh al posto del nome mi mette il numero relativo alla presenza nell'array

Bari§2§1
Bari§2§1
Bari§1§1
Bari§1§1

sto cercando dic apire cos'è sicurmaente una svista
in sostanza non modifica niente aggiunge solo le righe alla fine del file cosi come le o descritte sopra

facendo una prova mettendo 3 nomi uguai mi riportava
Bari§3§1

ho fato print_r($data) e restituisce

Array ( [Tizio] => 3 )

mmh deve esse invertito qualcosa boh stoc ercando di individuarlo ma nisba
 
Ultima modifica:
forse ci sono arrivato studiando un pò,
allora
ho inserito nell'array

Tizio
Tizio
Tizio
Caio
Caio

il print_ r del $new_data mi restituisce

PHP:
Tizio=>3 Caio=>2

mentre il print_r di $lines mi restituisce 1=>Bari§Tizio§

ins ostanza le chiavi/valori dei due array sono invertite e non ho proprio idea di come fare mi ci metto un pò

ora mi sto intestardendo sus ta cosa
 
Ultima modifica:
Sì, mi sono dimenticato di modificare il resto dello script. Prova così, l'ho testato e funziona:
PHP:
<?php
$city = 'Bari';
$data = array(
    'Tizio',
    'Tizio',
    'Tizio',
    'Caio',
    'Caio',
    'Sempronio',
);

$new_data = array();
foreach ($data as $k => $v) {
    $new_data[$v] = isset($new_data[$v]) ? $new_data[$v] + 1 : 1;
}

$data = $new_data;

$lines = file('data.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

foreach ($lines as $num => $line) {
    $parts = explode('§', $line);

    if (isset($data[$parts[1]]) && $parts[0] == $city) {
        $parts[2] = $parts[2] + $data[$parts[1]];
        $lines[$num] = implode('§', $parts);
        unset($data[$parts[1]]);
    }
}

foreach ($data as $name) {
    $lines[] = "{$city}§{$name}§1";
}

$contents = implode(PHP_EOL, $lines);

unlink('data.txt');
file_put_contents('data.txt', $contents);
?>
 
mamam mia quanto ho bestemmiato stasera su sta cosa

ero riuscito a invertire chiave valore cona rray_flip però non mi passava l'if in $data[$key] ovviamente invece del valore usciva il nome

cmq ok li ha incrementati tranne epr il nuovo


PHP:
foreach ($data as $name) {
    $lines[] = "{$city}§{$name}§1";
}

ha riscritto Bari§1§1
 
mamam mia quanto ho bestemmiato stasera su sta cosa

ha riscritto Bari§1§1

Risolto.

però mi presenta un alto problema che mi so accorto ora

in rpatica l'incremento lo fa bene però in due casi sballa la nuova aggiunta

faccio due esempi

A)

se nell'array sono presente
Tizio
Sempronio
Rossi
Rossi
Caio

in pratica se trova rossi lo incrementa di due ma se non lo trova gli assegna uno invece di due

B)
se nell'array sono presenti
Tizio
Caio
Sempronio

ma solo tizio è presente nel file

los cript incrementa Tizio e mette solo sempronio saltando caio

ho fatto dicerse prove onestaemnte ma proprio non ne cavo un ragno dal buco

alesasndro o qualceh buon anima dal cuore generoso può aiutarmi a risolvere questi due problemini?
 
Questa versione risolve il primo problema:
PHP:
<?php
$city = 'Bari';
$data = array(
    'Tizio',
    'Tizio',
    'Tizio',
    'Caio',
    'Caio',
    'Sempronio',
);

$new_data = array();
foreach ($data as $k => $v) {
    $new_data[$v] = isset($new_data[$v]) ? $new_data[$v] + 1 : 1;
}

$data = $new_data;

$lines = file('data.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

foreach ($lines as $num => $line) {
    $parts = explode('§', $line);

    if (isset($data[$parts[1]]) && $parts[0] == $city) {
        $parts[2] = $parts[2] + $data[$parts[1]];
        $lines[$num] = implode('§', $parts);
        unset($data[$parts[1]]);
    }
}

foreach ($data as $name => $num) {
    $lines[] = "{$city}§{$name}§{$num}";
}

$contents = implode(PHP_EOL, $lines);

unlink('data.txt');
file_put_contents('data.txt', $contents);
?>
Il secondo problema non sono riuscito a riprodurlo. Se nel file ho:
Codice:
Bari§Tizio§1
Il risultato è:
Codice:
Bari§Tizio§2
Bari§Caio§1
Bari§Sempronio§1
Sei sicuro di non aver sbagliato a scrivere l'array?
 
mentre guardavo un film mi è venuta l'ispirazione :cool: nona vendo modo id testarlo fino domani sera scrivo qua cosa ho pensato cosi magari vedei se l'ho raigonata giusta

aggiungerei questo controllo allo script
PHP:
    if (isset($data[$parts[1]]) && $parts[0] == $city && $data[$parts[0]]!=<$parts[1] && $data[$parts[1]]>1 ) {
        $parts[2] = $data[$parts[1]];
   $parts[1] = $data[$parts[0]];
$parts[0] = $city;
        $lines[$num] = implode('§', $parts);
        unset($data[$parts[1]]);
    }

quindi los cript completo diventerebbe

PHP:
<?php
$city = 'Bari';
$data = array(
    'Tizio',
    'Tizio',
    'Tizio',
    'Caio',
    'Caio',
    'Sempronio',
);

$new_data = array();
foreach ($data as $k => $v) {
    $new_data[$v] = isset($new_data[$v]) ? $new_data[$v] + 1 : 1;
}

$data = $new_data;

$lines = file('data.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

foreach ($lines as $num => $line) {
    $parts = explode('§', $line);


    if (isset($data[$parts[1]]) && $parts[0] == $city && $data[$parts[0]]!=<$parts[1] && $data[$parts[1]]>1 ) {
        $parts[2] = $data[$parts[1]];
   $parts[1] = $data[$parts[0]];
$parts[0] = $city;
        $lines[$num] = implode('§', $parts);
        unset($data[$parts[1]]);
    }else    if (isset($data[$parts[1]]) && $parts[0] == $city) {
        $parts[2] = $parts[2] + $data[$parts[1]];
        $lines[$num] = implode('§', $parts);
        unset($data[$parts[1]]);
    }
}
}

foreach ($data as $name) {
    $lines[] = "{$city}§{$name}§1";
}

$contents = implode(PHP_EOL, $lines);

unlink('data.txt');
file_put_contents('data.txt', $contents);
?>

che ne dici? dovrebbe risolvere perlomeno il problema A


A)

se nell'array sono presente
Tizio
Sempronio
Rossi
Rossi
Caio

in pratica se trova rossi lo incrementa di due ma se non lo trova gli assegna uno invece di due


@ edit
Ho letto ora il tuo post con due graffe mi hai evitato righe di codice

riguardo al problema B l'array mi vien fuori dalla query del primo post

PHP:
$nomi=array();
$sqlquery = "SELECT * FROM tabella WHERE citta='Bari'";
$result = mysql_query($sqlquery);
while ($linea = mysql_fetch_array($result, MYSQL_ASSOC)){
$nomi[]= $linea['nome'];

}

e comq con print_r($new_array) me le da guste Rizio=>2 Semppronio=1 Caio =>1
 
Ultima modifica:
:incazz:


Ok funge alessandro

mamam mia quanto ho bestemmiato stasera su sta cosa

ero riuscito a invertire chiave valore cona rray_flip però non mi passava l'if in $data[$key] ovviamente invece del valore usciva il nome

cmq ok li ha incrementati tranne epr il nuovo


PHP:
foreach ($data as $name) {
    $lines[] = "{$city}§{$name}§1";
}

ha riscritto Bari§1§1

nel post successivo pensavo dia ver srisolto inserendo
PHP:
<?php

$x=array_flip($data);///qui avevo inserito in una prova precedente perchè mi riprendeva il numero invece del nome cosi ho ivnertito chiavie d indici
?>
prima di
PHP:
<?php

foreach ($x as $name=>$num) {

    $lines[] = "{$city}§{$name}§{$num}";
}
?>

rimettendo com'era ora va perfettamente

grazie alesandro :beer:

se posso chiederti una cosina in + e ultima cosa per questo file

volevo isnerire la verifica se il file esiste(esempio citta.txt) continua in caso contrario crealo e diciamo che fin qui saprei farlo però vorrei porre la condizione che se non esiste lo crea inserendogli una prima riga fissa
del tipo
Citta§Nome§Num

e successivamente verificare l'esistenza di un secondo file (esempio citta2.txt) e se questo non esiste crearlo con una decina di righe fisse che decido io
(esempio
citta=Bari
Regione=Puglia
Nazione=Italia
)

tutto questo prima di far partire questo codice oggetto del topic

chiedo troppo?

Ti ringrazio comunqeu sia per la disponibilità sia per le soluzioni che offri

Grazie.
 
Ultima modifica:
se posso chiederti una cosina in + e ultima cosa per questo file

volevo isnerire la verifica se il file esiste(esempio citta.txt) continua in caso contrario crealo e diciamo che fin qui saprei farlo però vorrei porre la condizione che se non esiste lo crea inserendogli una prima riga fissa
del tipo
Citta§Nome§Num

e successivamente verificare l'esistenza di un secondo file (esempio citta2.txt) e se questo non esiste crearlo con una decina di righe fisse che decido io
(esempio
citta=Bari
Regione=Puglia
Nazione=Italia
)

tutto questo prima di far partire questo codice oggetto del topic

chiedo troppo?

Ti ringrazio comunqeu sia per la disponibilità sia per le soluzioni che offri

Grazie.

ho risolto aless con questo codice inserito in una pagina rpecedente a questo

PHP:
if(!file_exists($nome_file)){
$contenuto = "citta§nome§numero\n";
$handle=fopen($nome_file,"w"); 
fwrite($handle, $contenuto);
fclose($handle);

$contenutocfg =
 "TESTO\n";
$handlecfg=fopen($nome_fileadmin,"w"); 
fwrite($handlecfg, $contenutocfg);
fclose($handlecfg);
}


Grazie di cuore dell'aiuto funziona tutto eprfettamente :fonzie:
 

Discussioni simili