Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] jak policzyć wiersze tablicy
Forum PHP.pl > Forum > PHP
funky_beat
Witam,

Kolejny problem z tablicami.

Staram się zliczyć z tablicy liczbę wierszy posiadających tę samą wartość.
Przykładowo:
posiadam tablicę $tabA złożoną z wierszy :

(
1
1
1
2
3
1
3
)

Na pierwszy rzut oka widać, że wierszy zawierających wartość "2" jest tylko jeden, wartość "3" występuje w dwóch wierszach.

Próbowałem wykorzystać do tego zadania funkcję COUNT() ale w manualu wyczytałem że zwraca ona tylko liczbę elementów tablicy i nie jest niestety w stanie sprawdzić który element ma taka a nie inna wartość.

Proszę Was o pomoc bo wiem że jest tu sporo osób doskonale znających się na PHP.
szafran86
A nie można zrobić tak:

  1. SELECT COUNT(*) AS ile FROM twoja_tabela WHERE twoja_nazwa_kolumny=1
funky_beat
to by było za łatwe.

to zadanie musi byc wykonane bez uzycia sql.

juz udało mi się to policzyć odpowiednią funkcją:

  1. <?php
  2. $tabA = array (1,1,1,2,3,1,3,1);
  3. $pow = array_count_values ($tabA);
  4.  
  5. foreach ($pow as $licz)
  6. {
  7. echo "<br>".$licz;
  8. }
  9. ?>


jednak problem jest jeszcze nie rozwiązany poniewaz zmienila sie koncepcja tablicy
teraz tablica wyglada tak:

  1. <?php
  2. $tabA = array (
  3. 1 234,
  4. 1 224,
  5. 1 245,
  6. 2 98,
  7. 3 87,
  8. 1 10,
  9. 3 45,
  10. 1 25);
  11. ?>



a założeniem jest zliczenie liczby elementów tablicy w ktorych pierwszy człon jest taki sam jak w innych elementach, czyli
w pierwszym elemencie powyzszej tabeli pierwszy człon ma wartość "1" i nalezy policzyc ile takich elementów jest w tej tabeli

człony oddzielić nie problem:

  1. <?php
  2. $czlon = explode(" ",$tabA);
  3. ?>



tylko co dalej sad.gif
webdice
  1. SELECT COUNT(*) AS `count`, `field` FROM `table` GROUP BY SUBSTRING(`field`, 1, 2)
funky_beat
niestety to co mi zaproponowałeś to sql a mi zalezy na tym zeby wykonac to w php sad.gif
webdice
  1. <?php
  2.  
  3. function func ($index)
  4. {
  5. return substr ($index, 0, 1);
  6. }
  7.  
  8. $tabA = array ('1 234', '1 234', '2 543', '1 442', '4 567');
  9.  
  10. $pow = array_count_values (array_map ('func', $tabA));
  11.  
  12. print_r ($pow);
  13.  
  14. ?>
funky_beat
Działa doskonale smile.gif podmieniłem tylko print_F na echo bo cos sie gryzło ale o takie rozwiązanie właśnie chodziło.

WIELKIE DZIĘKI webdicepl

Jeszcze jeden problem w sprawie tejże tablicy.

Jak wylosować podaną liczbę wierszy spośród wierszy zaczynających się znakiem "1"?
webdice
  1. <?php
  2. function random ($arr, $char)
  3. {
  4.  $rand = rand (0, count ($arr) - 1);
  5.  
  6. if (substr ($arr[$rand], 0, 1) == $char)
  7. {
  8. return $arr[$rand];
  9. }
  10. else
  11. {
  12. return random ($arr, $char);
  13. }
  14. }
  15.  
  16. print random ($tabA, '1');
  17. ?>
Snowak
A nie prościej tak?
  1. <?php
  2. $ilosc_unikalnych = count(array_unique($tablica));
  3. ?>

...
webdice
Cytat(Snowak @ 21.12.2007, 15:17:25 ) *
A nie prościej tak?
  1. <?php
  2. $ilosc_unikalnych = count(array_unique($tablica));
  3. ?>

...


Nie, przeczytaj dokładnie co chciał otrzymać autor postu.
funky_beat
tak, z tym że ideałem by było gdyby ta funkcja pozwalała wybrać liczbę wylosowanych elementów w nie tylko jeden,

webdicepl gdybyś mógł wskazać w którym miejscu tej funkcji określić liczbę wylosowanych elementów, to byłbym Ci ogromnie wdzięczny

bo ja staram sie zrobic tak :

  1. <?php
  2. function random ($arr, $char)
  3. {  
  4. $rand = rand (0, count ($arr) - 1);  
  5. if (substr ($arr[$rand], 0, 1) == $char)
  6. {
  7. return $arr[$rand];
  8. }
  9. else
  10. {
  11. return random ($arr, $char);
  12. }
  13. }
  14.  
  15. $i = 1;
  16. while ($i <=10)
  17. {
  18. print random ($tabA, '1');
  19. ++$i;
  20. }
  21. ?>




ale przy takim rozwiązaniu skrypt się nie kończy, losuje nonstop
webdice
  1. <?php
  2. function random ($arr, $char, $count = 1)
  3. {
  4.  for ($i = 0; $i < $count; $i++)
  5.  {
  6. $rand = rand (0, count ($arr) - 1);
  7.  
  8. if (substr ($arr[$rand], 0, 1) == $char)
  9. {
  10. $array[] = $arr[$rand]; 
  11. }
  12. else
  13. {
  14. return random ($arr, $char, $count);
  15. }
  16. }
  17.  
  18. return $array;
  19. }
  20. ?>


Z tym że teraz będzie Ci zwracać tablice (pamiętaj o trzecim parametrze funkcji który określa ilość indeksów w zwracanej tablicy). Możesz również tak:

  1. <?php
  2. for ($i = 0; $i < X; $i++)
  3. {
  4. print random ($tabA, '1');
  5. }
  6. ?>
funky_beat
no tak ten pomysł jest niezły ale przydatniejsze byłoby losowanie bez powtórzeń:

ja wykombinowałem cos takiego:

  1. <?php
  2. $tab = array();
  3.  
  4. for($i = 0; $i < 6; $i++)
  5. {
  6. $intItem = rand( 1, 49 );
  7.  
  8. if( ! in_array( $intItem, $tab ) )
  9. {
  10. $tab[] = $intItem;
  11. }
  12.  
  13. echo "<b><i> ".$intItem." </i></b>";
  14.  
  15. }
  16. ?>



ale przy tym losowaniu jest coś nie tak. mianowicie, zdarza się ze po odświeżeniu strony (klawisz F5) funkcja losuje dwa razy tę samą liczbę

webdicepl zwracam się głównie do Ciebie bo ostatnio Ty bez zadnego problemu sobie poradziłeś z tymi problemami tablicowymi
b_chmura
  1. <?php
  2. $ile  = 5;
  3. $od = 1;
  4. $do = 50;
  5. $range = range($od, $do);
  6. $rand = array_rand($range, $ile);
  7.  
  8. foreach($rand as $key)
  9. {
  10. echo $range[$key].', ';
  11. }
  12. ?>
funky_beat
b_chmura a dlaczego one się wyświetlają poukłądane rosnąco?
webdice
  1. <?php
  2. function random ($arr, $char, $count = 1)
  3. {
  4.  $array = array ();
  5.  
  6.  for ($i = 0; $i < $count; $i++)
  7.  {
  8. $rand = rand (0, count ($arr) - 1);
  9.  
  10. if (substr ($arr[$rand], 0, 1) == $char)
  11. {
  12.  if (!in_array ($arr[$rand], $array))
  13.  {
  14. $array[] = $arr[$rand]; 
  15. }
  16.  else
  17.  {
  18. return random ($arr, $char, $count);
  19. }
  20. }
  21. else
  22. {
  23. return random ($arr, $char, $count);
  24. }
  25. }
  26.  
  27. return $array;
  28. }
  29. ?>


Nie wiem czemu stosujesz array_rand" title="Zobacz w manualu PHP" target="_manual skoro musisz jeszcze sprawdzić czy pierwszy znak jest równy przykładowo 1. Napisz jeszcze raz co chcesz osiągnąć.

P.S. Pamiętaj że ta funkcja nigdy się nie skończy gdy będzie mniej elementów tablicy niż zadeklarowanej liczby powtórzeń. Aby to poprawić możesz sobie dorobić jedną instrukcje.
b_chmura
Cytat
Nie wiem czemu stosujesz array_rand skoro musisz jeszcze sprawdzić czy pierwszy znak jest równy przykładowo 1.


po co?

Cytat
b_chmura a dlaczego one się wyświetlają poukłądane rosnąco?


funkcja array_rand zwraca X losowych kluczy (posortowanych rosnąco) tablicy $range

a w czym to przeszkadza?
webdice
Cytat(b_chmura @ 23.12.2007, 17:10:06 ) *
po co?


Po to że autor chciał aby był sprawdzany pierwszy znak danego elementu tablicy.
funky_beat
webdicepl dokładnie o takie rozwiązanie chodziło, WIELKIE DZIĘKI

a czy mógłbyś zerknąć na mój temat o polach formularza w pętli? bo oni cos nie potrafią tego tak jasno wyjaśnić jak Ty, z góry dzięki
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.