Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Podmiana danych w pliku
Forum PHP.pl > Forum > PHP
TwojPan
Witam,
Ju opisuje problem

Mam plik ktory wywoluje do tablicy. W srodku jest tak:

  1. pierwszy index o||14a||14b||28a


Mam pole select z dwoma polami: 14 i 28.

Probem w tym ze w pliku moze byc jak powyzej lub te dane mogą być różne tj:

14a,14b,14c,28a,28b,28c i byc w roznych miejscach pomiedzy separatorem ||

np. tak

  1. pierwszy index o||28b||14c


  1. pierwszy index o||14c||14c||28b


  1. pierwszy index o||14a


  1. pierwszy index o||14a||28a||28b


  1. pierwszy index o||28c||28b||28a


Teraz posyłając z forma np. 14 potrzebuje zapisać liczbe ktorej jeszcze nie ma czyli sle 14 i teraz sprawdzam gdzie jest 14a badz 14b badz 14c i jesli gdzies jest tylko 14a drugiego indeksu nie ma to zapisuje mi 14b w kolejnym indeksie a jesi są 14a i 14b i trzeci indeks jest pusty i sle rowniez 14tke to zapisuje mi 14c. Tak samo z liczba 28.

Przykladowo sle 14tke a w pliku jest tak:

  1. pierwszy index o||14a


I teraz nie ma 14b wiec zapisuje mi w pliku w kolejnym indeksie 14b

  1. pierwszy index o||14a||14b


lub sląc 28 i w pliku jest tak:

  1. pierwszy index o||14a||28c


Zapisuje mi 28a jako trzeci index

  1. pierwszy index o||14a||28c||28a


Za nic w swiecie nie potrafie tego ugrysc.
em1X
Przepraszam, ale nie rozumiem smile.gif Nie tłumacz dla siebie, tłumacz dla innych.
TwojPan
Cytat(em1X @ 28.09.2013, 11:56:52 ) *
Przepraszam, ale nie rozumiem smile.gif Nie tłumacz dla siebie, tłumacz dla innych.

Wiem ale ciezko mi to wytlumaczyc wlasnie.

To moze jeszcze raz.

Mam formularz z dwoma liczbami: 14 i 28.
Plik zawierac moze rozne liczby. Poniewaz liczba jest tak samo nazwa pliku musialem dodac przyrostki bo znajduja sie w tym samym katalogu i dlatego zamiast 14 jest 14a, 14b, 14c, 28a,28b,28c

Najgorsze to wytlumaczyc to wszystko smile.gif

Posyłając 14tkę musze sprawdzić ktore z nich istnieje i przypisac kolejny wolny. Wiec jesli jest tak w pliku:

  1. costam 0||14c||14a


Brakuje 14b jako trzeci index i trzeba go dodac zeby wyszlo tak:

  1. costam 0||14c||14a||14b


Tyle ze moze byc tylko jeden index np:

  1. costam 0||14c


I brakuje tutaj 14a jak i 14b i teraz nie wazne ktory bedzie pierwszy. Moze byc a lub b

  1. costam 0||14c||14a


a przy kolejnym ewentualnym poslaniu formularza dopisze mi

  1. costam 0||14c||14a||14b


Prócz liczby 14 jest jeszcze druga w formularzu - 28 i moze ona se znajdowac rowniez w pliku.
Zasada sprawdzania i sapisu identyczna. Np jesli bedzie tak:

  1. costam 0||14c||14a


I posle liczbe 28

To zapisze mi pierwsza obojetnie jaka a, b lub c

  1. costam 0||14c||14a||28a


lub

  1. costam 0||14c||14a||28b


lub

  1. costam 0||14c||14a||28c


Mam nadzieje ze teraz juz zrozumiale smile.gif
em1X
1) Można zobaczyć formularz?
2) Można zobaczyć katalog z plikami?
3) Można zobaczyć zawartość plików?
4) Do czego Ci to potrzebne?
TwojPan
Cytat(em1X @ 28.09.2013, 12:14:03 ) *
1) Można zobaczyć formularz?
2) Można zobaczyć katalog z plikami?
3) Można zobaczyć zawartość plików?
4) Do czego Ci to potrzebne?


Poptrzebuje poprostu.

Mylalem nad czyms takim jak:

  1. if(($ex[1]=="14a"))
  2. {
  3. $_POST['newbus'] = '14b';
  4. }
  5. if(($ex[1]=="14b"))
  6. {
  7. $_POST['newbus'] = '14c';
  8. }
  9.  
  10.  
  11.  
  12.  
  13.  
  14. if(($ex[1]=="28a"))
  15. {
  16. $_POST['newbus'] = '28b';
  17. }
  18. if(($ex[1]=="28b"))
  19. {
  20. $_POST['newbus'] = '28c';
  21. }
  22.  
  23. print $_POST['newbus']; // to pole z forma
Ale to nie dziala sad.gif W taki sposob trzebaby sprawdzac jeszcze index [2] i [3] ale to zupelnie jest bez sensu ale chyba teraz wiesz o co chodzi.

Danych nie podam bo to jest tylko część sporego skryptu a plik ma 2500 linii
em1X
Nie udzieliłeś mi odpowiedzi na pytania, pokazujesz mi rzeczy wyrwane z kontekstu. Nie jestem w stanie Ci pomóc.
TwojPan
Cytat(em1X @ 28.09.2013, 12:29:17 ) *
Nie udzieliłeś mi odpowiedzi na pytania, pokazujesz mi rzeczy wyrwane z kontekstu. Nie jestem w stanie Ci pomóc.
Jak chcesz mi pomoc widzac formularz. Formularz to formularz.

  1. <select name=\"newbus\">";
  2. print "<option VALUE=\"14\">14</OPTION>";
  3. print "<option VALUE=\"28\">28</OPTION></select>";


Jak mam Ci katalog pokazac ? smile.gif poprostu jest tam plik ktory zawiera linie ktore pokazuje j.w i do niego ma sie zapisywac. Chodzi mi tylko o zaps do tego pliku nic wiecej. Inne pliki nie sa z tym zwiazane w tej czesci.

Plik ktory wywoluje zawiera 2500 linii i jest powiazany z innymi plikami konfiguracyjnymi wiec nie widze sensu pokazywania tego.
em1X
1) Ok jest już trochę jaśniej. A możesz wytłumaczyć dlaczego pierwszą wartością w pliku jest zawsze jakieś, cytuję: "cośtam 0" albo "pierwszy index 0". Ta wartość ma być pomijana? Jest tam jakaś wartość opisowa? Do czego ona służy? Lepiej jakbyś zawsze prawdziwe dane wyświetlał jakie występują zamiast wymyślać przykłady.

2) Czy plik z wartościami zajmuje tylko jedną linijkę? Dlatego prosiłem o prawdziwą zawartość pliku.
TwojPan
Cytat(em1X @ 28.09.2013, 12:58:08 ) *
Ok jest już trochę jaśniej. A możesz wytłumaczyć dlaczego pierwszą wartością w pliku jest zawsze jakieś, cytuję: "cośtam 0" albo "pierwszy index 0". Ta wartość ma być pomijana? Jest tam jakaś wartość opisowa? Do czego ona służy?

Pierwszy index jest zupelnie niewazny. Jesli dojdzie do ponownego zapisu pozostaje taki sam. Najwazniejsze sa te nastepne indeksy.

Cytat(em1X @ 28.09.2013, 12:58:08 ) *
2) Czy plik z wartościami zajmuje tylko jedną linijkę? Dlatego prosiłem o prawdziwą zawartość pliku.
Plik moze zawierac jedna lub kilkadziesiat ale wywolywany jest wiersz za kazdym razem jakis konkretny. Jak napisalem. Zawartosc pliku jest zmenna.

Moze byc tak np. jak ponizej ale nie nastepuje szukanie w calym pliku lecz pobrana zostaje linia.

xccccccccccc||14a||28b
xxxxxxxxxxxxx||14a||14b||28a
zzzzzzzzzzzzzz||14a||28b
aaaaaaaaaaaaaaa||14a||14b||28a
xxxxxxxxxxxxxx||14c||28b
nnnnnnnnnnnnnn||14c||14a||28a
em1X
Cytat(TwojPan @ 28.09.2013, 14:02:56 ) *
Jesli dojdzie do ponownego zapisu pozostaje taki sam. Najwazniejsze sa te nastepne indeksy.


To też jest ważna informacja, którą pominąłeś. Jak to zwykle bywa w przypadku początkujących programistów, próbują rozwiązać prosty problem wykorzystując jakieś niesamowite pomysły, które kaskadowo powodują ogrom problemów kolejnych. To się nazywa "technical debt" i Ty właśnie taki zaciągnąłeś podejrzewam smile.gif

Czy wartość dopisywana ma być zawsze na końcu?
TwojPan
Cytat(em1X @ 28.09.2013, 13:12:00 ) *
Czy wartość dopisywana ma być zawsze na końcu?
Te numery tak. Po kolei. Nie wiecej jak trzy. Czyli:


xccccccccccc||14a
xxxxxxxxxxxxx||14a||14b
zzzzzzzzzzzzzz||14a||28b||14c


Nie wiecej niz 3. Njagorsze to jest to sprawdzanie co gdzie i zapis.
em1X
Podaj jak ma wyglądać ciąg wynikowy, po przesłaniu liczby "14", dla każdego z poniższych, możliwych wartości z pliku:

1) xxxxxxxxxxxxxxxxx||14c||28b
2) xxxxxxxxxx||14c||14b||14a
3) xxxxxxxx||28a||28c||28b
TwojPan
Cytat(em1X @ 28.09.2013, 13:25:51 ) *
Podaj jak ma wyglądać ciąg wynikowy, po przesłaniu liczby "14", dla każdego z poniższych, możliwych wartości z pliku:

1) xxxxxxxxxxxxxxxxx||14c||28b
2) xxxxxxxxxx||14c||14b||14a
3) xxxxxxxx||28a||28c||28b


To tylko ma byc jesli sa dwie wartosci a trzecią mozna dopisac.

Po wyslaniu 14tki w pierwszym przypadku sa dwie mozliwosci: 14a i 14b i ma wygladac tak:

xxxxxxxxxxxxxxxxx||14c||28b||14b

bądz

xxxxxxxxxxxxxxxxx||14c||28b||14a

Tak naprawde nie ma to znaczenia bo to czy sa trzy indeksy sprawdzam wczesniej.

W drugim nie przejdzie bo sa juz trzy. Trzeci rowniez.

Co innego jakby bylo:

xxxxxxxx||28a||28c

Wtedy sa trry mozliwosci 14a, 14b, 14c i rowniez nie ma znaczenia ktore sie zapisze.

Bądz:

xxxxxxxx||28a

i posylamy 14 wtedy jest są do zapisu dwie 14tki: 14a, 14b, 14c tez niewazne ktore i moze wynik wygladac tak:

xxxxxxxx||28a||14c||14a
em1X
  1. function nowyCiag($ciag, $newbus, $ograniczenieWartosci=3)
  2. {
  3. $tablica=explode('||', trim($ciag));
  4.  
  5. // jeżeli ma już 3 wartości to nie rób nic
  6. if ($ograniczenieWartosci == (count($tablica)-1)) {
  7. return $ciag;
  8. }
  9.  
  10. /**
  11.   * Najpierw musimy wyznaczyć wszystkie liczby,
  12.   * które są te same, jak ta wysłana.
  13.   * Przy okazji pobieramy literki.
  14.   */
  15. $liczby=array();
  16. $literki=array();
  17.  
  18. for ($i=1, $count=count($tablica); $i<$count; $i++) {
  19. $liczba=preg_replace('/[^0-9]/', '', $tablica[$i]);
  20. if ($liczba == $newbus) {
  21. $liczby[] = $tablica[$i];
  22.  
  23. $literka=str_replace($liczba, '', $tablica[$i]);
  24. $literki[$literka]=true;
  25. }
  26. }
  27.  
  28. /**
  29.   * Jedziemy po kolei alfabetem i szukamy pierwszej wolnej
  30.   * litery, którą możemy wstawić.
  31.   */
  32. for ($i='a'; $i<='z'; $i++) {
  33. // jeżeli znaleziono 1 wolną literkę
  34. // dopisz ją i zwróć ciąg
  35. if (! isset($literki[$i])) {
  36. return sprintf('%s||%u%s', $ciag, $newbus, $i);
  37. }
  38. }
  39.  
  40. throw new Exception(sprintf('Zabrakło literek dla ciągu %s', $ciag));
  41. }


To chyba by się zgadzało:
  1. // zawartosc z pliku
  2. $ciag_oryginalny='costam 0||14c||14a';
  3. $newbus=intval($_POST['newbus']);
  4.  
  5. echo nowyCiag($ciag_oryginalny, $newbus);
  6.  
  7. // dla liczby 28 otrzymamy:
  8. // costam 0||14c||14a||28a
  9.  
  10. // dla liczby 14 otrzymamy:
  11. // costam 0||14c||14a||14b


Program może działać uniwersalnie dla każdej liczby, z większą liczbą wartości.
TwojPan
Cytat(em1X @ 28.09.2013, 13:36:58 ) *
Czyli jeżeli mamy w pliku już 3 wartości, to skrypt ma zwrócić to co dostał? (ma nic nie robić)?
Ja juz to mam. Wczesniej sprawdzam czy sa 3 indexy i jesli tak to jest info i stop.


Ogolnie to jest skrypt ktory ustawia pliki na serwerze potrzebne do bukowania biletow. Te 14stki i 28mki to sa busy o tylu miejscach. Wlascicel chce miec mozliwosc dodawania busow i usuwania. Kazda linia w pliku do dana trasa (index 0 to o co sie pytales to nazwa trasy) Problem w tym ze moze On chcieć ustawic trzy busy po 14 miejsc badz trzy po 28 lub pomieszac. Wczesniej mialem to w jednym pliku ale On chce aby kazdy bus na dana trase mial osobny plik no i zeby to jakos wskazywac musze ustawic plik gdzie wskaze ile jest danego dnia (nazwa pliku jest to numer dnia miesiaca) tras (linie w pliku) i ilosc busow (indexy) tylko ze jesli chce ustawic dwa lub trzy takie same busy musze cos dodac do tego no i padlo na te przyrostki a,b,c
em1X
Przegapiłeś rozwiązanie. Patrz wyżej.
TwojPan
Serdeczne Bóg zapłać dobry człowieku smile.gif

Dziekuje bardzo smile.gif
em1X
Czasem samo opisanie problemu jest trudniejsze niż jego rozwiązanie.
Paulo Coelho.

Nie zapomnij wcisnąć "pomógł".
Pyton_000
Jedna uwaga.
Kod
$count=count($tablica);

używane w pętli to zabójstwo. Należy tego unikać jak ognia !
em1X
Pyton, ośmieszasz się.
Pyton_000
A wybacz, za szybko przeczytałem smile.gif Mój błąd. Błagam o wybaczenie smile.gif
em1X
Już nawet pomijając Twój błąd, nie mówimy tu o aplikacjach obciążonych tysiącami requestów na sekundę. Funkcja count() zwyczajnie zwraca wskaźnik ilości elementów ze struktury HashTable w C. Czy tablica będzie miała milion elementów, czy jeden, jest zawsze tak samo szybka. Mówimy tu o promilu różnicy przy iluśtam tysiącach iteracji. Skoro to jest dla Ciebie "zabójstwo" to raczej słabo jeszcze PHP znasz, no offense smile.gif
Pyton_000
Może nie związane z moją pomyłką ale http://www.phpbench.com/ pokazuje "realia"
em1X
Już patrząc na sam kod przykładów widzę, że się na PHP nie znają zupełnie. Wyniki też są tendencyjne. Jaką różnicę robi dla 90% korzystających z PHP, polegające na zaoszczędzeniu 0,001 sekundy, te Twoje mordercze, cytuję "+ 50987 %"? Zobaczyłeś dużo cyferek kolorem czerwonym i zwyczajnie dałeś się zmanipulować, i rozpowiadasz na forach jak straszne jest używanie count w pętli. Czy powinno się tak pisać? Dobrą praktyką jest nie pisanie tak kodu.. ale czy to sprawi większości jakąkolwiek różnicę? Nie. Fajniej by było, gdyby użytkownicy uczyli się porządnych praktyk w pisaniu kodu obiektowego, uczyli się wzorców, a nie zawracali głowę oszczędzaniem ułamków sekund nad jedną linijką kodu, podczas gdy tracą dziesiątki tysięcy więcej brakiem wiedzy w całości architektury jako takiej, będącej wynikiem ich pracy.
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-2025 Invision Power Services, Inc.