Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] array_push() i foreach() dodawanie i wyświetlanie wyników
Forum PHP.pl > Forum > Przedszkole
mpps
witam.
mam funkcję, która generuje losowe liczby.
potrzebuję dodać wygenerowane liczby do osobnej tablicy, w której będę mógł je porównać i określić, czy się powtarzają, i jeśli tak, to ile razy.
  1. <?php
  2. function generate(){
  3. global $tablicaliczb;
  4. $ile  = 6; // ile liczb
  5. $od = 1; // przedział od
  6. $do = 100; // przedział do
  7.  
  8. $range = range($od, $do);
  9. $rand = array_rand($range, $ile);
  10.  
  11. foreach($rand as $key){
  12. echo $liczba.$endl;
  13.  
  14. $tablicaliczb = array($liczba); //to nie działa (wyświetla tylko ostatnią wygenerowaną liczbę)
  15. array_push($tablicaliczb, $liczba); //to też...
  16. }
  17. }
  18.  
  19. $ilosclosowan = 10;
  20. $i = 1;
  21. while($i <= $ilosclosowan){
  22. generate(); //to działa
  23. $i++;
  24. echo "<br>";
  25. }
  26.  
  27. echo "<p>wylosowane liczby i ich powtarzalność:<br>";
  28. print_r($tablicaliczb); //wyświetla tylko ostatnią wygenerowaną liczbę
  29. ?>

może ktoś z Was ma pomysł?

pozdrawiam
rgalka
wydaje mi się że $rand powinienieś zastąpić $rand[]. w takiej formie $rand nie jest tablicą, tylko zwykłą zmienną, do której przypisuje wartość(dlatego w niej zapisana jest tylko ostatnia wartość). $rand[] wskazuje, że $rand jest tablicą i do jej kolejnych komórek przypisywane są kolejne wartości.
sorry za gramatykę i używane słownictwo, ale lepiej nie potrafię
mpps
z pierwszą częścią problemu już sobie poradziłem.

@JoShiMa oj nieładnie... uważasz, że oprócz ciebie nikt manuali nie czyta? zadałem konkretne pytanie nt. rozwiązania problemu, a nie 'co to jest za funkcja array()'

@rgalka niestety nie. błąd był tu:
  1. <?php
  2. $tablicaliczb = array($liczba); //powinno być:
  3. $tablicaliczb = $liczba; //bo $liczba już jest tablicą: $liczba = $range[$key]; - tej linii zabrakło w kodzie... sorry
  4. ?>

rozwiązanie wygląda tak:
  1. <?php
  2. function generate(){
  3. global $tablicaliczb;
  4. $ile  = 10; // ile liczb
  5. $od = 1; // przedział od
  6. $do = 100; // przedział do
  7.  
  8. $range = range($od, $do);
  9. $rand = array_rand($range, $ile);
  10.  
  11. foreach($rand as $key){
  12. $liczba = $range[$key];
  13. echo $liczba;
  14. $tablicaliczb[] = $liczba;
  15. }
  16. }
  17.  
  18. $ilosclosowan = 10;
  19. $i = 1;
  20. while($i <= $ilosclosowan){
  21. generate();
  22. $i++;
  23. echo "<br>";
  24. }
  25.  
  26. //wyświetlamy nową tablicę
  27. function pokaztabliceliczb($tablicaliczb)
  28. {
  29. $buf = '';
  30. foreach($tablicaliczb as $key => $value){
  31. $buf .= $value.", ";
  32. }
  33. return $buf;
  34. }
  35.  
  36. echo pokaztabliceliczb($tablicaliczb);
  37. ?>

tu widzimy, że wszystkie dane ładnie zostały wpisane do nowej tablicy.

teraz druga część zadania:
ponieważ dane w tablicy się powtarzają, chcę je wyświetlić w ten sposób, że wyświetlę wszystkie dane wraz z podaniem ilości powtórzeń, np.

23 - 2
14 - 1
35 - 4
itd...

mogą być posortowane od najmniejszej do największej występującej liczby...
nawet nie wiem, jak się do tego zabrać na ten moment...
JoShiMa
Cytat(mpps @ 3.06.2008, 15:37:37 ) *
@JoShiMa oj nieładnie... uważasz, że oprócz ciebie nikt manuali nie czyta? zadałem konkretne pytanie nt. rozwiązania problemu, a nie 'co to jest za funkcja array()'

No i masz tam konkretne funkcje, które za Ciebie odwalą robotę. A jak musisz ręcznie to zrób hasza. Kluczem niech będzie wartość wartością niech będzie ilość powtórzeń. Potem polecisz po kluczach hasza i wyświetlisz co trzeba. Ja bym tak zrobiła, gdybym nie umiała skorzystać z gotowych funkcji.

  1. <?php
  2. for($i=0;$i<count($tablicaliczb){
  3.  $hasz[$tablicaliczb[$i]]++;
  4. }
  5.  
  6. foreach($hasz as $wartosc => $ilosc_powtorzen){
  7.  echo "$wartosc - $ilosc_powtorzen<br/>";
  8. }
  9. ?>


A żeby były posortowane to możesz albo posortować tablicę przed zrobieniem hasza, albo posortować hasza po kluczach na oba przypadki masz gotowe funkcje w manualu.
erix
Ale Wy kombinujecie...
array_count_values" title="Zobacz w manualu PHP" target="_manual

mpps, proponowałbym uważne czytanie, co jest napisane w manualu, a nie odgrażanie się na każdym kroku, że Cię ktoś nakieruje na Google/manual. Nikt za Ciebie pracy domowej odrabiał nie będzie.
JoShiMa
Cytat(erix @ 4.06.2008, 07:18:16 ) *


Od początku pokazywałam listę gotowych funkcji, ale kolega nie chciał przejrzeć i mnie obśmiał bo chciał ręcznie to pokazałam jak można jeśli koniecznie się chce ręcznie.
mpps
Cytat(JoShiMa @ 4.06.2008, 10:01:02 ) *
Od początku pokazywałam listę gotowych funkcji, ale kolega nie chciał przejrzeć i mnie obśmiał bo chciał ręcznie to pokazałam jak można jeśli koniecznie się chce ręcznie.

@JoShiMa nie płacz, proszę; przejrzyj parę postów, a zobaczysz, jak wyglądają najczęściej odpowiedzi innych userów na pytania. właśnie najczęściej są takie (i to mnie wkurza), jak Twoje: 'patrz -> manual'. ponieważ wydawało mi się, że Twoja odpowiedź (prawdopodobnie) wynikała z braku zagłębienia się w mój post uznałem, że dam prztyczka w ucho. mam nadzieję, że nie boli winksmiley.jpg
w Twoim skrypcie (za który dziękuję) jest błąd; poniżej zamieszczam poprawiony, który i tak nie działa i nie wynika to z błędu w mojej tablicy, bo próbowałem go też wykonać na nowej, 'ręcznie zrobionej'.
  1. <?php
  2. for($i=0; $i<count($tablicaliczb); ){
  3. $hasz[$tablicaliczb[$i]]++;
  4. }
  5.  
  6. foreach($hasz as $wartosc => $ilosc_powtorzen){
  7.  echo "$wartosc - $ilosc_powtorzen<br/>";
  8. }
  9. ?>

wynik jest taki sam:
  1. Fatal error: Maximum execution time of 30 seconds exceeded in [...]


@erix dzięki za zwrócenie uwagi na tą funkcję - rozumiałem ją inaczej, a przyznaję, że nie zajrzałem do przykładów. pokombinuję i dam znać

i proszę o jeszcze winksmiley.jpg
pyro
Cytat(JoShiMa @ 4.06.2008, 08:49:17 ) *
No i masz tam konkretne funkcje, które za Ciebie odwalą robotę. A jak musisz ręcznie to zrób hasza. Kluczem niech będzie wartość wartością niech będzie ilość powtórzeń. Potem polecisz po kluczach hasza i wyświetlisz co trzeba. Ja bym tak zrobiła, gdybym nie umiała skorzystać z gotowych funkcji.

  1. <?php
  2. for($i=0;$i
  3.  $hasz[$tablicaliczb[$i]]++;
  4. }
  5.  
  6. foreach($hasz as $wartosc => $ilosc_powtorzen){
  7.  echo &#092;"$wartosc - $ilosc_powtorzen
  8. &#092;";
  9. }
  10. ?>


A żeby były posortowane to możesz albo posortować tablicę przed zrobieniem hasza, albo posortować hasza po kluczach na oba przypadki masz gotowe funkcje w manualu.


JoShiMa, w 7 lini w twoim kodzie jest błąd, dałeś plusy nie tam gdzie trzeba
mpps
i jak zwykle okazuje się, że najprostsze rozwiązania są najlepsze winksmiley.jpg
  1. <?php
  2. $counts = array_count_values($tablicaliczb);
  3. foreach($counts as $key => $value){
  4. echo $key." - ".$value."<br>";
  5. }
  6. ?>


@erix jeszcze raz thnx!

pozdrawiam
i dziękuję Wam wszystkim!
JoShiMa
Cytat(mpps @ 4.06.2008, 10:01:17 ) *
Ponieważ wydawało mi się, że Twoja odpowiedź (prawdopodobnie) wynikała z braku zagłębienia się w mój post uznałem, że dam prztyczka w ucho. mam nadzieję, że nie boli winksmiley.jpg

Nie boli. Wystawiłeś tylko świadectwo własnej ignorancji pokazując, że nie czytałeś manuala mimo iż Twoje oburzenie wskazywałoby na coś zupełnie odwrotnego.


Cytat(mpps @ 4.06.2008, 10:01:17 ) *
w Twoim skrypcie (za który dziękuję) jest błąd

Masz rację zeżarło kawałek fora.

Cytat(mpps @ 4.06.2008, 10:01:17 ) *
poniżej zamieszczam poprawiony, który i tak nie działa

Bo źle poprawiłeś?

  1. <?php
  2. for($i=0; $i<count($tablicaliczb); $i++){
  3. $hasz[$tablicaliczb[$i]]++;
  4. }
  5.  
  6. foreach($hasz as $wartosc => $ilosc_powtorzen){
  7.  echo "$wartosc - $ilosc_powtorzen<br/>";
  8. }
  9. ?>



Cytat(pyro @ 4.06.2008, 10:10:56 ) *
JoShiMa, w 7 lini w twoim kodzie jest błąd, dałeś plusy nie tam gdzie trzeba

Dałam plusy tam gdzie trzeba, zabrakło tylko $i++ w nawiasie w linii 2

Cytat(mpps @ 4.06.2008, 10:26:56 ) *
i jak zwykle okazuje się, że najprostsze rozwiązania są najlepsze winksmiley.jpg

Przecież to pokazałam w pierwszym swoim poście, ale się uparłeś tongue.gif
mpps
jeszcze raz uprzejmie dziękuję za podpowiedzi i pomysły (a jednak ucho zabolało) tongue.gif
nie obrażaj się proszę - mam szacunek dla płci pięknej, bo to perełki na tym forum guitar.gif
JoShiMa
Cytat(mpps @ 4.06.2008, 13:12:33 ) *
nie obrażaj się proszę - mam szacunek dla płci pięknej, bo to perełki na tym forum guitar.gif

Tylko trochę nerwowe co? tongue.gif
mpps
Cytat(JoShiMa @ 4.06.2008, 15:29:33 ) *
Tylko trochę nerwowe co? tongue.gif

idzie się przyzwyczaić aaevil.gif

ok, liczę na Twoją pomoc w przyszłości, a na ten moment proponuję zamknąć temat, bo nas zaraz któryś Modek oboje po uszach wytarmosi i pogrozi paluszkiem

pozdrawiam
marcin
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.