Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sumowanie danych na 2 plikach
Forum PHP.pl > Forum > Gotowe rozwiązania
piotrdd2
Mam dwa pliki, zapisane są w nich dane np. w takim stylu:

Pierwszy plik:
5|^^^|Adam
8|^^^|Bartek
1|^^^|Kamil

Drugi plik:
2|^^^|Bartek
1|^^^|Adam
3|^^^|Wojtek
8|^^^|Kamil

Plik pierwszy i drugi mogą zawierać różną ilość danych, w pliku pierwszym może być np. login Ziomek i odpowiadająca jemu liczba, a w drugim już tego loginu nie będzie – lub odwrotnie.

Chodzi mi o to jak zrobić aby zsumowało liczby według odpowiadających im loginów

tzn.
6|^^^|Adam
10|^^^|Bartek
9|^^^|Kamil
3|^^^|Wojtek

Jakich do tego trzeba użyć funkcji?
spenalzo
[manual:06f7652466]file()[/manual:06f7652466]
[manual:06f7652466]if()[/manual:06f7652466]
[manual:06f7652466]for()[/manual:06f7652466]
[manual:06f7652466]count()[/manual:06f7652466]
[manual:06f7652466]explode()[/manual:06f7652466]

[scanner] spenalzo, sorki za modyfikację, testowałem nowe BBCode smile.gif
piotrdd2
chyba sobie z tym nie poradzę sad.gif

Zrobiłem skrypt na określony login (za każdym razem trzeba edytować skrypt wpisując inny $login= "Ferdek") , teraz by trzeba było coś zastosować aby przetwarzał wszystkie loginy. Próbowałem pobrać wszystkie loginy z oddzielnego pliku i zastosować pętle while, ale przetwarza tylko dwa loginy.

Pomoże ktoś?
scanner
Do bólu:
Pokaż odpowiedni kawałek kodu
piotrdd2
fragment chyba w niczym nie pomoże, lepiej chyba cały:

[php:1:c7d9b0d105]
<?
$login= "Eryk";

$fil="wyniki/zw1.txt"; //plik z danymi
$tablic=file($fil); //robie z pliku tablice
$il=count($tablic); //licze ilość elementów w tablicy

for($i=0; $i<=$il-1; $i++){
$czes=explode("|^^^|", $tablic[$i]); //dziele linie w pliki na kawałki
if(ereg(($login),$czes[1])){ //sprawdzam czy taki nic nie jest juz zapisany

$file="wyniki/zw2.txt"; //plik z danymi
$tablica=file($file); //robie z pliku tablice
$ile=count($tablica); //licze ilość elementów w tablicy
for($i=0; $i<=$ile-1; $i++){
$czesc=explode("|^^^|", $tablica[$i]); //dziele linie w pliki na kawałki
if(ereg(($login),$czesc[1])){ //sprawdzam czy taki nic nie jest juz zapisany

$cz = $czesc[0]+$czes[0];
echo(" $cz");
$plik=fopen('list.txt', "a"); // jak wszystko jest ok to zapisuje dane
flock($plik, 2);
fwrite($plik, "{$cz}|^^^|{$login}n"); // n- oznacza przejscie do następnej linii...
flock($plik, 3);
fclose($plik);
exit;
}
}
$cz = $czes[0];

$plik=fopen('list.txt', "a"); // jak wszystko jest ok to zapisuje dane
flock($plik, 2);
fwrite($plik, "{$cz}|^^^|{$login}n"); // n- oznacza przejscie do następnej linii...
flock($plik, 3);
fclose($plik);
}
}
$file="wyniki/zw2.txt"; //plik z danymi
$tablica=file($file); //robie z pliku tablice
$ile=count($tablica); //licze ilość elementów w tablicy

for($i=0; $i<=$ile-1; $i++){
$czesc=explode("|^^^|", $tablica[$i]); //dziele linie w pliki na kawałki
if(ereg(($login),$czesc[1])){ //sprawdzam czy taki nic nie jest juz zapisany
$cz = $czesc[0];

$plik=fopen('list.txt', "a"); // jak wszystko jest ok to zapisuje dane
flock($plik, 2);
fwrite($plik, "{$cz}|^^^|{$login}n"); // n- oznacza przejscie do następnej linii...
flock($plik, 3);
fclose($plik);
exit;
}
}

?>[/php:1:c7d9b0d105]

Działa tylko dla okreslonego loginu
evo
nie chce mi sie interpretowac twojego kodu :wink:
[php:1:f7e0b34fa5]<?php
$separator='|^^^|';
$p1=file('plik1.txt');
$p2=file('plik2.txt');
$result=array();

for($i=0;$i<count($p1);$i++){
$ex1=explode($separator,trim($p1[$i]));
for($i2=0;$i2<count($p2);$i++){
$ex2=explode($separator,trim($p2[$i]));
if($ex1[1]==$ex2[1]){
$result[]=($ex1[0]+$ex2[0]).$separator.$ex1[1];
continue;
}
$result[]=$ex2[0].$separator.$ex2[1];
}
$result[]=$ex1[0].$separator.$ex1[1];
}

?>[/php:1:f7e0b34fa5]

1.To tak na szybko bez sprawdzania. Rozszerz se to o kompatybilnosc z wielkimi i malymi literami by 'lolek'=='Lolek'
2. Skrypt nie bedzie dzialal poprawnie gdy w 1 pliku mamy dwa taklie same loginy, jesli chcesz by to uwzglednial to pomysl 8)
3. wynik jet w tablicy $result
piotrdd2
W moim skrypcie znajduje się polecenie exit;, myśle że dla tego nie przetważa kolejnych zmiennych!
Czy można je jakims innym poleceniem zastąpić aby nadal zatrzymywał, ale żeby powrócił na początek i pobrał następny login??

$dir = "./loginy/"; - w tym katalogu znajdują się pliki $login.txt

[php:1:6df8e0e03a]<?php

$i = 1;
while ($i <= 10):
$dir = "./loginy/";
$katalog = opendir($dir);
while($login = readdir($katalog)){
$ext = explode(".", $login);
if($ext[count($ext) - 1] == "txt"){

echo $login;
$wie= "list"; //eeeeeeeeee
$file="$wie.txt"; //plik z danymi
$tablica=file($file); //robie z pliku tablice
$ile=count($tablica); //licze ilość elementów w tablicy

for($i=0; $i<=$ile-1; $i++){
.....
exit; //tuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
}
.....
exit; //tuuuuuuuuuuuuuuuu
}
}
}
}
closedir($katalog);
$i++;
endwhile;
?>[/php:1:6df8e0e03a]
evo
tu masz poprawiony moj kod:

[php:1:05ce631167]<?php
$separator='|^^^|';
$p1=file('plik1.txt');
$p2=file('plik2.txt');
$result=array();
foreach($p1 as $k1=>$v1){
$ex1=explode($separator,$v1);
foreach($p2 as $k2=>$v2){
$ex2=explode($separator,$v2);
if($ex1[1]==$ex2[1]){
$result[]=($ex1[0]+$ex2[0]).$separator.$ex1[1];
unset($p1[$k1]);
unset($p2[$k2]);
}
}
}
$result=array_merge($p1,$p2,$result);

print_r($result);
?>[/php:1:05ce631167]


Cytat
W moim skrypcie znajduje się polecenie exit;, myśle że dla tego nie przetważa kolejnych zmiennych!
Czy można je jakims innym poleceniem zastąpić aby nadal zatrzymywał, ale żeby powrócił na początek i pobrał następny login??


mozna uzywajac petli while() w ten sposob:
[php:1:05ce631167]<?php
while(true){
//jakis kod

//tu chcesz powrucic do poczatku
continue;


//tu chcesz przerwac
break;


}
?>[/php:1:05ce631167]
piotrdd2
Dzięki za kod evo.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.