Trovare un array in txt e modificarlo

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?
 

Monital

Utente Attivo
15 Apr 2009
778
2
18
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
 

alessandro1997

Utente Attivo
6 Ott 2009
5.302
1
0
26
Roma
alessandro1997.netsons.org
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?
 

Monital

Utente Attivo
15 Apr 2009
778
2
18
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
 

Monital

Utente Attivo
15 Apr 2009
778
2
18
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:

alessandro1997

Utente Attivo
6 Ott 2009
5.302
1
0
26
Roma
alessandro1997.netsons.org
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);
?>
 

Monital

Utente Attivo
15 Apr 2009
778
2
18
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:

Monital

Utente Attivo
15 Apr 2009
778
2
18
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:

alessandro1997

Utente Attivo
6 Ott 2009
5.302
1
0
26
Roma
alessandro1997.netsons.org
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);
?>
 

Monital

Utente Attivo
15 Apr 2009
778
2
18
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
 

Monital

Utente Attivo
15 Apr 2009
778
2
18
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?
 

alessandro1997

Utente Attivo
6 Ott 2009
5.302
1
0
26
Roma
alessandro1997.netsons.org
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?
 

Monital

Utente Attivo
15 Apr 2009
778
2
18
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:

Monital

Utente Attivo
15 Apr 2009
778
2
18
: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:

Monital

Utente Attivo
15 Apr 2009
778
2
18
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
Autore Titolo Forum Risposte Data
B Non riesco a trovare i cognomi con i caratteri speciali in Access (Microsoft 365) MS Access 0
MarcoGrazia Trovare record nel database partendo da id non sequenziali PHP 6
R Trovare la Tabella del pagamento su WooCommerce WordPress 0
G Nuova Idea su come trovare clienti per sviluppo web Discussioni Varie 6
W Errore di run-time di Microsoft VBScript error '800a0035' Impossibile trovare il file Classic ASP 0
W Impossibile Trovare Provider Classic ASP 7
G [PHP] Trovare tutti i file a un arl PHP 2
K [PHP] Trovare le cartelle online PHP 1
W [PHP] dirmi dove posso trovare.. Offerte e Richieste di Lavoro e/o Collaborazione 1
E salve tutti spero si essere di aiuto e di trovare aiuto Presentati al Forum 2
L Trovare immagini belle per siti Discussioni Varie 1
Federico.Marcelo Come trovare una corretta mailing list italiana Email Marketing 7
C [PHP] Trovare simbolo unicode in stringa PHP 1
V [Visual Basic] trovare versione di un .exe con vb6 Visual Basic 0
D [PHP] Trovare le cartelle online PHP 3
N [VENDO] Articolo SEO "I migliori siti per trovare offerte di lavoro in Germania". Offerte e Richieste di Lavoro e/o Collaborazione 0
C [PHP] Trovare se la parola è presente in una pagina PHP 1
V [PHP] Non riesco a trovare errore PHP 25
C Trovare coordinate del quadrato intorno ad un punto centrale conoscendo la distanza PHP 1
filippino Chiavi a corrispondenza inversa per i risultati organici? (Era: come NON farsi trovare con date chia SEO e Posizionamento 4
S Comando per trovare file PHP 0
F Trovare foto da Codici Prodotti E-Commerce 6
Z Tool per trovare Long Tail SEO e Posizionamento 0
MarcoGrazia Come trovare parole similari nel database? PHP 1
V Trovare numero unico minore PHP 1
IImanuII Trovare del testo in una stringa. PHP 1
IImanuII Trovare un'immagine PHP 0
W Dove trovare temi per Drupal 7 gratuiti ed affidabili? CMS (Content Management System) 1
C Trovare parole con le doppie PHP 2
A GoGo Voglio creare un sito come ustream.tv, dove posso trovare uno script come ustream.tv? Discussioni Varie 0
M PHP/MySQL: Sistema per trovare multiaccount PHP 7
D Trovare dimensione cella tabella Javascript 3
asevenx trovare nome dell'utente dopo login PHP 1
F Trovare clienti Discussioni Varie 3
F Trovare una riga conoscendo un valore (MYSQL) PHP 2
novello88 Trovare domini liberi e/o scaduti Domini 5
StarFish [Prestashop] Dove posso trovare dei template gratuiti per Prestashop CMS (Content Management System) 2
A Trovare un "percorso" in un file PHP... WordPress 1
S trovare span con classe dentro un div jQuery 2
neo996sps Dove trovare omini bianchi 3D [era: Omini bianchi, avete presente?] Webdesign e Grafica 0
emanuelevt trovare file PHP 1
G dove posso trovare un modello di disclaimer e di privacy? Leggi, Normative e Fisco 2
LaKanka ereg() per trovare file di cui so solo parte del nome PHP 3
G dove posso trovare i forum con le cartelle? HTML e CSS 1
max1850 Trovare il num. di ricerche mensili di una keyword SEO e Posizionamento 2
G Trovare su Google il proprio sito dalle immagini SEO e Posizionamento 7
L Dove posso trovare pulsanti in flash? Flash 3
K Impossibile trovare ISAM installabile ASP.NET 1
A Soulmet: annunci online per incontrare nuovi amici e trovare l'anima gemella. Presenta il tuo Sito 1
L Come trovare una licenza Flash 1

Discussioni simili