Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Wielowymiarowa tablica asocjacyjna - wybieranie wierszy
Forum PHP.pl > Forum > Przedszkole
kardi3
Witam,
mam pewien problem do rozwiązania
polecenie brzmi :
Wypisz tablicę użytkowników(users) którzy mają więcej niż 6000 punktów. Pożądane jest zachowanie kluczy.

  1. $users = array(
  2. 17375 => array(
  3. 'id' => 17375,
  4. 'nick' => 'Aniela',
  5. 'points' => 5908,
  6. 'created' => '2009-09-26 14:41:47',
  7. ),
  8. 20871 => array(
  9. 'id' => 20871,
  10. 'nick' => 'poziomka777',
  11. 'points' => 4804,
  12. 'created' => '2009-10-04 20:31:09',
  13. ),
  14. 41787 => array(
  15. 'id' => 41787,
  16. 'nick' => 'doroo',
  17. 'points' => 8805,
  18. 'created' => '2009-11-02 17:07:48',
  19. ),
  20. 13585 => array(
  21. 'id' => 13585,
  22. 'nick' => 'madzia333',
  23. 'points' => 8805,
  24. 'created' => '2009-09-11 21:46:21',
  25. )
  26. );


Wymyśliłem takie rozwiązanie ale zapewne jest jakieś prostsze. Mógłby ktoś podpowiedzieć jak zoptymalizować rozwiązanie tego zadania?

  1. function wypisz_uzytkownikow2($uzytkownicy)
  2. {
  3. $new_users = array_values($uzytkownicy); // zamieniamy tablice na indeksowaną
  4. for($i=0;$i<count($new_users);$i++)
  5. {
  6. if($new_users[$i]['points']>6000) //wybieramy wiersze z odpowiednią ilością punktów
  7. {
  8. $new_users2[$i] = $new_users[$i]; // przypisujemy odpowiednie wiersze do nowej tablicy
  9. }
  10.  
  11. }
  12. return $new_users2;
  13. }
  14. $wynik = wypisz_uzytkownikow2($users);
  15. $wynik2 = array_values($wynik); // usuwamy z nowej tablicy puste wiersze
  16. unset($users);
  17. foreach($wynik2 as $result)
  18. {
  19. $key = $result['id']; // tworzymy klucz nowej tablicy asocjacyjnej
  20. $users[$key]=$result; // w tablicy asocjacyjnej przypisujemy klucz i wartości
  21. }
  22. var_dump($users);
  23.  
KotWButach
  1. foreach (array_expression as $key => $value){
  2. echo $key. ' - '. $value
  3. }
frantic09
Nie wiem czy o to Ci chodziło, ale uzyskałem taki sam wynik jaki wyszedł Tobie, przy krótszym zapisie funkcji:

  1. function wypisz_uzytkownikow3($uzytkownicy)
  2. {
  3. //nowa tablica
  4. $new_users = array();
  5.  
  6. //foreach jest w tym wypadku szybszy niz for
  7. foreach($uzytkownicy as $key => $val){
  8.  
  9. //Twój warunek
  10. if($val['points'] > 6000){
  11.  
  12. //jeśli warunek spełniony, to zapisuje użytkownika do nowej tablicy "na jego indexie"
  13. $new_users[$key] = $val;
  14. }
  15. }
  16. return $new_users;
  17. }


I nie wiem po co później te cuda robisz, ten drugi foreach. Przekaż do funkcji tablicę userów i później wyświetl to co zwróci.
bostaf
Albo tak:
  1. foreach($users as $k => $v) if($v['points'] > 6000) unset($users[$k]);
  2. var_dump($users);

Mniej pisania wink.gif
irmidjusz
Cytat(bostaf @ 16.10.2012, 23:27:58 ) *
Albo tak:
  1. foreach($users as $k => $v) if($v['points'] > 6000) unset($users[$k]);
  2. var_dump($users);

Mniej pisania wink.gif


Śmieciowy kod

@kardi3: ładne, powtarzalne rozwiązanie możesz uzyskać również tworząc sobie klasę dziedziczącą z FilterIterator, ewentualnie użyć CallbackFilterIterator smile.gif
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.