PHP Łączenie i sumowanie wartosci kluczy tablic

0

Witam,
Mam maly aczkolwiek wielki problem z ktorym walcze od kilku dni i nie moge sobie poradzic.
Zapisuje do pliku dane w takiej strukturze jak ponizej:

1532877777||29-07-2018||nazwa||x||25||Marek
1532877156||29-07-2018||nazwa||x||20||Marek
1532877009||29-07-2018||nazwa||xl||10||Marek
1532877147||29-07-2018||nazwa||x|||25||Tomek
1532877147||29-07-2018||nazwa||x||20||Tomek
1532877147||29-07-2018||nazwa||x||10||Tomek
1532877147||29-07-2018||nazwa||x||15||Tomek
1532877147||29-07-2018||nazwa||x||25||Kasia
1532877147||29-07-2018||nazwa||x||20||Kasia
1532877147||29-07-2018||nazwa||x||15||Kasia
1532877147||29-07-2018||nazwa||x|||10||Kasia
1532877147||29-07-2018||nazwa||x||15||Kasia

Chce wyswietlic TYLKO RAZ dane imie i sume punktów [ostatni index; reszta danych jest niewazna w tym momencie] i przydzielic te punkty danemu imieniu.Czyli w tym konkretnym przypadku wynikiem ma byc:

array('Marek' => '55', 'Tomek' => '70', 'Kasia' => '85');

Za Chiny nie udaje mi sie. Udalo mi sie jedynie zczytac do tablicy i posortowac. Nawet nie wiem jak polaczyc te dwie tablice bo funkcja array_combine() nie dziala prawidlowo poniewaz jakims cudem imiona znikaja.

$tab = file('tab.txt');
					
				  $login = array();
				  $punkty = array();	
				 					
				  while(list($klucz, $wartosc) = each($tab))
					
				  {
					    $expl = explode('||', $wartosc);
					    $login[] = $expl[5];
						 $punkty[] = $expl[4];
						 
						 
						 
			
					
				  };		
				  print_r (array_combine($login, $punkty));

Rezultat tego przykladu:

Array ( [Marek ] => 10 [Tomek ] => 15 [Kasia ] => 10 [Kasia] => 5 );

Myslalem ze ta funkcja przypisze niezaleznie od kluczy klucz => wartosc a tu jednak nie.
Ktos pomoze bo odwiozą mnie do Tworek

1

W programowaniu nie ma cudów tylko błędy. Z dokumentacji array_combine (którą pewnie przeczytałeś):
http://php.net/manual/pl/function.array-combine.php

array_combine — Tworzy tablicę używając wartości jednej tablicy jako kluczy a drugiej jako wartości

Nie wiem w jaki sposób ta funkcja miała by Ci pomóc.

Żeby rozwiązać problem możesz stworzyć dodatkową tablicę np.
$sum = [];

Potem iterujesz po linijkach pliku, sprawdzasz czy w tablicy $sum istnieje już element dla danego imienia (isset), jeżeli nie to przypisujesz wartość z pliku do klucza imienia ($sum['imie'] = 25), jak już istnieje to dodajesz ($sum['imie'] += 25).

Na koniec wyświetlasz wyniki:

foreach ($sum as $name => $value) {
    echo $name . ' : ' . $value . PHP_EOL;
}
0
Markuz napisał(a):

W programowaniu nie ma cudów tylko błędy. Z dokumentacji array_combine (którą pewnie przeczytałeś):
http://php.net/manual/pl/function.array-combine.php

array_combine — Tworzy tablicę używając wartości jednej tablicy jako kluczy a drugiej jako wartości

Nie wiem w jaki sposób ta funkcja miała by Ci pomóc.

Żeby rozwiązać problem możesz stworzyć dodatkową tablicę np.
$sum = [];

Potem iterujesz po linijkach pliku, sprawdzasz czy w tablicy $sum istnieje już element dla danego imienia (isset), jeżeli nie to przypisujesz wartość z pliku do klucza imienia ($sum['imie'] = 25), jak już istnieje to dodajesz ($sum['imie'] += 25).

Na koniec wyświetlasz wyniki:

foreach ($sum as $name => $value) {
    echo $name . ' : ' . $value . PHP_EOL;
}

Nie rozumiem co ma mzrobic z tątablicą sum[].
Problem w tym ze struktura pliku moze byc rozna. Moze to wszystko byc pomieszane. Co prawda wartosci zawsze sa takie same. Czyli zawsze bedzie pięć imion takich samych z pięcioma wartościami od 5-25 ale mogą być pomieszane.Moglbys w miare wolnego czasu podpowiedziec bardzoiej prosciej [zakladam ze prosciej sie juz nie da] Jestem laikiem i dla mnie to czarna magia. P

0

Specjalnie nie dałem Ci gotowej odpowiedzi, pomęcz się trochę - poczytaj o tablicach w PHP, o dodawaniu i o funkcji isset.
Tablica $sum będzie przechowywała sumę punktów imion.

Co to znaczy, że "Może to wszystko być pomieszane"?

$sum = []; // tak tworzymy tablice
$sum['a'] = 1; // tak dodajemy element o danym kluczu i wartości
$sum['a'] += 2; // tak dodajemy wartość do istniejącej wartości w tablicy
var_export($sum['a']); // zwróci 3 (1 + 2)

// to poniżej to inicjalizacja tablicy, [] można używać od wersji php 5.4.0, te 2 zapisy robią dokładnie to samo
$m = [];
$m = array();
0

To nie o to chodzi ze nic nie robie bo probuje od 3 dni i juz mi sie wszystko pitoli. Sprawdzalem wszelkie mozliwe funkcje array ale nie jestem sam w stanie sobie poradzic z tym.

Pomieszane znaczy ze imiona (te linie) moga byc pomieszane z innymi wiec imie "Marek" lub "Kasia" nie bedzie wystepowalo piec razy z rzedu ale moze byc: marek, kasia, marek, tomek , janek, kasia itd.... Oczywiscie juz skracam tutaj do samych imion ale chodzi o cale linie. Tych linnii moze byc (imion) kilkadziesiat x 5 to da kilkaset linii do przeszukania

0

Moze jest tu ktos kto odplatnie zgodzi sie mi pomoc.?

0

Zrobiłem Twój przykład, tyle że zamiast czytać z pliku, czytałem z tablicy na tej samej zasadzie. Niepotrzebnie kombinowałeś w ogóle z dwiema tablicami.

<?php
$text = [
    "1532877777||29-07-2018||nazwa||x||25||Marek",
    "1532877156||29-07-2018||nazwa||x||20||Marek",
    "1532877009||29-07-2018||nazwa||xl||10||Marek",
    "1532877147||29-07-2018||nazwa||x||25||Tomek",
    "1532877147||29-07-2018||nazwa||x||20||Tomek",
    "1532877147||29-07-2018||nazwa||x||10||Tomek",
    "1532877147||29-07-2018||nazwa||x||15||Tomek",
    "1532877147||29-07-2018||nazwa||x||25||Kasia",
    "1532877147||29-07-2018||nazwa||x||20||Kasia",
    "1532877147||29-07-2018||nazwa||x||15||Kasia",
    "1532877147||29-07-2018||nazwa||x||10||Kasia",
    "1532877147||29-07-2018||nazwa||x||15||Kasia"
];

$sum = [];
foreach($text as $row)
{
    list($s1,$s2,$s3,$s4,$value,$name) = explode("||", $row);
    
    if(!isset($sum[$name])){
        $sum[$name] = 0;
    }
    
    $sum[$name] += $value;
}
var_dump($sum);
0
mefsh napisał(a):

Zrobiłem Twój przykład, tyle że zamiast czytać z pliku, czytałem z tablicy na tej samej zasadzie. Niepotrzebnie kombinowałeś w ogóle z dwiema tablicami.

<?php
$text = [
    "1532877777||29-07-2018||nazwa||x||25||Marek",
    "1532877156||29-07-2018||nazwa||x||20||Marek",
    "1532877009||29-07-2018||nazwa||xl||10||Marek",
    "1532877147||29-07-2018||nazwa||x||25||Tomek",
    "1532877147||29-07-2018||nazwa||x||20||Tomek",
    "1532877147||29-07-2018||nazwa||x||10||Tomek",
    "1532877147||29-07-2018||nazwa||x||15||Tomek",
    "1532877147||29-07-2018||nazwa||x||25||Kasia",
    "1532877147||29-07-2018||nazwa||x||20||Kasia",
    "1532877147||29-07-2018||nazwa||x||15||Kasia",
    "1532877147||29-07-2018||nazwa||x||10||Kasia",
    "1532877147||29-07-2018||nazwa||x||15||Kasia"
];

$sum = [];
foreach($text as $row)
{
    list($s1,$s2,$s3,$s4,$value,$name) = explode("||", $row);
    
    if(!isset($sum[$name])){
        $sum[$name] = 0;
    }
    
    $sum[$name] += $value;
}
var_dump($sum);

Serdeczne dzieki za pomoc ale cos nie jest tak z tym. Twoj przyklad dziala na tej Twojej tablicy ale jak wstawie plik to juz nie dziala prawidlowo. Generalnie wczoraj mialem sporo na glowie i sie lekko pomylilem bo napisalem ze zawsze bedzie piec imion i piec wartosci takich samych. Nie bedzie to piec imion zawsze po kolei. Mogą byc ale nie musza moze byc tak:

1532877777||29-07-2018||xx||x||25||Marek
1532877156||29-07-2018||xx||x||20||Marek
1532877156||29-07-2018||xx||x||5||Marek
1532877009||29-07-2018||xx||x||10||Marek
1532877147||29-07-2018||xx||x||25||Tomek
1532877147||29-07-2018||xx||x||20||Tomek
1532877147||29-07-2018||xx||x||15||Kasia
1532877147||29-07-2018||xx||x||10||Kasia
1532877147||29-07-2018||xx||x||5||Tomek
1532877147||29-07-2018||xx||x||25||tata
1532877156||29-07-2018||xx||x||15||Marek
1532877147||29-07-2018||xx||x||5||tata
1532877147||29-07-2018||xx||x||10||Tomek
1532877147||29-07-2018||xx||x||10||Tomek
1532877147||29-07-2018||xx||x||20||Kasia
1532877147||29-07-2018||xx||x||10||Kasia
1532877147||29-07-2018||xx||x||5||Kasia
1532877147||29-07-2018||xx||x||20||tata

I w tym momencie dziwne rzeczy sie dzieja bo dwa ostatnie klucze zamiast byc zsumowane sa rozdzielone. Powinna byc suma 50 a jest 30 i 20.
Z wczesniejszymi jest ok tylko na koncu. Jak dodam kolejne inne imiona to tez sie kaszani na koncu tylko.

array(5) { ["Marek "]=> int(75) ["Tomek "]=> int(70) ["Kasia "]=> int(60) ["tata "]=> int(30) ["tata"]=> int(20) }
1

Jedno "tata " ma spacje, drugie nie ma. Wszystko działa prawidłowo, nic nie mówiłeś o tym, że np spacje przed i po mają być usuwane, że duże i małe litery mają być nie brane pod uwagę. Po prostu użyj trima na kluczu tablicy, aby usunąć spacje przed i po, wtedy się zsumuje poprawnie.

0
mefsh napisał(a):

Jedno "tata " ma spacje, drugie nie ma. Wszystko działa prawidłowo, nic nie mówiłeś o tym, że np spacje przed i po mają być usuwane, że duże i małe litery mają być nie brane pod uwagę. Po prostu użyj trima na kluczu tablicy, aby usunąć spacje przed i po, wtedy się zsumuje poprawnie.

Miales racje. Dodalem:

$name = chop($name);

i dziala idealnie. Dziekuje jeszcze raz za pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1