Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Wyświetlanie tylko niektórych elementów tablicy
Forum PHP.pl > Forum > Przedszkole
sadistic_son
Mam tablicę wielowymiarową wyglądającą mniej więcej tak:
Kod
Array
(
    [0] => Array
        (
            [id] => 10
            [question] => wartosc1
            [ans1] => x1
            [ans2] => y1
            [ans3] => z1
            [ans4] => zz1
        )

    [1] => Array
        (
            [id] => 9
            [question] => wartosc2
            [ans1] => x2
            [ans2] => y2
            [ans3] => z2
            [ans4] => zz2
        )

    [2] => Array
        (
            [id] => 11
            [question] => wartosc3
            [ans1] => x3
            [ans2] => y3
            [ans3] => z3
            [ans4] => zz3
        )

)

Jak za pomocą pętli foreach wyświetlić tylko ans1, ans2, ans3, ans4. Innymi słowy jak pominąć wyświetlanie id i question?
luniak
Jeżeli zrozumiałem dobrze to chodzi Ci o 2 petle 1 w 2 tak?

to mozna zrobić to na 2 sposoby:

po 1 możesz dać coś takiego:

  1. foreach($tablica as $rekord)
  2. {
  3. foreach($rekord as $nazwa => $wartosc)
  4. {
  5. if($nazwa != 'id' && $nazwa!='question'){echo $wartosc;}
  6. }
  7. }


lub w 2 ver tak:

  1. foreach($tablica as $rekord)
  2. {
  3. foreach($rekord as $nazwa => $wartosc)
  4. {
  5. if($nazwa == 'ans1' || $nazwa=='ans2' || $nazwa=='ans3' || $nazwa=='ans4'){echo $wartosc;}
  6. }
  7. }


mam nadzieję ze o to chodziło
sadistic_son
Dokładnie o to mi chodziło. Ach, mam zaćmienie o tak nieludzko wczesnej godzinie. Dzięki smile.gif
thek
Modyfikacja kodu powyżej... nie rób w IF porównań do wszystkich kluczy bo sie zajedziesz. Skorzystaj z array_key_exists w jednym przebiegu pętli lub array_key_intersect. Zamiast więc walić drugiego foreach użyj tylu IF, ile kluczy chcesz wyciągnąć lub zamotaj tam
  1. $result = array();
  2. foreach($tablica as $key => $rekord){
  3. if( array_key_exists( 'ans1', $rekord ) ) {
  4. $result[ $key ]['ans1'] = $rekord['ans1'];
  5. }
  6. if( array_key_exists( 'ans2', $rekord ) ) {
  7. $result[ $key ]['ans2'] = $rekord['ans2'];
  8. }
  9. if( array_key_exists( 'ans3', $rekord ) ) {
  10. $result[ $key ]['ans3'] = $rekord['ans3'];
  11. }
  12. if( array_key_exists( 'ans4', $rekord ) ) {
  13. $result[ $key ]['ans4'] = $rekord['ans4'];
  14. }
  15. }

To drugie jest zwięźlejsze bo da się doprowadzić do formy, ale rzadziej używane, bo wiele osób zwyczajnie tej funkcji nie zna, stosując multum petli i IFów wink.gif
  1. $result = array();
  2. foreach($tablica as $key => $rekord){
  3. $result[ $key ] = array_intersect_key( $rekord, array( 'ans1' =>'', 'ans2' =>'', 'ans3' =>'', 'ans4' =>'' ) ) );
  4. }
Problem w tym, które uważasz za prostsze , logiczniejsze, łatwiejsze do zrozumienia lub w testach wyjdzie Ci szybsze bądź wydajniejsze, mniej pamięciożerne. Te testy sobie sam przeprowadż jesli chcesz. A to nie jedyne możliwe podejście do problemu. Podałem zaledwie 2 sposoby, choć jest ich więcej smile.gif

Dlaczego tyle IF zamiast pętli? Pomyśl co będzie, jeśli mamy 5 elementów kolekcji, a każdy ma 10 pól, zaś Ty wyciagasz 3 z nich.
Pomysł luniaka:
1 foreach (5 przebiegów) -> 2 foreach (10 przebiegów) w każdym IF z 3 "lub" ==> 50 * 3 sprawdzenia
Pomysł z IF mój:
1 foreach (5 przebiegów) -> w każdym przebiegu 4 IF ==> 5 * 4 sprawdzenia
Pomysł mój z array intersect
1 foreach (5 przebiegów) -> w każdym przebiegu array intersect ==> 5 * wywołanie funkcji
luniak
No ja tak naprawdę podałem najprostszą wersję smile.gif funkcje które podałeś na pewno są łątwiejsze w implementacji ale jak by nie patrzeć każda funkcja ogólna w php'ie jest mniej wydajna niż kod strukturalny smile.gif oczywiście różnice przy malutkich aplikacjach nie będą zauważalne smile.gif a przy tworzeniu gier www zauważyłem że o ile duzo łątwiej pisze się gre w oparciu OOP o tyle potem jeżeli nie masz naprawdę mocnej maszyny zaczynają cie problemy z wydajnościąsmile.gif
thek
EDIT: Zapomniałem dodać... Oczywiście jeśli budowa jest niezmienna i te ansX są zawsze to nawet IF olewasz tylko od razu walisz w wynik i wewnętrzne IF odpadają, w rezultacie dając:
  1. $result = array();
  2. foreach($tablica as $key => $rekord){
  3. $result[ $key ]['ans1'] = $rekord['ans1'];
  4. $result[ $key ]['ans2'] = $rekord['ans2'];
  5. $result[ $key ]['ans3'] = $rekord['ans3'];
  6. $result[ $key ]['ans4'] = $rekord['ans4'];
  7. }


@luniak: W takim wypadku rozpatrz fakt, że zaproponowane rozwiązanie choć proste w implementacji (z racji swojego nasuwania się od razu) nawet w porównaniu do wszelkich innych podanych przeze mnie jest mocno w plecy z wydajnością, gdyż prowadzi do ogromnej ilości niepotrzebnych pustych przebiegów i sprawdzeń. Zawsze będzie X kolekcji * Y elementów kolekcji, w których byś miał jeden if z Z "lub" co prowadzi nas do niemiłego X * Y * Z sprawdzeń true-false wobec choćby w ostatnim wypadku X przebiegów pętli z walonymi na wprost przypisaniami.
luniak
Jeżeli przeanalizujesz jak działają podane przez Ciebie funkcje to zobaczysz że te 'puste' sprawdzenia są w nich tak samo wykonywane smile.gif

oczywiście w pełni repsektuje Twój pomysł bo każdy ma prawo do pisania na swój własny sposób smile.gif
sadistic_son
Dzięki Panowie. Thek, Twoje rozwiązanie też mi się podoba - to z array_intersect_key, choć chwilę zajęło mi jego zrozumienie.
To teraz chwila przerwy na żarcie i wracam do problemu tasowania tych tablic. Dzięki.
thek
Te sprawdzenia są ale ich szybkość jest uzależniona od implementacji funkcji w PHP. Problem nie tyczy ostatniego przypadku, gdzie jawnie wołam o klucze, bo wiem, że są. Tam pustych przebiegów nie ma wcale. Nawet niejawnych.
Poza tym mógłbym zamiast if( array_key_exists( 'klucz', $tablica ) ) użyć if( isset( $tablica['klucz'] ) ) (z zastrzeżeniem, że pole to nigdy nie przechowuje NULL - ograniczenie isset).
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.