![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 249 Pomógł: 0 Dołączył: 22.12.2011 Ostrzeżenie: (10%) ![]() ![]() |
Chciałbym się dowiedzieć jak można posortować wielowymiarowe tablice mam na myśli kilku wymiarowe a nie dwie. Z tego co się orientuje to muszę każdy wymiar schować do nowo utworzonej tablicy i wtedy sortować i tak z każdym wymiarem?
Powiedzmy że tablica wygląda tak: Kod Array
( [0] => .htaccess. [1] => .htpasswd [2] => hhgute.hhi [3] => autoload.php [4] => config.php [5] => fp.map [6] => index.php [7] => test.php [8] => Array ( [0] => .pemhtaccess ) [9] => Array ( [con] => Array ( [ror] => Array ( [0] => Roctor.php [1] => Roe.php [2] => Derator.php [Dtor] => Array ( [0] => Mared.php [1] => Chased.php [2] => Gred.php [3] => Groed.php [4] => Restract.php ) [Dis] => Array ( [0] => Marked.php [1] => Chased.php [2] => Grouped.php [3] => Grouped.php [4] => Regt.php ) [3] => Badion.php [4] => Rouser.php [5] => fns.php [6] => bootstrap.php [Ror] => Array ( [0] => S.php ) [7] => Dispr.php ) ) [view] => Array ( [0] => viewLr.php [1] => view.php [2] => wid.php ) ) |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
A Ty dalej swoje...
http://php.net/manual/en/function.array-multisort.php |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 249 Pomógł: 0 Dołączył: 22.12.2011 Ostrzeżenie: (10%) ![]() ![]() |
Witam serdecznie. Lepiej mi pomóż się z tym uporać. Jak mam posortować ten burdel? Masz jakieś pomysły?
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
1. Jak miałoby to być posortowane?
2. Dostałeś na tacy podaną funkcję, która najprawdopodobniej rozwiązuje Twój problem, więc może spróbuj z niej skorzystać... |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
A jeszcze lepiej posortować PRZED budowaniem takiej durnej tablicy... Ani ona przydatna, ani poręczna... tfu... zapomniałem... innowacyjny autoloader (IMG:style_emoticons/default/biggrin.gif)
|
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 249 Pomógł: 0 Dołączył: 22.12.2011 Ostrzeżenie: (10%) ![]() ![]() |
Niestety array_multisort() wywala mi błąd:
Fatal error: Uncaught exception 'ErrorException' with message 'Array to string conversion' kiedy użyje array_multisort($r, SORT_ASC, SORT_STRING); http://stackoverflow.com/questions/1790493...-while-installi Niestety jest to serwer na którym nie jestem adminem i nie mogę nic zmieniać. Posortować ale jak kiedy mam różne klucze id oraz stringi. Ten post edytował MESSIAH :) 10.10.2015, 20:38:21 |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
Od rzyci strony się do tego zabierasz...
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 249 Pomógł: 0 Dołączył: 22.12.2011 Ostrzeżenie: (10%) ![]() ![]() |
Masz proszę oto funkcja:
Kod $ritit = new RecursiveIteratorIterator(new RecursiveDirectoryIterator(__DIR__, RecursiveDirectoryIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST); $r = array(); foreach ($ritit as $splFileInfo) { $path = $splFileInfo->isDir() ? array($splFileInfo->getFilename() => array()) : array($splFileInfo->getFilename()); for ($depth = $ritit->getDepth() - 1; $depth >= 0; $depth--) { $path = array($ritit->getSubIterator($depth)->current()->getFilename() => $path); } $r = array_merge_recursive($r, $path); } No proszę to ugryźć samemu. Tablica może wygląda jak wygląda ale to dzięki funkcji array_merge_recursive($r, $path); Ten post edytował MESSIAH :) 10.10.2015, 20:52:24 |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 965 Pomógł: 285 Dołączył: 19.06.2015 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 249 Pomógł: 0 Dołączył: 22.12.2011 Ostrzeżenie: (10%) ![]() ![]() |
Stworzyłem takową lecz jest nie posortowana bo serwer chyba sortuje według czasu ostatniej modyfikacji. Więc nie jest posortowana według folderów.
|
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 965 Pomógł: 285 Dołączył: 19.06.2015 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
To sobie napisz sortowanie bąbelkowe na szybko. Serio nie potrafisz posortować alfabetycznie tablicy?
|
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 249 Pomógł: 0 Dołączył: 22.12.2011 Ostrzeżenie: (10%) ![]() ![]() |
No niestety nie umie bo się dopiero uczę.
|
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 1 884 Pomógł: 231 Dołączył: 20.03.2005 Skąd: Będzin Ostrzeżenie: (0%) ![]() ![]() |
Pobierz sobie klasę: http://www.phpclasses.org/package/2056-PHP...dimensions.html
Powinna rozwiązać twoje problemy. |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 249 Pomógł: 0 Dołączył: 22.12.2011 Ostrzeżenie: (10%) ![]() ![]() |
Pobierz sobie klasę: http://www.phpclasses.org/package/2056-PHP...dimensions.html Powinna rozwiązać twoje problemy. Niestety to sortowanie jest sztywne czyli sortuje po stałych elementach tablicy a w moim przypadku jest to wartość zmienna. Niestety ale to sortuje według daty bo tak najprościej. Udało mi się posortować w części alfabetycznie ale tylko w części bo funkcja jakoś nie chce tego łyknąć. Nie mam pojęcia dlaczego część tabeli została posegregowana. Segregacja ta nie rozpoznaje koniec folderu gdzie powinna posegregować i dopiero przejść do następnego subfolderu. Ten post edytował MESSIAH :) 10.10.2015, 22:21:16 |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
1. Nadal nie podałeś nam jak finalnie ma być posortowana ta tablica...
2. Po co w ogóle korzystasz z RecursiveIteratorIterator skoro chwilę później (wewnątrz pętli) de facto niwelujesz jego działanie odtwarzając zagnieżdżoną strukturę katalogów? Skorzystanie z "gołego" RecursiveDirectoryIteratora byłoby dużo wygodniejsze. 3. Dlaczego raz w kluczach przechowujesz nazwę katalogu, raz nie przechowujesz nic (indeks numeryczny)? 4. Zdajesz sobie sprawę, że przypisywanie czegokolwiek do $path w przypadku czegoś co nie jest katalogiem mija się z celem, bo później zawsze to nadpisujesz w pętli for? 5. Rozumiesz w ogóle co robi Twój kod i za co odpowiedzialne są jego poszczególne elementy? Ten post edytował Crozin 10.10.2015, 22:47:36 |
|
|
![]()
Post
#17
|
|
Grupa: Zarejestrowani Postów: 249 Pomógł: 0 Dołączył: 22.12.2011 Ostrzeżenie: (10%) ![]() ![]() |
Chcę to posortować tak jak system Windows: Według nazw plików oraz nazw katalogów.
Sorki za przykład ale pochodzą one z SOF, widocznie siedzą tam same nieuki. Aktualnie mam inny kod który rozbija na katalogi i na katalogi z plikami. Teraz pewnie wystarczy sprawdzać katalogi czy są puste i je sortować. |
|
|
![]()
Post
#18
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Cytat Chcę to posortować tak jak system Windows: Według nazw plików oraz nazw katalogów. System Windows nie sortuje pilów. Nie robi tego również system plików (NTFS). Realizowane jest to dopiero przez program Explorer, a i ten domyślnie robi to inaczej niż podałeś. Wracając do tematu... wykorzystując RecursiveDirectoryIteratora sortuj elementy każdego katalogu z osobna (w ramach osobnej, lokalnej tablicy/kolekcji). Na końcu dostaniesz w efekcie wszystkie elementy posortowane wg tego samego wzoru.
|
|
|
![]()
Post
#19
|
|
Grupa: Zarejestrowani Postów: 249 Pomógł: 0 Dołączył: 22.12.2011 Ostrzeżenie: (10%) ![]() ![]() |
Udaje mi się posortować lecz ostatni problem tkwi w dużych literach. Mam pliki których nazwy zaczynają się z dużych liter i teraz sprawa wygląda tak że Duże litery są posortowane najpierw a dopiero później małe. Jak to rozwiązać? Znalazłem zastosowanie: natcasesort(). Pytanie teraz jak sprawdzić dany katalog czy zawiera pliki?
System Windows nie sortuje pilów. Nie robi tego również system plików (NTFS). Realizowane jest to dopiero przez program Explorer, a i ten domyślnie robi to inaczej niż podałeś. Wydaje mi się iż nie masz racji. Dawniej był DOS i to on sortował pliki natomiast Windows jest graficzną nakładką DOSa i korzysta z jego zasobów a dopiero programy takie jak explorer korzystają np z funkcji sortowania. https://en.wikipedia.org/wiki/List_of_DOS_commands Ten post edytował MESSIAH :) 12.10.2015, 20:55:39 |
|
|
![]()
Post
#20
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Cytat Udaje mi się posortować lecz ostatni problem tkwi w dużych literach. Mam pliki których nazwy zaczynają się z dużych liter i teraz sprawa wygląda tak że Duże litery są posortowane najpierw a dopiero później małe. Jak to rozwiązać? Do porównywania użyj jakiejś funkcji ignorującej wielkość znaków, np. strcasecmpCytat Pytanie teraz jak sprawdzić dany katalog czy zawiera pliki? Rzuć okiem na dokumentację RecursiveDirectoryIteratora.Cytat Cytat System Windows nie sortuje pilów. Nie robi tego również system plików (NTFS). Realizowane jest to dopiero przez program Explorer, a i ten domyślnie robi to inaczej niż podałeś. Wydaje mi się iż nie masz racji. Dawniej był DOS i to on sortował pliki natomiast Windows jest graficzną nakładką DOSa i korzysta z jego zasobów a dopiero programy takie jak explorer korzystają np z funkcji sortowania. |
|
|
![]()
Post
#21
|
|
Grupa: Zarejestrowani Postów: 249 Pomógł: 0 Dołączył: 22.12.2011 Ostrzeżenie: (10%) ![]() ![]() |
Teraz mam taką tablicę:
Ale niestety jest niemożliwe posortowanie według podkatalogów. Szukałem w całym necie i nigdzie nic nie ma. PHP jest ułomnym językiem skoro nie ma zdefiniowanego sortowania domyślnie według nazw. Problem z tą tablicą polega na tym iż PHP nie potrafi rozróżnić nazwy pliku od nazwy katalogu i żadna funkcja sortowania nie daje efektu. Wątpię by ktoś tutaj znał rozwiązanie. Nawet na SOF mają z tym problem. Używając funkcji natcasesort() na tej tablicy powinno odnieść skutek lecz efekt jest taki:
Jak widzimy system nie może rozróznić dwóch różnych stringów: [29] => ./core/con/ro/Daed.php [28] => ./core/con/ro/Datator/Groased.php Nie ma się do tego jak zabrać aby to rozwalić. Ten post edytował MESSIAH :) 17.10.2015, 20:55:05 |
|
|
![]()
Post
#22
|
|
Grupa: Zarejestrowani Postów: 915 Pomógł: 210 Dołączył: 8.09.2009 Skąd: Tomaszów Lubelski/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Co to za bełkot (np. "Jak widzimy system nie może rozróznić dwóch różnych stringów" - przecież widać dokładnie coś odwrotnego). Nie potrafisz się wysłowić i ja w sumie dalej do końca nie wiem o co chodzi bo zamiast dać przykłady "jak jest teraz", a "czego oczekujesz" to nabijasz posty jakimiś bzdurami (z tego co pamiętam, to ostatni wątek z tym "niemożliwym w PHP" sortowaniem został nawet zamknięty)
Cytat Ale niestety jest niemożliwe posortowanie według podkatalogów. Szukałem w całym necie i nigdzie nic nie ma. PHP jest ułomnym językiem skoro nie ma zdefiniowanego sortowania domyślnie według nazw. Problem z tą tablicą polega na tym iż PHP nie potrafi rozróżnić nazwy pliku od nazwy katalogu i żadna funkcja sortowania nie daje efektu. Wątpię by ktoś tutaj znał rozwiązanie. Nawet na SOF mają z tym problem. Jest możliwe. Źle szukałeś. Dalej nie rozumiesz, że to nie PHP jest za to odpowiedzialny. Problem polega z Tobą, bo myślisz że pozjadałeś wszystkie rozumy, a jak czegoś nie potrafisz to "się nie da", albo "PHP jest do dupy" (to nie pierwszy wątek gdzie można to zaobserwować). Z takim podejściem nie wróżę Ci wielkiej kariery w zawodzie programisty, chyba że będziesz miał ksywę "nie da się" :-)Wracając do problemu, jeśli dobrze zrozumiałem, to nawet mając Twoją tablicę wynikową można to łatwo zrobić:
Wynik: Kod ./core/con/ro/Daed.php Czy takiego wyniku oczekujesz?./core/con/ro/Disher.php ./core/con/ro/Dor.php ./core/con/ro/Datator/Groased.php ./core/con/ro/Datator/Grouased.php ./core/con/ro/Datator/Mased.php ./core/con/ro/Datator/Rebstract.php ./core/con/ro/Disher/Chsed.php ./core/con/ro/Disher/Gsed.php ./core/con/ro/Disher/GtBased.php ./core/con/ro/Disher/Maed.php ./core/con/ro/Disher/Rtract.php Ps. Ile w ogóle znasz języków, żeby wypowiadać się na temat ułomności PHP? Ten post edytował redeemer 18.10.2015, 09:12:15 |
|
|
![]()
Post
#23
|
|
Grupa: Zarejestrowani Postów: 249 Pomógł: 0 Dołączył: 22.12.2011 Ostrzeżenie: (10%) ![]() ![]() |
Dzięki za nakierowanie na właściwy trop. Problem jednak jest u minie z sortowaniem dużych i małych liter. Mianowicie Większe litery są przed małymi. Użyłem:
Teraz sortuje dobrze lecz jak można po zmniejszeniu tych stringów przywrócić je do poprzedniej formy? Ten post edytował MESSIAH :) 18.10.2015, 09:51:24 |
|
|
![]()
Post
#24
|
|
Grupa: Zarejestrowani Postów: 915 Pomógł: 210 Dołączył: 8.09.2009 Skąd: Tomaszów Lubelski/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
org_path będzie zawierał oryginalną ścieżkę Edit: Albo sprawdź:
Ten post edytował redeemer 18.10.2015, 10:05:01 |
|
|
![]()
Post
#25
|
|
Grupa: Zarejestrowani Postów: 249 Pomógł: 0 Dołączył: 22.12.2011 Ostrzeżenie: (10%) ![]() ![]() |
Wielkie dzięx kolego. Ten drugi multisort zrobił robotę. Teraz będę musiał na spokojnie przeanalizować cały kod. Jest jeszcze mały problem z sortowaniem mniejszych wartości a mianowicie tak to wygląda:
/.htaccess. /.htpasswd /autoload.php /config.php /Foute.hhi /files_map.map /index.php /te.php /tes.php /test.php /test1.php /testy.php /.protect/.pemhtaccess /views/hello.php /views/uzwnik.html /core/view/view.php /core/view/viewLoader.php /core/view/wok.php /views/css/unik.css Ten post edytował MESSIAH :) 18.10.2015, 10:50:48 |
|
|
![]()
Post
#26
|
|
Grupa: Zarejestrowani Postów: 915 Pomógł: 210 Dołączył: 8.09.2009 Skąd: Tomaszów Lubelski/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Zobacz to. Pisane na kolanie, nie sprawdzałem czy działa:
|
|
|
![]()
Post
#27
|
|
Grupa: Zarejestrowani Postów: 249 Pomógł: 0 Dołączył: 22.12.2011 Ostrzeżenie: (10%) ![]() ![]() |
Ciekawy przykład. Tylko jest w nim mała wada a mianowicie funkcja scandir(). Po co mam skanować kolejny raz katalogi kiedy już wcześniej zrobił to RecursiveDirectoryIterator. Funkcja jest zbędna gdyż należy zoptymalizować kod oraz działanie aplikacji. Już wcześniej myślałem o jej użyciu i wystarczyło mi tylko pobrać same nazwy katalogów oraz podkatalogów a następnie przepuścić przez scandir() i gotowe oraz posortowane. Mi zależy na Iteratorze oraz jak najmniejszym kodzie.
Jest udało mi się w 90% rozwalić ten kod i wklejając dwie linijki mam posortowane prawidłowo około 90% tablicy. Bez żadnych pętli funkcji itp. Ten post edytował MESSIAH :) 18.10.2015, 17:19:33 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 16.10.2025 - 23:54 |