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
Forum > Tematy dowolne > php jak?
Wysłane 2014-11-15 19:18 , Edytowane 2014-11-15 19:44
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).
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);
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
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;}
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
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
Kto jest online: 0 użytkowników, 173 gości