Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]tasowanie tablicy
Forum PHP.pl > Forum > Przedszkole
marcinp1984
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źć?
zordon
shuffle
marcinp1984
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
Valdi_B
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.
marcinp1984
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].
Valdi_B
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.
marcinp1984
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.
zordon
  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);
marcinp1984
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 :/
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.