Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Funkcja array.
cfneon
post
Post #1





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 11.04.2010

Ostrzeżenie: (0%)
-----


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";


Ten post edytował cfneon 2.03.2014, 22:22:45
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 13)
vonski
post
Post #2





Grupa: Zarejestrowani
Postów: 292
Pomógł: 89
Dołączył: 27.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
cfneon
post
Post #3





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 11.04.2010

Ostrzeżenie: (0%)
-----


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>"
Go to the top of the page
+Quote Post
rad11
post
Post #4





Grupa: Zarejestrowani
Postów: 1 270
Pomógł: 184
Dołączył: 7.10.2012
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


"dane_do_zapisu24</br>dane_do_zapisu33</br>dane_do_zapisu11</br>" to jest malejaco ?
Go to the top of the page
+Quote Post
vonski
post
Post #5





Grupa: Zarejestrowani
Postów: 292
Pomógł: 89
Dołączył: 27.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Rozumiem. Chyba (IMG:style_emoticons/default/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.
Go to the top of the page
+Quote Post
cfneon
post
Post #6





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 11.04.2010

Ostrzeżenie: (0%)
-----


Cytat(vonski @ 2.03.2014, 23:37:35 ) *
Rozumiem. Chyba (IMG:style_emoticons/default/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. ;/

Ten post edytował cfneon 3.03.2014, 00:01:25
Go to the top of the page
+Quote Post
SmokAnalog
post
Post #7





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
cfneon
post
Post #8





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 11.04.2010

Ostrzeżenie: (0%)
-----


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.

Ten post edytował cfneon 3.03.2014, 00:22:14
Go to the top of the page
+Quote Post
vonski
post
Post #9





Grupa: Zarejestrowani
Postów: 292
Pomógł: 89
Dołączył: 27.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


W tym drugim przykładzie zastąp pętle for pętlą foreach:

  1. foreach($liczby as $el) {
  2. fputs($fp, $el);
  3. }
Go to the top of the page
+Quote Post
cfneon
post
Post #10





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 11.04.2010

Ostrzeżenie: (0%)
-----


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. (IMG:style_emoticons/default/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);


Ten post edytował cfneon 3.03.2014, 12:49:31
Go to the top of the page
+Quote Post
vonski
post
Post #11





Grupa: Zarejestrowani
Postów: 292
Pomógł: 89
Dołączył: 27.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Wewnątrz array() if-a nie dasz (IMG:style_emoticons/default/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. );


Ten post edytował vonski 3.03.2014, 13:06:55
Go to the top of the page
+Quote Post
cfneon
post
Post #12





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 11.04.2010

Ostrzeżenie: (0%)
-----


Wielkie dzięki vonski to wszystko już z czym miałem problem. Temat rozwiązany, pozdrawiam (IMG:style_emoticons/default/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. (IMG:style_emoticons/default/wink.gif) )

Ten post edytował cfneon 7.03.2014, 23:45:45
Go to the top of the page
+Quote Post
vonski
post
Post #13





Grupa: Zarejestrowani
Postów: 292
Pomógł: 89
Dołączył: 27.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


A no nie sortuje (IMG:style_emoticons/default/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. }
Go to the top of the page
+Quote Post
cfneon
post
Post #14





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 11.04.2010

Ostrzeżenie: (0%)
-----


Wreszcie! Wszystko już zrobione (IMG:style_emoticons/default/wink.gif) ) Dzięki bardzo vonski, temat do zamknięcia ;]
Wielka pozdrówka. ;dd
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 12:52