Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Grupowanie powiązanych liczb
Forum PHP.pl > Forum > PHP
maciek_3000
Witam!
Mam do rozwiązania pewien problem. Przechodząc od razu do praktyki

Mam 2 wymiarową tablicę z takimi wartościami

  1. 1 1 2 3 5
  2. 2 6 6 6 7


Liczby z górnego szeregu powiązane są z liczbami z dolnego szeregu. Szeregów może być tylko 2, a rzędów nieskończenie wiele.


Wynikiem działania algorytmu ma być:
  1. array(array(5,7),array(1,2,3,6))


Chodzi tutaj o to, że na bazie pierwszej tablicy, chce stworzyć drugą tablicę postępując według takiego schematu działania:

1.Pętla działa dopóty wszystkie rzędy liczb nie zostaną wykorzystane
2.Po znalezieniu 1 i 2 (pierwszy rząd) szuka kolejnych rzędów, które zawierają min. jedna z tych liczb i jeżeli znajdzie taką w rzędzie, to dodaje cały rząd (pomijając powtarzającą się wartośc do tablicy), następnie przeszukuje tablicę bazową ale ma już więcej wartości w pamięci, dzięki którym z najduje kolejne liczby.
3. Gdy już nie może znaleźć więcej liczb, tworzy kolejną tablicę do których umieszcza pierwszy lepszy niewykorzystany rząd liczb i szuka liczb im odpowiadających.

Tworzę ten kod w C++ i rozpiszę się na tyle pętli, że zaczynam gubić się w kodzie. Tworzę zmienne bool zawierające informacje, czy zrobiłcoś skrypt, potem porównuje 4 możliwości i zaczynam od nowa.
Jakbyście rozwiązali to zagadnienie [w php]?
siemakuba
Nie jestem pewny czy dobrze cię zrozumiałem, ale zbudowałem coś takiego:

  1. <?php
  2. $baseArray = array(
  3. array(1,1),
  4. array(1,2),
  5. array(6,3),
  6. array(2,1),
  7. array(3,1),
  8. array(9,3),
  9. array(4,2),
  10. array(5,1),
  11. array(3,4),
  12. array(6,7),
  13. array(9,4)
  14. );
  15.  
  16. $resultArray = array();
  17.  
  18. while (!empty($baseArray))
  19. {
  20. $match = array_shift($baseArray);
  21. if (!empty($baseArray))
  22. {
  23. $resultArray[] = array();
  24. $this  =& $resultArray[count($resultArray)-1];
  25. for ($i=0; $i<2; $i++)
  26. {  
  27. for($j=0, $m=count($baseArray);$j<$m;$j++)
  28. {
  29. if (is_array($baseArray[$j]) && in_array($match[$i], $baseArray[$j]))
  30. {  
  31. $this = array_merge($this, $baseArray[$j]); 
  32. unset($baseArray[$j]);
  33. continue;
  34. }
  35. }
  36. }
  37. }
  38. else
  39. {
  40. $this = array_merge($this, $match);
  41. }
  42. }
  43.  
  44. for ($i = 0, $n = count($resultArray); $i < $n; $i++)
  45. {
  46. $resultArray[$i] = array_unique($resultArray[$i]);
  47. }
  48.  
  49. print_r($resultArray);
  50. ?>


wynik:
Kod
Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 2
            [4] => 3
            [6] => 5
        )

    [1] => Array
        (
            [0] => 6
            [1] => 7
            [2] => 9
            [3] => 3
            [5] => 4
        )

    [2] => Array
        (
            [0] => 9
            [1] => 4
        )

)


pozdr.
maciek_3000
Pomijając kilka notice'ów i zmieniając this na _this otrzymałem zacytowane rozwiązanie, ale nie o to dokładnie mi chodzi.

Na tym przykładzie: tablica z 4 i 9 powinny być włączone do poprzedniej tabeli, w której już 4 się znajduje, bo 4 jest fizycznie związana z 9 (ostatni element tablicy basowej w Twoim przypadku: array(9,4));

pokombinuje, a w między czasie może ktoś przedstawi swoją wizję. nie musi być kompletny kod, tylko dobry pomysł step by step
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.