Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] sortowanie tablicy
Forum PHP.pl > Forum > PHP
tomekp
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ć.
gebp
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ę?
tomekp
Po to, że jak mam obsługiwać 50tyś domen, to każde zapytanie do bazy jest ważne smile.gif
gebp
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 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.
Cienki1980
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 smile.gif

Przy 50 tysięcy wpisów ... to stanowczo wolałbym zrobić więcej zapytań do bazy .. niż sortować tablicę w php.
tomekp
Sortujesz tablicę dla danej strefy, góra 100 wpisów myślę.
Cienki1980
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 tongue.gif
dr_bonzo
Prosze uzupelnic tytul topika o odpowiedni tag ( szczegoly )

Inaczej topik zostanie zamkniety.
tomekp
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.
mike
Problem zasługuje na to by być na php a nie na Przedszkolu.
Przenoszę.
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.