Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Funkcja array.
Forum PHP.pl > Forum > Przedszkole
cfneon
Witam mam mały problem odnośnie funkcji array, a więc chce ustawić chronologicznie wartości $godzina i wpisać je do pliku a później wyświetlić. Wszystko działa dobrze do momentu kiedy przed każdą wartością chce żeby do pliku dodawany był też tekst przed każdą z nich. Gdy uruchamiam mój kod owszem wpisuje tekst i zmienne, lecz niestety nie układa ich w kolejności. Wrzucam kod poradzi ktoś co robię źle?
  1. $godzina1 = 1;
  2. $godzina2 = 4;
  3. $godzina3 = 3;
  4. $godzina4 = 2;
  5.  
  6. $nazwa_pliku = "dane.txt";
  7. $fp = fopen($nazwa_pliku, "a");
  8. $liczby = array("dane_do_zapisu1" .$godzina1. "</br>", "dane_do_zapisu2" .$godzina2. "</br>", "dane_do_zapisu3" .$godzina3. "</br>");
  9. rsort($liczby);
  10.  
  11. for ($k=0; $k <= 2; $k++) //pętla wypisująca wartości
  12. {
  13. fputs($fp, $liczby[$k]);
  14. }
  15. fclose($fp);
  16.  
  17. $tekst = fread(fopen("$nazwa_pliku", "r"), filesize("$nazwa_pliku"));
  18. echo "$tekst";
vonski
Raczej wygląda to ok, może poza tym, że rsort sortuje tablicę malejąco, jeśli chcesz rosnąco, użyj sort.
Generalnie po wykonaniu skryptu powinieneś mieć w pliku dane.txt taką zawartość: "dane_do_zapisu33</br>dane_do_zapisu24</br>dane_do_zapisu11</br>" - czyli posortowane malejąco.
cfneon
Cytat(vonski @ 2.03.2014, 22:37:48 ) *
Raczej wygląda to ok, może poza tym, że rsort sortuje tablicę malejąco, jeśli chcesz rosnąco, użyj sort.
Generalnie po wykonaniu skryptu powinieneś mieć w pliku dane.txt taką zawartość: "dane_do_zapisu33</br>dane_do_zapisu24</br>dane_do_zapisu11</br>" - czyli posortowane malejąco.


Chyba mnie troszke nie zrozumiałeś. Chce zrobić, aby wartości $godziny były sortowane malejąco a dodatkowo aby każda wartość miała przypisany tekst.
Dla przykładu:

Nie jak wyświetla się teraz
"dane_do_zapisu33</br>dane_do_zapisu24</br>dane_do_zapisu11</br>"

Tylko
"dane_do_zapisu24</br>dane_do_zapisu33</br>dane_do_zapisu11</br>"
rad11
"dane_do_zapisu24</br>dane_do_zapisu33</br>dane_do_zapisu11</br>" to jest malejaco ?
vonski
Rozumiem. Chyba smile.gif
Możesz w takim razie zrobić tablicę gdzie kluczami będą godziny i sortować po kluczach. Z tym, że to zadziała tylko jeśli godziny będą unikalne.

  1. $liczby = array($godzina1 => "dane_do_zapisu1" .$godzina1. "</br>", $godzina2 => "dane_do_zapisu2" .$godzina2. "</br>", $godzina3 => "dane_do_zapisu3" .$godzina3. "</br>");
  2. krsort($liczby);


Jeśli natomiast godziny mogą się powtarzać, to wtedy możesz napisać np. swoją funkcję sortującą i przekazać ją do usort.
cfneon
Cytat(vonski @ 2.03.2014, 23:37:35 ) *
Rozumiem. Chyba smile.gif
Możesz w takim razie zrobić tablicę gdzie kluczami będą godziny i sortować po kluczach. Z tym, że to zadziała tylko jeśli godziny będą unikalne.

  1. $liczby = array($godzina1 => "dane_do_zapisu1" .$godzina1. "</br>", $godzina2 => "dane_do_zapisu2" .$godzina2. "</br>", $godzina3 => "dane_do_zapisu3" .$godzina3. "</br>");
  2. krsort($liczby);


Jeśli natomiast godziny mogą się powtarzać, to wtedy możesz napisać np. swoją funkcję sortującą i przekazać ją do usort.


Wszystko działa, mam jeszcze jedno pytanie czy funckją array mogę ułożyć chronologicznie daty?

Próbuję to zrobić standardowo wpisując date tak:
  1. $godzina1 = date('00:16:46');
  2. $godzina2 = date('02:35:33');
  3. $godzina3 = date('01:21:11');
  4. $godzina4 = date('09:17:03');


lecz kod w ogóle nie działa. ;/
SmokAnalog
Po pierwsze zapisywanie do zmiennych w stylu:
  1. $godzina1 = date('00:16:46');
  2. $godzina2 = date('02:35:33');
  3. $godzina3 = date('01:21:11');
  4. $godzina4 = date('09:17:03');

Jest złe. Zrób z tego normalną tablicę:
  1. $godziny = array(
  2. '00:16:46',
  3. '02:35:33',
  4. '01:21:11',
  5. '09:17:03',
  6. );

Posortowanie godzin zapisanych w ten sposób załatwi zwyczajny sort.
cfneon
Cytat(SmokAnalog @ 3.03.2014, 00:06:14 ) *
Po pierwsze zapisywanie do zmiennych w stylu:
  1. $godzina1 = date('00:16:46');
  2. $godzina2 = date('02:35:33');
  3. $godzina3 = date('01:21:11');
  4. $godzina4 = date('09:17:03');

Jest złe. Zrób z tego normalną tablicę:
  1. $godziny = array(
  2. '00:16:46',
  3. '02:35:33',
  4. '01:21:11',
  5. '09:17:03',
  6. );

Posortowanie godzin zapisanych w ten sposób załatwi zwyczajny sort.


Mam to zrobić tak?

  1. $godz = array('00:16:46','02:35:33','01:21:11','09:17:03');
  2. sort($godz);
  3.  
  4. for ($s=0; $s <= 3; $s++) //pętla wypisująca wartości
  5. {
  6. echo $godz;
  7. }


A gdy każdą godzinę będe chciał wpisać do osobnej zmiennej tak?

  1. $godzina1 = '00:02:46';
  2. $godzina2 = '00:35:33';
  3. $godzina3 = '01:21:11';
  4. $godzina4 = '09:17:03';
  5. $nazwa_pliku = "dane.txt";
  6. $fp = fopen($nazwa_pliku, "a");
  7. $liczby = array($godzina1 => "dane_do_zapisu1" .$godzina1. "</br>", $godzina2 => "dane_do_zapisu2" .$godzina2. "</br>", $godzina3 => "dane_do_zapisu3" .$godzina3. "</br>");
  8. krsort($liczby);
  9.  
  10. for ($k=0; $k <= 6; $k++) //pętla wypisująca wartości
  11. {
  12. fputs($fp, $liczby[$k]);
  13. }
  14. fclose($fp);


ani pierwszy, ani drugi przykład nie chce działać(nie wiem dlaczego). Przepraszam za moje może głupie pytania ale jestem początkujący.
vonski
W tym drugim przykładzie zastąp pętle for pętlą foreach:

  1. foreach($liczby as $el) {
  2. fputs($fp, $el);
  3. }
cfneon
Cytat(vonski @ 3.03.2014, 00:54:10 ) *
W tym drugim przykładzie zastąp pętle for pętlą foreach:

  1. foreach($liczby as $el) {
  2. fputs($fp, $el);
  3. }


Wielkie dzięki Vonski! To się nazywa szybka i skuteczna pomoc. wink.gif)

Temat do zamk. ;d

Ps.

Jeszcze jedno pytanko czy w arrayu mogę wpleść if lub jakiś warunek czy muszę to zrobić w innym miejscu?
Chodzi mi o zrobienie coś tego typu (patrz komentarz zamiast zmiennej $godzina1).

  1. $godzina1 = '00:02:46';
  2. $aktualna_data = date('H:i:s');
  3.  
  4. $liczby = array( /*Jeżeli $godzina1 < $aktualna_data (pomija daną wartość przy sortowaniu i nie wpisuje tekstu ani zmiennej do pliku)*/ => "dane_do_zapisu1" .$godzina1. "</br>", $godzina2 => "dane_do_zapisu2" .$godzina2. "</br>", $godzina3 => "dane_do_zapisu3" .$godzina3. "</br>");
  5. krsort($liczby);
vonski
Wewnątrz array() if-a nie dasz smile.gif Możesz ewentualnie to obejść operatorem trójkowym, ale wydaje mi się, że może to strasznie zaciemnić Twój kod (tzn. za 2 dni na to popatrzysz i nie będziesz wiedział co jest grane).
Ale zamiast urzywać array() do dodawania elementów możesz użyć operatora [], coś w tym rodzaju:

  1. $liczby = array();
  2.  
  3. if( /* warunek */ ) {
  4. $liczby[] = 'dane_do_zapisu1' . $godzina;
  5. }


Ewentualnie możesz użyć array_filter. Chociaż to trochę mniej wydajny sposób, bo najpierw wrzucasz wszystko do tablicy, a potem filtrujesz, ale może to być przydatne, jeśli z jakiegoś powodu będziesz mimo wszystko później potrzebował wszystkich wartości:

  1. $liczby = array(/* normlanie tworzysz tablicé */);
  2. $liczbyFiltered = array_filter($liczby, function($el) {
  3. return $el > $aktualna_data;
  4. }
  5. );
cfneon
Wielkie dzięki vonski to wszystko już z czym miałem problem. Temat rozwiązany, pozdrawiam wink.gif)

edit.

Wszystko działa ale prawie bo teraz gdy dodałem ify znowu nie chce mi tego sorcić, nie wiem czy umieszciłem je dobrze. Zerkniesz na to.

  1. <?php
  2.  
  3. $godzina1 = '08:55:46';
  4. $godzina2 = '08:35:33';
  5. $godzina3 = '09:21:11';
  6. $godzina4 = '06:59:03';
  7. $aktualna_data = date('H:i:s');
  8.  
  9. $nazwa_pliku = "dane.txt";
  10. $fp = fopen($nazwa_pliku, "a");
  11. $liczby = array();
  12. if( $aktualna_data1 >= $godzina1 )
  13. {
  14. $liczby[] = 'dane_do_zapisu1 ' . $godzina1 . '</br>';
  15. }
  16. if( $aktualna_data1 >= $godzina2 )
  17. {
  18. $liczby[] = 'dane_do_zapisu2 ' . $godzina2 . '</br>';
  19. }
  20. if( $aktualna_data1 >= $godzina3 )
  21. {
  22. $liczby[] = 'dane_do_zapisu3 ' . $godzina3 . '</br>';
  23. }
  24. if( $aktualna_data1 >= $godzina4 )
  25. {
  26. $liczby[] = 'dane_do_zapisu4 ' . $godzina4 . '</br>';
  27. }
  28.  
  29. krsort($liczby);
  30. foreach($liczby as $el) {
  31. fputs($fp, $el);
  32. }
  33. fclose($fp);
  34.  
  35. $tekst = fread(fopen("$nazwa_pliku", "r"), filesize("$nazwa_pliku"));
  36. echo "$tekst";
  37. ?>


Pomoże ktoś? Bo troche nad tym główkuje i niewiem co wywołuje błąd. A bardzo mi na tym zależy, sorry za refresh(jeszcze tylko to i temat do zamk. wink.gif)
vonski
A no nie sortuje smile.gif Nie sortuje dlatego, że krsort sortuje po kluczach i o ile takie tworzenie tablicy:

  1. $liczby = array($godzina1 => 'dane_do_zapisu1'...

tworzyło tablicę asocjacyjną, o tyle teraz robisz tablicę za pomocą opratora [], czyli musisz ręcznie podać te klucze:

  1. if( $aktualna_data1 >= $godzina1 )
  2. {
  3. $liczby[$godzina1] = 'dane_do_zapisu1 ' . $godzina1 . '</br>';
  4. }
  5. if( $aktualna_data1 >= $godzina2 )
  6. {
  7. $liczby[$godzina2] = 'dane_do_zapisu2 ' . $godzina2 . '</br>';
  8. }
  9. if( $aktualna_data1 >= $godzina3 )
  10. {
  11. $liczby[$godzina3] = 'dane_do_zapisu3 ' . $godzina3 . '</br>';
  12. }
  13. if( $aktualna_data1 >= $godzina4 )
  14. {
  15. $liczby[$godzina4] = 'dane_do_zapisu4 ' . $godzina4 . '</br>';
  16. }
cfneon
Wreszcie! Wszystko już zrobione wink.gif) Dzięki bardzo vonski, temat do zamknięcia ;]
Wielka pozdrówka. ;dd
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.