Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Pomieszanie tablicy wielowymiarowej w jednowymiarowa
Forum PHP.pl > Forum > Przedszkole
Octobus
Witam, musze pomieszac pewna ilocs tablic wielowymiarowych gdzie kazda tablica zawiera liste adresow z 1 domeny. Wiec przy 3 tablicach mamy 3 domeny w ktorych jest jakas ilosc adresow. Chce zrobic tak zeby te tablice pomieszac w ten sposob zeby adresy z jednej domeny nie wystepowaly obok siebie czyli

Kod
[google.pl]
http://google.pl/adres1
http://google.pl/adres2
http://google.pl/adres3
[yahoo.com]
http://yahoo.com/adres1
http://yahoo.com/adres2
http://yahoo.com/adres3


i chce zeby z tego powstalo:
Kod
http://google.pl/adres1
http://yahoo.com/adres1
http://google.pl/adres2
http://yahoo.com/adres2
http://google.pl/adres3
http://yahoo.com/adres3


Problem w tym ze tych tablic z domenami moze byc bardzo poniewaz listy adresow do pomieszania moga byc ponad 100 000 adresow dochodzace nawet do miliona ... Napisalem skrypt ktory to robi ale przy duzych adresach bedzie rzeznia ;/




  1. while($url = $lista_url->fetch_assoc()){
  2. $lista_temp[] = $url['URL'];
  3. $adres = parse_url($url['URL']);
  4. $lista[$adres['host']][] = $url['URL'];
  5. }
  6.  
  7.  
  8.  
  9. //szukaj max w najwiekszej liscie
  10. $max = 0;
  11. foreach($lista as $n=>$v){
  12. $tablice[] = $n;
  13. $x = count($v);
  14. if($x > $max)
  15. $max = $x;
  16. }
  17.  
  18. $x = 0;
  19. //przelec listy od 0 do max
  20. for($x; $x<=$max; $x++){
  21. foreach($tablice as $n=>$v){
  22. if(isset($lista[$v][$x])){
  23. $nowa_lista[] = $lista[$v][$x];
  24. }else{
  25. unset($tablice[$n]);
  26. }
  27. }
  28.  
  29. }


Skrypt ma 1800 wykonań przy 1785 adresach wiec troche lipa ;/
Shuffle jak zastosuje adresy beda obok siebie wiec nie rozwiazuje to do konca problemu ;/
erix
Hmm, jakoś problemu nie widzę. Jeśli masz posegregowane domenami tablice, to robisz coś takiego:

  1. $items = array(
  2. array(...),
  3. array(...),
  4. array(...)
  5. );
  6.  
  7. $list = array();
  8. $domains = count($items);
  9.  
  10. for($i=0;$i<$domains;$i++){
  11. while(empty($items[$i]){
  12. $i++;
  13. }
  14.  
  15. $list[] = array_shift($items[$i]);
  16. }

Ale żeby nie było za łatwo, Twoim zadaniem jest sprawdzenie, czy przy iteracji subpętli istnieje cokolwiek w tablicy adresów. Innymi słowy, musisz wykryć przypadek, w którym nie ma już żadnych adresów. W tej chwili będzie pętla nieskończona w takiej sytuacji. [;

PS. Pisane z palca, ale IMO powinno działać.
Octobus
Napisałem, działa świetnie. Pobiera po 1 rekordzie z kazdej tablicy i wkleja do nowej tablicy. Na samym koncu powtarza sie tablica ktora byla najwieksza, o to wlasnie mi chodzilo smile.gif Jakby komus sie przydalo to to jest kod (mieszanie wielu tablic/tablicy wielowymiarowej w jedna jednowymiarowa)

  1. while($url = $lista_url->fetch_assoc()){
  2. $adres = parse_url($url['URL']);
  3. $lista[$adres['host']][] = $url['URL'];
  4. }
  5.  
  6.  
  7.  
  8. //szukaj max w najwiekszej liscie
  9. $max = 0;
  10. foreach($lista as $n=>$v){
  11. $tablice[] = $n;
  12. $x = count($v);
  13. if($x > $max)
  14. $max = $x;
  15. }
  16.  
  17. $x = 0;
  18. //przelec listy od 0 do max
  19. for($x; $x<=$max; $x++){
  20. foreach($tablice as $n=>$v){
  21. if(isset($lista[$v][$x])){
  22. $nowa_lista[] = $lista[$v][$x];
  23. }else{
  24. unset($tablice[$n]);
  25. }
  26. }
  27.  
  28. }
  29.  
  30.  
  31.  
  32. echo '<pre>';
  33. print_r($nowa_lista);
erix
  1. if(isset($lista[$v][$x])){
  2.  
  3. $nowa_lista[] = $lista[$v][$x];
  4.  
  5. }else{
  6.  
  7. unset($tablice[$n]);
  8.  
  9. }

A po co masz funkcje tablicowe? tongue.gif Nie dość, że mniej kodu, to działają szybciej niż ręczna obróbka w pętli.
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.