Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php] sortowanie tablicy
tomekp
post
Post #1





Grupa: Zarejestrowani
Postów: 171
Pomógł: 0
Dołączył: 17.12.2003
Skąd: Krakół

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


Mam tablicę formatu:

Kod
    [response] => Array
        (
            [domaininfo] => Array
                (
                    [0] => Array
                        (
                            [record_id] => 5416
                            [name] => test.pl
                            [type] => MX
                            [value] => test.pl
                            [ttl] => 86400
                            [prio] => 10
                            [reverse_name] => pl.test
                            [subdomain_level] => 0
                        )

                    [1] => Array
                        (
                            [record_id] => 5415
                            [name] => test.pl
                            [type] => A
                            [value] => 195.149.227.83
                            [ttl] => 86400
                            [prio] => 0
                            [reverse_name] => pl.test
                            [subdomain_level] => 0
                        )

                    [2] => Array
                        (
                            [record_id] => 5418
                            [name] => *.test.pl
                            [type] => A
                            [value] => 195.149.227.83
                            [ttl] => 86400
                            [prio] => 0
                            [reverse_name] => pl.test.*
                            [subdomain_level] => 0
                        )

                    [3] => Array
                        (
                            [record_id] => 5417
                            [name] => test.pl
                            [type] => TXT
                            [value] => v=spf1 a mx -all
                            [ttl] => 86400
                            [prio] => 0
                            [reverse_name] => pl.test
                            [subdomain_level] => 0
                        )

                    [4] => Array
                        (
                            [record_id] => 5419
                            [name] => *.test.pl
                            [type] => MX
                            [value] => test.pl
                            [ttl] => 86400
                            [prio] => 10
                            [reverse_name] => pl.test.*
                            [subdomain_level] => 0
                        )

                    [5] => Array
                        (
                            [record_id] => 5420
                            [name] => *.test.pl
                            [type] => TXT
                            [value] => v=spf1 a mx -all
                            [ttl] => 86400
                            [prio] => 0
                            [reverse_name] => pl.test.*
                            [subdomain_level] => 0
                        )

                    [6] => Array
                        (
                            [record_id] => 5414
                            [name] => test.pl
                            [type] => NS
                            [value] => ns2.tomekp.rix.pl
                            [ttl] => 86400
                            [prio] => 0
                            [reverse_name] => pl.test
                            [subdomain_level] => 0
                        )

                    [7] => Array
                        (
                            [record_id] => 5413
                            [name] => test.pl
                            [type] => NS
                            [value] => ns1.tomekp.rix.pl
                            [ttl] => 86400
                            [prio] => 0
                            [reverse_name] => pl.test
                            [subdomain_level] => 0
                        )

                    [8] => Array
                        (
                            [record_id] => 5421
                            [name] => test.pl
                            [type] => SOA
                            [value] => ns3.tomekp.rix.pl admin.tomekp.rix.pl 2007011501 10800 1800 604800 86400
                            [ttl] => 86400
                            [prio] => 0
                            [reverse_name] => pl.test
                            [subdomain_level] => 0
                        )

                )

Potrzebuję ją przesortować, najpierw według SOA,NS, a nasŧępnie po name i type, w kolejności, najpierw główna nazwa domeny, w tym przypadku test.pl, później wildcard *.test.pl przy czym rekordy dla test.pl i wildcard, mają być posortowane po typie tj. MX,A,TXT.
Jak mogę osiągnąć coś takiego, podejrzewam, że chodzi o napisanie funkcji porównującej do usort, ale nie mam pojęcia jak to zrobić.

Ten post edytował tomekp 17.01.2007, 11:01:15
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
gebp
post
Post #2





Grupa: Zarejestrowani
Postów: 180
Pomógł: 6
Dołączył: 10.04.2006

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


A nie prościej było by to wszystko (całą tablicę) wrzucić do bazy danych a następnie z niej pobrać odpowiednie wyniki?
Po co sobie komplikować sprawę?
Go to the top of the page
+Quote Post
tomekp
post
Post #3





Grupa: Zarejestrowani
Postów: 171
Pomógł: 0
Dołączył: 17.12.2003
Skąd: Krakół

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


Po to, że jak mam obsługiwać 50tyś domen, to każde zapytanie do bazy jest ważne (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
gebp
post
Post #4





Grupa: Zarejestrowani
Postów: 180
Pomógł: 6
Dołączył: 10.04.2006

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


Bo ja wiem.
A czy taki skrypt który będzie miał "przelecieć" tablice z 50 tys. domen to też nie będzie trwał zbyt długo (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) ?
Niestety nie znam się na tyle by sobie na to odpowiedzieć.

Po prostu poszedłem myśląc logicznie. Bazy danych zrobiono po to by gromadzić dane (duże ilości) po to by je łatwiej było sortować i wybierać odpowiednie itp. Można by sobie zostać na plikach tekstowych i było by fajnie.
Ciekawe jak by wyglądała np. baza nr tel. takiego sobie telekoma.

Ale jeżeli się mylę to mnie poprawcie.

Poza tym im bardziej skomplikowany skrypt tym łatwiej o pomyłkę. Tak mi się wydaje. Im prościej tym lepiej.
Go to the top of the page
+Quote Post
Cienki1980
post
Post #5





Grupa: Przyjaciele php.pl
Postów: 1 590
Pomógł: 40
Dołączył: 11.01.2007
Skąd: Centrum

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


Cytat(tomekp @ 15.01.2007, 20:19:21 ) *
Po to, że jak mam obsługiwać 50tyś domen, to każde zapytanie do bazy jest ważne (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Przy 50 tysięcy wpisów ... to stanowczo wolałbym zrobić więcej zapytań do bazy .. niż sortować tablicę w php.
Go to the top of the page
+Quote Post
tomekp
post
Post #6





Grupa: Zarejestrowani
Postów: 171
Pomógł: 0
Dołączył: 17.12.2003
Skąd: Krakół

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


Sortujesz tablicę dla danej strefy, góra 100 wpisów myślę.
Go to the top of the page
+Quote Post
Cienki1980
post
Post #7





Grupa: Przyjaciele php.pl
Postów: 1 590
Pomógł: 40
Dołączył: 11.01.2007
Skąd: Centrum

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


Cytat(tomekp @ 16.01.2007, 07:02:39 ) *
Sortujesz tablicę dla danej strefy, góra 100 wpisów myślę.

No to skoro będzie to jednak zapytanie dotyczące 100 wpisów a nie 50 tysiecy .... to i tak lepiej to umieścić w bazie danych, niż sortować w php.

Co do samego sortowania, kombinowałbym coś z tablicami, gdzie byłaby zapisana kolejność sortowania, a że chcesz aby było posortowane po dwóch wartościach to dwie takie tablice, odpowiednio ułożone pętle i mnóstwo warunków.

Stanowczo robiłbym zapytanie do SQL'a (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #8





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


Prosze uzupelnic tytul topika o odpowiedni tag ( szczegoly )

Inaczej topik zostanie zamkniety.
Go to the top of the page
+Quote Post
tomekp
post
Post #9





Grupa: Zarejestrowani
Postów: 171
Pomógł: 0
Dołączył: 17.12.2003
Skąd: Krakół

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


Cytat(dr_bonzo @ 16.01.2007, 11:24:46 ) *
Prosze uzupelnic tytul topika o odpowiedni tag

Poprawione.

A co do sortowania, to srotuję już na poziomie bazy, po name, ale później potrzebuję posortować po typie i po priorytecie.

Aktualnie robię to w ten sposób:
  1. <?php
  2. private function sortZone($records) {
  3. $ar_so = array();
  4. $ar_ns = array();
  5. $ar_mx = array();
  6. $ar_mb = array();
  7. $ar_ur = array();
  8. $ar_ov = array();
  9. $ar_ov_mx = array();
  10. $ar_ov_a = array();
  11. $ar_ov_txt = array();
  12. $ar_ov_default = array();
  13. $unique_records = array();
  14. $last = "";
  15.  
  16. foreach ($records as $value) {
  17. $unique_records[] = $value['name'];
  18. $ar_ov_mx[$value['name']] = array();
  19. $ar_ov_a[$value['name']] = array();
  20. $ar_ov_txt[$value['name']] = array();
  21. $ar_ov_default[$value['name']] = array();
  22. }
  23. $unique_records = array_unique($unique_records);
  24. foreach ($records as $c) {
  25. switch ($c['subdomain_level']) {
  26. case 0:
  27. switch(strtoupper($c['type'])) {
  28. case "SOA":
  29. $ar_so[] = $c;
  30. break;
  31. case "NS":
  32. $ar_ns[] = $c;
  33. break;
  34. default:
  35. switch (strtoupper($c['type'])) {
  36. case "MX":
  37. $ar_ov_mx[$c['name']][] = $c;
  38. break;
  39. case "A":
  40. $ar_ov_a[$c['name']][] = $c;
  41. break;
  42. case "TXT":
  43. $ar_ov_txt[$c['name']][] = $c;
  44. break;
  45. default:
  46. $ar_ov_default[$c['name']][] = $c;
  47. break;
  48. }
  49. break;
  50. }
  51. break;
  52. default:
  53. switch (strtoupper($c['type'])) {
  54. case "MX":
  55. $ar_ov_mx[$c['name']][] = $c;
  56. break;
  57. case "A":
  58. $ar_ov_a[$c['name']][] = $c;
  59. break;
  60. case "TXT":
  61. $ar_ov_txt[$c['name']][] = $c;
  62. break;
  63. default:
  64. $ar_ov_default[$c['name']][] = $c;
  65. break;
  66. }
  67. break;
  68. }
  69. }
  70. foreach ($unique_records as $record) {
  71. if (is_array($ar_ov_mx[$record])) {
  72. usort($ar_ov_mx[$record], "cmp_mx");
  73. foreach ($ar_ov_mx[$record] as $value) {
  74. $ar_ov[] = $value;
  75. }
  76. }
  77. if (is_array($ar_ov_a[$record])) {
  78. foreach ($ar_ov_a[$record] as $value) {
  79. $ar_ov[] = $value;
  80. }
  81. }
  82. if (is_array($ar_ov_txt[$record])) {
  83. foreach ($ar_ov_txt[$record] as $value) {
  84. $ar_ov[] = $value;
  85. }
  86. }
  87. if (is_array($ar_ov_default[$record])) {
  88. foreach ($ar_ov_default[$record] as $value) {
  89. $ar_ov[] = $value;
  90. }
  91. }
  92. }
  93. $res = array_merge($ar_so, $ar_ns, $ar_mx, $ar_mb, $ar_ur, $ar_ov);
  94. if (count($records) == count($res)) {
  95. $records = $res;
  96. } else {
  97. echo("sort_zone - records sorting failed!");
  98. }
  99. return $records;
  100. }
  101. ?>

Co jest wydaje mi się co najmniej mało wydajne.
Go to the top of the page
+Quote Post
mike
post
Post #10





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


Problem zasługuje na to by być na php a nie na Przedszkolu.
Przenoszę.
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: 23.08.2025 - 22:33