[ Príspevkov: 14 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
usporiadanie suborov RecursiveDirectoryIterator uasort

Registrovaný: 28.02.09
Prihlásený: 16.12.15
Príspevky: 241
Témy: 56 | 56

Cavte .. potrebujem poradit najst chybu, opravit, zbuzerovat - len potrebujem odpoved :D

cesta k suborom je ok.

chcel som to vyriesit tak ze to vsetko usporiadam podla nazvu (aj priecinky aj subory)
Kód:
uksort($files, 'strnatcmp');

a potom poposuvam priecinky do predu cez funkciu cmd()

prvotne usporiadanie:
mysecurity.zip, empty-lines.txt, test.xlsx, license.pdf, angukrus.docx, jellyfish.jpg, asd(priecinok)

po uksort() - vsetko OK:
angukrus.docx, asd(priecinok), empty-lines.txt, jellyfish.jpg, license.pdf, mysecurity.zip, test.xlsx

a chyba je vo funkcii cmd() .. aj ked by to malo fungovat pretoze je to rovnako napisane (teda podobne) ako na http://php.net/uasort

example na php.net
Kód:
function cmp($a, $b) {
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}


môj kód
Kód:
$iterator = new RecursiveDirectoryIterator($fullpath);
$files = iterator_to_array($iterator);
               
uksort($files, 'strnatcmp');

function cmp($a, $b)
{
                        if ($a->isDir() && !$b->isDir())
                        {
                                return -1;
                        }
                        elseif (!$a->isDir() && $b->isDir())
                        {
                                return 1;
                        }
                       
                        return 0;
}

uasort($files, 'cmp');


Offline

Užívateľ
Užívateľ
usporiadanie suborov RecursiveDirectoryIterator uasort

Registrovaný: 28.02.09
Prihlásený: 16.12.15
Príspevky: 241
Témy: 56 | 56
Napísal autor témyOffline : 09.01.2014 0:43 | usporiadanie suborov RecursiveDirectoryIterator uasort

a preco to pre boha usporiada inak v tychto pripadoch ... niesú tam splnene podmienky rovnako ?????

Kód:
function cmp($a, $b)
{
                        if ($a->isDir() && !$b->isDir())
                        {
                                return -1;
                        }
                        elseif (!$a->isDir() && $b->isDir())
                        {
                                return 1;
                        }
                       
                        return 0;
}
               
function cmp($a, $b)
{
                        if ($a->isDir() && $b->isDir())
                        {
                                return 0;
                        }
                       
                        return ($a->isDir() && !$b->isDir()) ? -1 : 1;
}


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 12.12.17
Príspevky: 1433
Témy: 2 | 2
Bydlisko: Praha / Rev...

V tej druhej (kratšej) funkcií nemáš správne vyriešené porovnanie file vs. file (splní sa vždy druhý return a vráti 1) Tam bude ten rozdiel.
Tá prvá mi na pohľad vyzerá správne, takže kde je problém neviem.

edit: Tak som si to vyskúšal a problémov vidím viac.
1. použitie porovnávača, ktorý je case sensitive. Tzn., že Z je ešte pred a (veľké Z pred malým a) a to je trochu blbosť. Riešením je použiť strnatcasecmp
2. uasort nefunguje tak, ako si predstavuješ. Ak chceš naozaj len priečinky presunúť na vrch zoznamu a zachovať ich poradie, použi vlastný sort, buď na princípe bubblesortu, alebo radixsortu (bubblesort je jednoduchší, radix je asymtoticky rýchlejší, ale to je pri malých poliach fuk)


_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
usporiadanie suborov RecursiveDirectoryIterator uasort

Registrovaný: 28.02.09
Prihlásený: 16.12.15
Príspevky: 241
Témy: 56 | 56
Napísal autor témyOffline : 09.01.2014 11:31 | usporiadanie suborov RecursiveDirectoryIterator uasort

k tej funkcii strcasecmp - mas pravdu ale v mojom pripade pri uploade na nazov pouzivam "lowercase" cize to je jedno ale vymenim ju ....

Kód:
function cmp($a, $b)
{
                        if ($a->isDir() && $b->isDir())
                        {
                                return 0;
                        }
                       
                        return ($a->isDir() && !$b->isDir()) ? -1 : 1;
}


preco to podla teba vrati stale 1 ??

ak a & b su priecinky vrati 0
(inak)
ak "a" je priecinok & "b" nieje priecinok vrati -1 inak vrati 1

kde je problem ??


no ten sort budem musiet spravit vlastny .. ina moznost mi nakoniec neostane ... aj ked velmi rad by som vedel kde je chyba alebo preco to nefunguje tak ako ocakavam


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 12.12.17
Príspevky: 1433
Témy: 2 | 2
Bydlisko: Praha / Rev...

Písal som o porovnaní file vs. file. Napíš si tú úvahu, keď a je súbor a aj b je súbor. Malo by vrátiť 0, ale nevráti.
A celé ti to nefunguje preto, že ten uasort nerobí to, čo chceš. On to proste zosortí zase, len nechá indexy napokoji (čo je v podstate na nič, takže to len zosortí zase)


_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
usporiadanie suborov RecursiveDirectoryIterator uasort

Registrovaný: 28.02.09
Prihlásený: 16.12.15
Príspevky: 241
Témy: 56 | 56
Napísal autor témyOffline : 09.01.2014 12:06 | usporiadanie suborov RecursiveDirectoryIterator uasort

jaaaaj no jasne ... zle som to pochopil


a k tomu sortu nikto nic ???


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 12.12.17
Príspevky: 1433
Témy: 2 | 2
Bydlisko: Praha / Rev...

akému sortu? nedostal si odpoveď?


_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
usporiadanie suborov RecursiveDirectoryIterator uasort

Registrovaný: 28.02.09
Prihlásený: 16.12.15
Príspevky: 241
Témy: 56 | 56
Napísal autor témyOffline : 09.01.2014 12:25 | usporiadanie suborov RecursiveDirectoryIterator uasort

ano ze si to mam spravit sam je OK odpoved ... ale vysvetlenie, myslim preco to tak nefunguje alebo ako to funguje ....


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 12.12.17
Príspevky: 1433
Témy: 2 | 2
Bydlisko: Praha / Rev...

Citácia:
A celé ti to nefunguje preto, že ten uasort nerobí to, čo chceš. On to proste zosortí zase, len nechá indexy napokoji (čo je v podstate na nič, takže to len zosortí zase)

Takže to len zosortíš dva krát. Raz podľa abecedy a raz podľa tej svojej vlastnej funkcie. A keďže uasort používa quicksort, tak to zoradí zle (celé znovu)
V manuále je napísané toto
Citácia:
If two members compare as equal, their relative order in the sorted array is undefined.
http://cz1.php.net/uasort

To znamená, že radiaci aloritmus nie je stabilný (nezachováva relativnú pozíciu prvkov). Ak by si to druhý krát zoradil stabilným algoritmom, tak by to zoradilo správne (tj. napríklad spomenutý bubblesort, či radixsort)
Otázkou je, či nie je zbytočné to radiť dva krát, keď to môžeš zoradiť raz vlastným.


Naposledy upravil BX dňa 09.01.2014 18:33, celkovo upravené 1

_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
usporiadanie suborov RecursiveDirectoryIterator uasort

Registrovaný: 28.02.09
Prihlásený: 16.12.15
Príspevky: 241
Témy: 56 | 56
Napísal autor témyOffline : 09.01.2014 13:13 | usporiadanie suborov RecursiveDirectoryIterator uasort

ok .. diiik za odpovede :) .. pochopil som


Offline

Užívateľ
Užívateľ
usporiadanie suborov RecursiveDirectoryIterator uasort

Registrovaný: 28.02.09
Prihlásený: 16.12.15
Príspevky: 241
Témy: 56 | 56
Napísal autor témyOffline : 09.01.2014 18:08 | usporiadanie suborov RecursiveDirectoryIterator uasort

Kód:
$iterator = new RecursiveDirectoryIterator($fullpath);
$files = iterator_to_array($iterator);
               
uksort($files, 'strnatcasecmp');

$files_s = array_values($files);
               
for ($i=0; $i<(count($files_s)-1); $i++)
{
                        $a = $files_s[$i];
                        $b = $files_s[$i+1];
                                           
                        $j=$i;
                       
                        while ((!$a->isDir() && $b->isDir()) && isset($files_s[$j-1]))
                        {
                                $files_s[$j] = $b;
                                $files_s[$j+1] = $a;

                                $j--;

                                $a = $files_s[$j];
                                $b = $files_s[$j+1];
                        }
}


Offline

Užívateľ
Užívateľ
usporiadanie suborov RecursiveDirectoryIterator uasort

Registrovaný: 28.02.09
Prihlásený: 16.12.15
Príspevky: 241
Témy: 56 | 56
Napísal autor témyOffline : 11.01.2014 14:01 | usporiadanie suborov RecursiveDirectoryIterator uasort

no mam to zle ... priecinok "aa" sa nedostane pred prvy subor zacinajuci s "112..." .. pred vsetky nasledujuce sa priecinok dostane iba pred ten uplne prvy nie

Kód:
$iterator = new RecursiveDirectoryIterator($fullpath);
$files = iterator_to_array($iterator);
               
uksort($files, 'strnatcasecmp');

$files_s = array_values($files);
               
for ($i=0; $i<(count($files_s)-1); $i++)
{                       
                        $a = $files_s[$i];
                        $b = $files_s[$i+1];
                       
                        $j=$i;
                       
                        while ((!$a->isDir() && $b->isDir()))
                        {
                                $files_s[$j] = $b;
                                $files_s[$j+1] = $a;
                               
                                if (isset($files_s[$j-1]))
                                {
                                        $j--;

                                        $a = $files_s[$j];
                                        $b = $files_s[$j+1];
                                }
                                else
                                {
                                        break;
                                }
                        }
}


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 12.12.17
Príspevky: 1433
Témy: 2 | 2
Bydlisko: Praha / Rev...

Tak tam hľadaj len nejaký problém v hraniciach pola. Vo fore ideš do count()-1 a to býva často zdrojom takýchto problémov, keď si nedáš poriadne pozor na indexy.


_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
usporiadanie suborov RecursiveDirectoryIterator uasort

Registrovaný: 28.02.09
Prihlásený: 16.12.15
Príspevky: 241
Témy: 56 | 56
Napísal autor témyOffline : 11.01.2014 14:51 | usporiadanie suborov RecursiveDirectoryIterator uasort

uz som opravil :) .. prispevok predtym .... v podmienke while bol problem


 [ Príspevkov: 14 ] 


usporiadanie suborov RecursiveDirectoryIterator uasort



Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy.

Usporiadanie suborov

v Operačné systémy Microsoft

0

138

24.08.2012 18:50

dangerous_123

V tomto fóre nie sú ďalšie neprečítané témy.

usporiadanie suborov v priecinku

v Operačné systémy Microsoft

0

182

19.12.2008 15:27

piaggio

V tomto fóre nie sú ďalšie neprečítané témy.

Ako pridat zopar suborov do image *.nrg suborov?

v Ostatné programy

7

787

30.08.2007 12:33

paulix

V tomto fóre nie sú ďalšie neprečítané témy.

Usporiadanie vysledkov

v JavaScript, VBScript, Ajax

3

101

25.12.2013 15:07

shaggy

V tomto fóre nie sú ďalšie neprečítané témy.

Usporiadanie kablov

v Chladiče a všetky druhy chladenia

5

1452

20.10.2006 17:09

ScorpionSX

V tomto fóre nie sú ďalšie neprečítané témy.

Usporiadanie čísiel

v Assembler, C, C++, Pascal, Java

26

362

28.03.2017 21:15

BX

V tomto fóre nie sú ďalšie neprečítané témy.

usporiadanie divov

v HTML, XHTML, XML, CSS

6

427

15.12.2009 20:07

neopagan

V tomto fóre nie sú ďalšie neprečítané témy.

Usporiadanie prvkov v poli

v Assembler, C, C++, Pascal, Java

4

186

13.04.2017 12:21

neutroN

V tomto fóre nie sú ďalšie neprečítané témy.

usporiadanie hodnot z tabulky

v PHP, ASP

7

373

17.05.2008 22:26

emer

V tomto fóre nie sú ďalšie neprečítané témy.

usporiadanie obrazkov v galerii

v PHP, ASP

4

220

20.04.2010 20:52

stenley

V tomto fóre nie sú ďalšie neprečítané témy.

Porovnávanie a usporiadanie čísiel

v Ostatné programy

0

419

12.08.2008 19:13

MANIAC

V tomto fóre nie sú ďalšie neprečítané témy.

Usporiadanie pri tlaci (css,pdf)

v PHP, ASP

5

261

15.11.2009 22:25

Blackdevil

V tomto fóre nie sú ďalšie neprečítané témy.

select produktov a cien + usporiadanie

v Databázy

18

391

14.07.2014 12:46

DeeJay3

V tomto fóre nie sú ďalšie neprečítané témy.

Gmail a usporiadanie doručenej pošty

v Služby a webstránky

0

370

04.12.2011 13:13

S1anley

V tomto fóre nie sú ďalšie neprečítané témy.

Usporiadanie fotiek v galerii - Wordpress

v Redakčné systémy

8

264

05.03.2014 11:40

mirom

V tomto fóre nie sú ďalšie neprečítané témy.

Prehladavanie Array a jeho usporiadanie

v PHP, ASP

4

344

15.07.2009 10:56

stenley



© 2005 - 2017 PCforum, edited by JanoF