Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Tablica asocjacyjna, problem z przetasowaniem wartosci
Forum PHP.pl > Forum > Przedszkole
dolar
Witam ponownie,
Mam za zadanie napisac funkcje, ktora bedzie losowo tasowac wartosci w tablicy asocjacyjnej, nie zmieniajac nazw kluczy. Zrobilam sobie na samym poczatku krotka tablice i krotki kod:

<?php

$tablica = array("1a" => "x" , '1b'=>"y", "1c" =>'z' );

shuffle($tablica);

foreach ($tablica as $key => $value) {

if ($key==0){
$key="1a";
}

if ($key==1){
$key="1b";
}

if ($key==2){
$key="1c";
}

php?>

Czytalam duzo o sortowaniu i tasowaniu i wyczytalam ze funkcja shuffle owszem przetasuje mi wartosci w tablicy, lecz rowniez zmieni mi nazwy kluczy na liczbowe, a tego nie chce ( w chwili obecnej klucz 1a=0, 1b=1 i 1c=2. Chcialam ponownie zmienic te nazwy kluczy i przypisac im pierwotnie nadane nazwy, lecz nie udaje mi sie bo widnieja mi teraz nazwy takie : 01a,11b i 12c. Interesuje mnie przetasowanie tylko i wylacznei wartosci przypisanych do danych kluczy w tablicy. Nie wiem w jakim kierunku moglabym juz pojsc i jak rozwiazac to zadanie. Czy ktos moze mnie chociaz naprowadzic? Pozdrawiam!
Pyton_000
  1. <?php
  2.  
  3. $tablica = ["1a" => "x", '1b' => "y", "1c" => 'z'];
  4.  
  5. print_r($tablica);
  6. $values = array_values($tablica);
  7. shuffle($values);
  8. $tablica = array_combine(array_keys($tablica), $values);
  9. print_r($tablica);
dolar
Hmmm faktycznie dziala, lecz nie rozumiem tego kompletnie ;p Przeciez array_values indeksuje tablice liczbowo to przed przetasowaniem mimo wszystko nie zmienil kluczy z 1a na 0 itd? Czy ktos moglby mi to wytlumaczyc i dalczego moj tok myslenia byl bledny? Pozdrawiam
Pyton_000
array_values pobiera same wartości, shuffle tasuje je, potem pobieranie array_keys samych kluczy z oryginalnej tablicy i połączenie obu tablic (kluczy i wartości przetasoowanych)
dolar
Hm rozumiem! Tylko mam jeszcze jedno pytanie: na stronie php.net ( tutaj dokaldniej: http://php.net/manual/pl/function.array-values.php ) jest napisane ze funkcja indeksuje tablice na nowo liczbowo. Nie wiem czy nie myle pojec, ale czy zaindeksowanie na nowo nie spowoduje ze moj klucz pierwotny 1a nie dostanie nowego klucza 0? Czy klucze i indeks to to samo? Bo chyba sie pogubilam... :/. Bo skoro zamienia klucze moje na liczby to jakim cudem pozniej przy laczeniu kluczy z wartosciami zwracane mam oryginalne klucze? Pozdrawiam!
Puszy
Dobrze rozumiesz ale ten problem rozwiązuje array_combine().
dolar
No ok, a to nie dziala tak ze jak juz zrobie array_values to w tym momencie moja tablica dostaje nowe klucze ( tutaj liczbowe ) i tamte juz nie istanieja, zostaja zastapione nowymi? Bo ja rozumiem to tak, ze najpierw wyciaga wartosci i nadaje nowe klucze, potem tasuje wyciagniete wartosci i na koncu laczy. Skad funkcja laczaca wie ze ma wziasc klucze oryginalne a nie te nadpisane? Sorki za takie postawy ale musze wszystko dobrze rozumiec tongue.gif.
Acha i na stronie funkcja shuffle ma taki wyglad: http://php.net/manual/pl/function.shuffle.php . Moge nia tasowac tylko same wartosci wraz z przypisanymi do niej kluczami?
I ostatania sprawa - ja uzywam echo do wyswietlania, a czemy Wy uzywacie print_r? smile.gif
Puszy
Skrypt który napisał pyton:

1. Do zmiennej $values przypisuje wartości $tablica ($tablica jest nieruszona)
2. Miesza tablicę $values ($tablica jest nieruszona)
3. Do zmiennej $tablica nadpisuje dane poprzez łączenie kluczy tablicy $tablica z pomieszanymi wartościami $values. Przypisywanie zmiennych idzie od prawej do lewej. ($tablica zostaje nadpisana wynikiem array_combine() który z kolei łączy klucze oryginalnej $tablica i pomieszanych wartości które są w zmiennej $values()

P.S. shuffle() za parametr przyjmuje referencje, to znaczy że nie musisz pisać $values = shuffle($values), gdy do funkcji leci referencja to właśnie ta zmienna będzie zedytowana (w sumie to nieistotne ale poczytaj o referencjach i o tym co pisałem, czyli o wartościach zmiennych od prawej do lewej).

print_r() wyświetla tablicę w formacie human readable, w konsoli wyświetli ładnie ułożoną strukturę, z kolei w HTML musisz print_r() wziąć w tagi HTML <pre></pre>


  1. <?php
  2.  
  3. $tablica = ['a', 1, 'trzy'];
  4.  
  5. echo '<pre>';
  6. print_r($tablica);
  7. echo '</pre>';
dolar
Ooo bardzo dziekuje za odpowiedzi! To moge jeszcze troche pomeczyc? smile.gif Bo dobrze zaczynam rozumiec smile.gif.
1. Ok rozumiem, ja bym powiedziala ze w tym punkcie do $values zostaja przypisane wartosci z $tablicy, ale do ZMIENNEJ, a tutaj chyba wynika z tego ze $values to tworzy sie nowa tablica jakby? Do tej pory powielalam tablice w taki sposob np. $tablica1=$tablica2, czyli cala istniejaca gdzies wczesniej tablica2 zostaje skopiowana jakby i przypisana do $tablica1. Cala. Z tego wynika ze moge stworzyc tablice przypisujac jej same wartosci? Myslalam ze przypisujac do $values wyciagniete wartosci da mi to zmienna pelna samych wartosci ;p.
2.Ok miesza... tlyko ze ja wlasnie bylam uczona ze shuffle zapisuje sie tak np: $tablica=shuffle($tablica); czy tutaj moglabym uzyc zamiennie $values=shuffle($values)? Bo z tym dluzszym kodem juz mi nie chce dzialac...
3.O dziwo rozumiem tongue.gif.

Jeszcze raz dzieki za cierpliwosc smile.gif
Puszy
1. Zapis: $values = array_values($tablica); Utworzona zostaje nowa zmienna o nazwie $values do której jest przypisywany wynik funkcji array_values(), funkcja array_values() bierze za argument tablicę (nie modyfikuje jej) i zwraca tablicę wartości.
2. Funkcja shuffle() przyjmuje za argument referencje i nie zwraca nic, dlatego $zmienna w zapisie $zmienna = shuffle($tablica) zawsze będzie pusta, bo shuffle nie zwraca żadnej wartości ale modyfikuje przekazany jej argument, przekazywanie referencji oznacza się poprzez ampersand (&) np:

  1. <?php
  2.  
  3. function zwieksz(&$x){
  4. $x++;
  5. }
  6.  
  7. $foo = 1;
  8.  
  9. echo $foo; // wyświetli 1
  10.  
  11. zwieksz($foo);
  12.  
  13. echo $foo; // wyświetli 2
  14.  
dolar
Stal sie cud! ROZUMIEM! Dzieki wielkie, jeszcze nie raz bede tu pisac i zagladac smile.gif. Bardzo dziekuje raz jeszcze Puszy!
Pyton_000
@Puszy nie pisz głupot że nic nie zwraca i zmienna będzie pusta:

Cytat
Returns TRUE on success or FALSE on failure.

http://php.net/manual/en/function.shuffle....le-returnvalues

@dolar czytaj opis funkcji w manualu. Tam masz opisane co robi, jak robi, co dostaje, co zwraca. Ba nawet przykłady które kopiuj/wklej sobie odpalasz i widzisz.
dolar
Faktycznie! Kazdy detal sie liczy. Wybaczcie za moje podstawy i pewnie błahe pytania ale od czegos trzeba zaczac.
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.