Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Pomieszanie tablicy wielowymiarowej w jednowymiarowa
Octobus
post
Post #1





Grupa: Zarejestrowani
Postów: 259
Pomógł: 1
Dołączył: 3.07.2011

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


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 ;/
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
erix
post
Post #2





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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





Grupa: Zarejestrowani
Postów: 259
Pomógł: 1
Dołączył: 3.07.2011

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


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 (IMG:style_emoticons/default/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);
Go to the top of the page
+Quote Post
erix
post
Post #4





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




  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? (IMG:style_emoticons/default/tongue.gif) Nie dość, że mniej kodu, to działają szybciej niż ręczna obróbka w pętli.
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: 17.09.2025 - 13:04