Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Tasowanie tablicy inne niz shuffle
sadistic_son
post
Post #1





Grupa: Zarejestrowani
Postów: 1 495
Pomógł: 245
Dołączył: 1.07.2009
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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?

Ten post edytował sadistic_son 5.08.2011, 07:34:53
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 10)
luniak
post
Post #2





Grupa: Zarejestrowani
Postów: 171
Pomógł: 36
Dołączył: 12.01.2008
Skąd: Puszcza Mariańska

Ostrzeżenie: (0%)
-----


To tu też pomogę (IMG:style_emoticons/default/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];}
Go to the top of the page
+Quote Post
sadistic_son
post
Post #3





Grupa: Zarejestrowani
Postów: 1 495
Pomógł: 245
Dołączył: 1.07.2009
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
luniak
post
Post #4





Grupa: Zarejestrowani
Postów: 171
Pomógł: 36
Dołączył: 12.01.2008
Skąd: Puszcza Mariańska

Ostrzeżenie: (0%)
-----


tutaj range tworzy tablice[liste] wartości
W koncu twoje pola sa nazwane
ans1
ans2
...
ansx

wiec sladaja sie ze stringu: 'ans' i inta (IMG:style_emoticons/default/smile.gif)
wiec mieszasz sobie tymi intami i tyle (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/smile.gif)
sortujesz sobie tylko inty do indexów (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/smile.gif)

Ten post edytował luniak 5.08.2011, 08:04:22
Go to the top of the page
+Quote Post
sadistic_son
post
Post #5





Grupa: Zarejestrowani
Postów: 1 495
Pomógł: 245
Dołączył: 1.07.2009
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
peter13135
post
Post #6





Grupa: Zarejestrowani
Postów: 1 447
Pomógł: 191
Dołączył: 26.03.2008

Ostrzeżenie: (0%)
-----


array_rand zamiast shuffle ?
Go to the top of the page
+Quote Post
skowron-line
post
Post #7





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

Ostrzeżenie: (0%)
-----


A nie możesz własnej funkcji napisać.
Go to the top of the page
+Quote Post
smietek
post
Post #8





Grupa: Zarejestrowani
Postów: 306
Pomógł: 32
Dołączył: 20.01.2008

Ostrzeżenie: (20%)
X----


Wyciągnąć daną ilość wpisów z tej tablicy, posortować je w osobnej tablicy a potem przebudować tablicę pierwotną.
Go to the top of the page
+Quote Post
sadistic_son
post
Post #9





Grupa: Zarejestrowani
Postów: 1 495
Pomógł: 245
Dołączył: 1.07.2009
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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.

Ten post edytował sadistic_son 5.08.2011, 09:11:55
Go to the top of the page
+Quote Post
peter13135
post
Post #10





Grupa: Zarejestrowani
Postów: 1 447
Pomógł: 191
Dołączył: 26.03.2008

Ostrzeżenie: (0%)
-----


  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 (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
skowron-line
post
Post #11





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

Ostrzeżenie: (0%)
-----


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.

Ten post edytował skowron-line 5.08.2011, 09:30:41
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 2.10.2025 - 18:52