Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]tasowanie tablicy
marcinp1984
post 3.03.2011, 15:15:32
Post #1





Grupa: Zarejestrowani
Postów: 112
Pomógł: 0
Dołączył: 17.05.2009

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


Witam
Mam tablicę, której struktura wygląda następująco:

Array (
[0] => Array (
[id] => 1338319986
[name] => ccm
[1] => Array (
[id] => 1467091237
[name] => ooa
[2] => Array (
[id] => 1467091237
[name] => ooa))

Chcę, aby jej elementy pozamieniały się ze sobą losowo kolejnością tzn. tylko [0], [1], [2], dalsza struktura pozostaje bez zmian. Problem może błahy ale niestety nie mogę sobie z tym poradzić. Googluje od dwóch godzin i w sumie nie znalazłem nic, co by poprawnie zadziałało. Z tego co wyczytałem teoretycznie zadzaiałać powinno shuffle(). Jakoś działa, tyle że wygląda to tak, że zamiast tasować to sobie losuje bo elementy się powtarzają. Jak to ugryźć?
Go to the top of the page
+Quote Post
zordon
post 3.03.2011, 15:44:25
Post #2





Grupa: Zarejestrowani
Postów: 358
Pomógł: 78
Dołączył: 4.11.2008
Skąd: Kraków

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


shuffle
Go to the top of the page
+Quote Post
marcinp1984
post 3.03.2011, 15:58:52
Post #3





Grupa: Zarejestrowani
Postów: 112
Pomógł: 0
Dołączył: 17.05.2009

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


hmm... no tak, wspomniałem o tym, że to znalazłem tyle że nie działa to tak jak powinno bo tak tasuje że powtarzają się elementy tablicy
Go to the top of the page
+Quote Post
Valdi_B
post 3.03.2011, 16:06:06
Post #4





Grupa: Zarejestrowani
Postów: 107
Pomógł: 30
Dołączył: 19.02.2011
Skąd: Warszawa

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


Uwaga: Samo shuffle przemiesza całą tablicę.
Jeżeli chcesz przemieszać tylko początek to (np.):
  1. $t1 = array_slice($tbl, 0, 3, true); // 3 pocz. elem.
  2. shuffle($t1); // mieszanie
  3. array_splice ($tbl , 0, 3, $t1); // przykryj elem. 1-3
Sprawdziłem - działa.

Uwaga: Zarówno shuffle jak i array_splice "regenerują" klucze.
Jeżeli to szkodzi, to musisz:
1. Przemieszać tablicę zawierającą 3 początkowe indeksy (nie jestem pewny czy zawsze są to 0, 1 i 2).
2. Wyciągać elementy w kolejności wg tej przemieszanej tablicy (do tabl. rob.).
Dopiero potem dodać do niej pozostałe.
Go to the top of the page
+Quote Post
marcinp1984
post 3.03.2011, 16:24:23
Post #5





Grupa: Zarejestrowani
Postów: 112
Pomógł: 0
Dołączył: 17.05.2009

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


O kurcze chyba muszę troszeczkę sprostować bo jak widzę chyba nie potrafiłem dobrze wytłumaczyć o co mi chodzi wink.gif Opisywałem jak potrafiłem i chyba nie do końca mi to wyszło. Miałem na myśli to, że przetasowana ma zostać cała tablica, ale tylko po indeksach [1],[2],[3],..., [n]. Pisząc żeby nie ruszyło dalszej struktury chodziło mi o to, żeby nie mieszało przypadkiem [id] z [name].
Go to the top of the page
+Quote Post
Valdi_B
post 3.03.2011, 16:32:21
Post #6





Grupa: Zarejestrowani
Postów: 107
Pomógł: 30
Dołączył: 19.02.2011
Skąd: Warszawa

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


To sprawa jest prosta.
Tak jak radził zordon - shuffle, tylko pamiętaj, że ta funkcja "regeneruje" klucze, czyli w wynikowej tablicy:
- będziesz mieć klucze od 0 wzwyż,
- związki między id a name powinny pozostać bez zmian.
Go to the top of the page
+Quote Post
marcinp1984
post 3.03.2011, 16:43:37
Post #7





Grupa: Zarejestrowani
Postów: 112
Pomógł: 0
Dołączył: 17.05.2009

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


Akurat to nie ma większego znaczenia że klucze się pozmieniają. Ale z shuffle mam ten problem, że jak to zastosuję to niby miesza, ale też elementy tablicy się powtarzają więc coś nie do końca to chce działać poprawnie.
Go to the top of the page
+Quote Post
zordon
post 3.03.2011, 16:53:09
Post #8





Grupa: Zarejestrowani
Postów: 358
Pomógł: 78
Dołączył: 4.11.2008
Skąd: Kraków

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


  1. <?php
  2. $x = array (
  3. 0 => array ('id' => 1338319986, 'name' => 'ccm'),
  4. 1 => array ('id' => 1467091238, 'name' => 'ooa'),
  5. 2 => array ('id' => 1467091237, 'name' => 'oob'));
  6.  
  7. echo "<pre>";
  8.  
  9. $y = array_rand($x, count($x));
  10.  
  11. $res = array();
  12. foreach($y as $z){
  13. $res[] = $x[$z];
  14. }
  15.  
  16.  
  17. var_dump($res);
Go to the top of the page
+Quote Post
marcinp1984
post 3.03.2011, 17:13:43
Post #9





Grupa: Zarejestrowani
Postów: 112
Pomógł: 0
Dołączył: 17.05.2009

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


hmm... no tak, to to już przerabiałem i w moim przypadku wyjściowa tablica jest identyczna jak tablica wejściowa :/

  1. $this->tab = unserialize(file_get_contents($this->path.'info.txt'));
  2.  
  3. $y = array_rand($this->tab, count($this->tab));
  4. $res = array();
  5. foreach($y as $z)
  6. {
  7. $res[] = $this->tab[$z];
  8. }
  9.  
  10. print_r($res);


Tak to wygląda u mnie. Niestety nic nie zamienia :/
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 26.06.2025 - 17:55