Forum > Tematy dowolne > php jak?

Strona 1 z 1 1
skocz

skatan

  • skatan
  • wiadomość Użytkownik

  • 1767 wypowiedzi

Wysłane 2014-11-15 19:18 , Edytowane 2014-11-15 19:44

jak w temacie

pobieram sobie z postgre selecta
wyrzucam go na stronke jest ok

i teraz jak porównać 3 dane które obrabiam w każdym wierszu  zwracanym z bazy ?

mam
id, początek, koniec

powiedzmy
id to jest konkretny samochód

pocz, kon to stan licznika

czyli wpada id ze stanem początkowym i końcowym 

ale dane poczatkowe i koncowe sa wpisywane ręcznie wiec mogą być problemy
a to ma zostać wyświetlone właśnie tj jak będzie problem z danymi

z chęcią wrzuciłbym to w oddzielne tabele każda dla innego id
ale nie wiem jak je dynamicznie robić w pętli jak pobieram wiersz z selecta.

coś ala  dla $id=1

$t_1[]= $km_pocz;
$t_1[]= $km_kon;

ale ta jedynka ma się zmieniać właśnie
coś ala

$t_$id[]

jak to w php'cu  zrobić ?

albo jakieś inne rozwiązanie

bo muszę sprawdzić czy
świeżo pobrane km_początkowe >= ostatnio podane km_koncowe dla konkretnego id

Ryzen 7 9800X3D, MSI MPG X870E CARBON WIFI , Arctic Liquid Freezer III 280, G.Skill Trident Z5 Royal Neo DDR5 32 GB 6400MHz CL30, ASUS TUF 3060Ti, SSD Samsung 980 Pro 2TB, 2x Gigabyte AORUS 2TB, SSeasonic FOCUS GX-850 v4 ATX 3.1 PCIe 5.1 Black Gold 850W

adir

  • adir
  • wiadomość Użytkownik

  • 974 wypowiedzi

Wysłane 2014-11-15 19:46 , Edytowane 2014-11-15 20:00

Zawsze możesz posortować najpierw te dane po id i np. dacie dodania, ułatwi to sprawdzanie.


while ($row = pg_fetch_assoc($result))
{
$pocz[$row['id']][] = $row['pocz'];
$konc[$row['id']][] = $row['konc'];
}

aby przyspieszyć sprawdzanie możesz zrobić zmienną pomocniczą

$last_end = array();

while ($row = pg_fetch_assoc($result))
{
$rid = $row['id'];
if (isset($last_end[$rid]) AND $row[pocz] < $last_end[$rid])
  {
  die ('cos nie tak :)');
  }
$pocz[$rid][] = $row['pocz'];
$konc[$rid][] = $last_end[$rid] = $row['konc'];
}

to taki przekorny przykład warunek powinien być odwrotny i wyniki można trzymać w jednej zmiennej (tablicy, la wszystkich pojazdów).

i5-13500, Gigabyte B760 GAMING X, MSI RTX 4060 GAMING X, Kingston FURY Renegade Black DDR4 32GB 3600MHz CL16, Kingston KC3000 2TB M.2, Spartan 5 max

adir

  • adir
  • wiadomość Użytkownik

  • 974 wypowiedzi

Wysłane 2014-11-15 19:57 , Edytowane 2014-11-15 20:05

inny sposób, wszystkie dane w jednej tablicy więc łatwe do wyświetlenia

$last_end = array();
$seq = 0;

while ($row = pg_fetch_assoc($result))
{
$rid = $row['id'];
$tab[$seq] = $row;
// jak nie chcesz wszystkich pol z selecta to np.
// $tab[$seq]['id'] = $row['id'];

$tab[$seq]['status'] = '';

if (isset($last_end[$rid]) AND $row[pocz] < $last_end[$rid]) $tab[$seq]['status'] = 'błąd';

$last_end[$rid] = $row['konc'];
$seq++;
}

print_r($tab);

i5-13500, Gigabyte B760 GAMING X, MSI RTX 4060 GAMING X, Kingston FURY Renegade Black DDR4 32GB 3600MHz CL16, Kingston KC3000 2TB M.2, Spartan 5 max

skatan

  • skatan
  • wiadomość Użytkownik

  • 1767 wypowiedzi

Wysłane 2014-11-15 20:30

sortowanie jest w select'ie zrobione po dacie później po innym id niż to co podałem

to id o którym mówie i km_pocz km_kon to są już nieważne aż tak  ale za ich pomocą dopiero muszę wypluć chociażby
inny kolor czcionki jak źle podana będzie dana i Lp. wpisu z wcześniejszym tym samym id samochodu

dziś browarzę więc jutro jeszcze raz zobaczę co sam napisałem i gdzie był błąd
bo całkiem podobnie robiłem tylko mi się to wykrzaczało.

a co do
while ($row = pg_fetch_assoc($result))
{
$pocz[$row['id']][] = $row['pocz'];
$konc[$row['id']][] = $row['konc'];
}

to jak dostać się do ostatniego elementu ? 

chociaż to w sumie niepotrzebne mi bo dane nie muszą być pamiętane
i może lepiej zawsze wrzucać to na

$pocz[$row['id']][0] = $row['pocz'];
$konc[$row['id']][0] = $row['konc'];  ????

nadpiszę zawsze 1 elemet więc nie muszę szukać ostatniej pozycji :)

 if wyglądałby wtedy tak

if ( $row['pocz'] >= $konc[$row['id']][0] )

choć teraz jak na to patrzę to po kija wrzucam początkowe kilometry w tablicę xD jak o kant d... mi są one potrzebne xD
jedyne co potrzebuję do porównania to świeże początkowe dla konkretnego id i stare końcowe.

ale jestem .... xD

długa przerwa w php'ie i takie problem masakra :/
ide browara strzelić

a napisz mi czy dobrze mi się wydaje w tym co napisałem
i powinno działać czy koncepcja zła

Ryzen 7 9800X3D, MSI MPG X870E CARBON WIFI , Arctic Liquid Freezer III 280, G.Skill Trident Z5 Royal Neo DDR5 32 GB 6400MHz CL30, ASUS TUF 3060Ti, SSD Samsung 980 Pro 2TB, 2x Gigabyte AORUS 2TB, SSeasonic FOCUS GX-850 v4 ATX 3.1 PCIe 5.1 Black Gold 850W

adir

  • adir
  • wiadomość Użytkownik

  • 974 wypowiedzi

Wysłane 2014-11-15 22:36 , Edytowane 2014-11-15 22:38

Niepotrzebny index [0] skoro chcesz przechowywać tylko ostatnią wartość.
Starczy $konc[$row['id']].

Następnie w pętli można zrobić porówanie

$tab[$seq]['status'] = '';
if (isset($konc[$row['id']]) AND $row['pocz'] < $konc[$row['id']) $tab[$seq]['status'] = ' km_error';
$seq++;

i przy wyświetlaniu tabeli z wynikami
for ($t = 0, $t_cnt = count ($tab); $t < $t_cnt; $t++)
{
if ($t % 2 == 0) $class = 'even_tr'; else $class = 'odd_tr';

echo '<tr class="' . $class . $tab[$i]['status'] . '"><td>.....</td></tr>';
}

W CSS
.even_tr TD {background-color : #FFFFFF}
.odd_tr TD {background-color : #EEEEEE}
.km_error TD { background-color: red !important;}

i5-13500, Gigabyte B760 GAMING X, MSI RTX 4060 GAMING X, Kingston FURY Renegade Black DDR4 32GB 3600MHz CL16, Kingston KC3000 2TB M.2, Spartan 5 max

skatan

  • skatan
  • wiadomość Użytkownik

  • 1767 wypowiedzi

Wysłane 2014-11-16 00:37

jutro sprawdzę xD

ale 
tabela wyświetlana jest od razu przy pobieraniu wiersza w while'u

poza tym ten for nie jest chyba potrzebny :)

modulo 2 styknie w if'ie i tylko incrementacja jakieś zmiennej

jak wstane, wszamię coś to się pobawię :)

a teraz @dj_luke muszę dorwać :)

jutro zdam relację
i dzięki

Ryzen 7 9800X3D, MSI MPG X870E CARBON WIFI , Arctic Liquid Freezer III 280, G.Skill Trident Z5 Royal Neo DDR5 32 GB 6400MHz CL30, ASUS TUF 3060Ti, SSD Samsung 980 Pro 2TB, 2x Gigabyte AORUS 2TB, SSeasonic FOCUS GX-850 v4 ATX 3.1 PCIe 5.1 Black Gold 850W

adir

  • adir
  • wiadomość Użytkownik

  • 974 wypowiedzi

Wysłane 2014-11-16 00:48

Jeśli w while od razu wyświetlasz dane to oczywiście for niepotrzebny :)
Ok miłej zabawy.

i5-13500, Gigabyte B760 GAMING X, MSI RTX 4060 GAMING X, Kingston FURY Renegade Black DDR4 32GB 3600MHz CL16, Kingston KC3000 2TB M.2, Spartan 5 max

skatan

  • skatan
  • wiadomość Użytkownik

  • 1767 wypowiedzi

Wysłane 2014-11-16 22:23

ok dzięki śmiga wszystko :)

sprawdziłem dla 3 różnych id  i ładnie robi się tablica dla każdego id

array(3) { [1]=> int(20) [2]=> int(30) [8]=> int(430) }

i zawiera tylko km końcowe

Ryzen 7 9800X3D, MSI MPG X870E CARBON WIFI , Arctic Liquid Freezer III 280, G.Skill Trident Z5 Royal Neo DDR5 32 GB 6400MHz CL30, ASUS TUF 3060Ti, SSD Samsung 980 Pro 2TB, 2x Gigabyte AORUS 2TB, SSeasonic FOCUS GX-850 v4 ATX 3.1 PCIe 5.1 Black Gold 850W
Strona 1 z 1 1
skocz

Kto jest online: 0 użytkowników, 173 gości