Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Tasowanie tablicy inne niz shuffle
Forum PHP.pl > Forum > Przedszkole
sadistic_son
Jak potasować tablicę aby zmienić tylko kolejność wyświetlania kolejnych elementów? Funkcja shuffle zmienia pary klucz => wartość. A ja chcę ją tak potasować aby dany klucz pozostał przy swojej wartości. Czyli tylko zmienić kolejność wyświetlania tych par. Lecz problemem jest to że nie wszystkich par.
Dla przykładu print_r zwraca mi takie coś:
Kod
Array
        (
            [id] => 10
            [question] => wartosc1
            [ans1] => x1
            [ans2] => y1
            [ans3] => z1
            [ans4] => zz1
        )
Chciałbym tak potasować losowo tablicę aby id i question zostały na swoim miejscy a pozostałe wyświetlały się losowo, czyli np tak:
Kod
Array
        (
            [id] => 10
            [question] => wartosc1
            [ans4] => zz1
            [ans1] => x1
            [ans3] => z1
            [ans2] => y1

        )
Any ideas?
luniak
To tu też pomogę tongue.gif

Jeżeli masz stałą liczbę dopowiedzi możesz ominąć ten problem np tak:

  1. $odpowiedzi=range(1,4); //[tablica z numerami odpowiedzi]
  2.  
  3. shuffle($odpowiedzi);
  4.  
  5. foreach($odpowiedzi as $id){echo $tablica["ans".$id];}
sadistic_son
Sorki ale nie za bardzo rozumiem ten kod. Przecież range działa na wartościach a nie na kluczach. A wartości są zmienne i generalnie nam nie znane. Trzeba podziałać na kluczach ans1, ans2, ans3, ans4. Liczba odpowiedzi jest stała - 4.
luniak
tutaj range tworzy tablice[liste] wartości
W koncu twoje pola sa nazwane
ans1
ans2
...
ansx

wiec sladaja sie ze stringu: 'ans' i inta smile.gif
wiec mieszasz sobie tymi intami i tyle smile.gif

mam an dzieje ze to jest zrozumiałe ^^

wogole w ten sposob nie mieszasz w samej glownej tablicy wogole jej tak naprawdę nie sortujesz smile.gif
sortujesz sobie tylko inty do indexów smile.gif

zawsze można troche zmodyfikować ten kod :

  1. $odpowiedzi=array('ans1','ans2','ans3','ans4'); //[tablica z numerami odpowiedzi]
  2.  
  3. shuffle($odpowiedzi);
  4.  
  5. foreach($odpowiedzi as $id){echo $tablica[$id];}


ale wersja z range bedzie ciut ale to niezuwazalnei wydajniejsza bo mniej pamieci bedzie potrzebowac a i sortowanie bedzie krótsze ze względu na mniejsza ilosc znakó do porownania smile.gif
sadistic_son
Owszem, ja to rozumiem i to działa. Ale nie o to mi chodzi. Te metody pomieszają indeksy i wartości. Po tych działaniach ans1 już nie będzie miało wartości x1 itd.
peter13135
array_rand zamiast shuffle ?
skowron-line
A nie możesz własnej funkcji napisać.
smietek
Wyciągnąć daną ilość wpisów z tej tablicy, posortować je w osobnej tablicy a potem przebudować tablicę pierwotną.
sadistic_son
Cytat(peter13135 @ 5.08.2011, 09:57:33 ) *
array_rand zamiast shuffle ?

Nie bardzo mam pomysł jak użyć array_rand w takim kodzie:
  1. foreach ($_SESSION['quiz'] as $s){
  2. echo $s['question'].'<br />';
  3.  
  4. foreach($s as $skey => $sval){
  5. if($skey != 'id' && $skey!='question'){
  6. echo $sval.'<input type="radio" name="'.$s['id'].'" value="'.$sval.'" /><br />';
  7. }
  8. }
  9. }

Cytat(skowron-line @ 5.08.2011, 10:00:01 ) *
A nie możesz własnej funkcji napisać.
No właśnie.... ANY IDEAS ?

Cytat(smietek @ 5.08.2011, 10:00:14 ) *
Wyciągnąć daną ilość wpisów z tej tablicy, posortować je w osobnej tablicy a potem przebudować tablicę pierwotną.
Nie potrzebuję przebudowywać tablicy pierwotnej, chcę tylko ją wyświetlić potasowaną, a właściwie tylko jej 4 ostatnie elementy, czyli wszystkie oprócz 2 pierwszych. I posortowanie to nie potasowanie.

Panowie, czytajcie dokładnie z czym mam problem. Funkcja działająca jak shuffle tutaj nie pomoże.
peter13135
  1. //zakładam, że ten print_r z pierwszego postu znajduje się w tablicy $array
  2. $answers=array_slice($array,2);//przypisuje di $answers wszystkie elementy $array oprócz 2 pierwszych
  3. $answers = array_rand($answers,count($answers));//to "miesza" $answers;
  4. $out['id'] = $array['id'];
  5. $out['question'] = $array['question'];
  6. foreach($answers as $k=>$v)
  7. {
  8. $out[$k] = $v;
  9. }

Nie testowałem tego, więc potraktuj to jako pseudokod wink.gif
skowron-line
Cytat(sadistic_son @ 5.08.2011, 09:09:59 ) *
No właśnie.... ANY IDEAS ?

Podziel na pól tablice i jedną część posortuj rosnąco, drugą malejąco i na koniec połącz.

Edit:
A jeżeli id i question ma być na 0 i 1 miejscu to odłącz je od tablicy przed sortowaniem.
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.