Avatar billede stufdbear Nybegynder
25. juli 2004 - 14:59 Der er 9 kommentarer og
1 løsning

Sortering af et readdir til brug i destroydrop

Hejsa experter

Jeg har en funktion:
----------------------------------------------------------------
function GetDirTree($dir,$p2){
    global $Set_ShowHiddenFile,$i,$testcrap;

    $handle=opendir($dir);
    $j=0;  $p=$i;
    while ($file = readdir($handle)) {
        if ($file != '.' && $file != '..' && is_dir($file))    {
            if(!($Set_ShowHiddenFile==0 and eregi("^\.",$file) )) {
                // id, pid, name, url, title, target, icon, iconOpen, open
                $testcrap[] = "d.add(".($i+1).",".$p.",'$file','list.php?dir=".$GLOBALS["path"].$file."', '$file', 'main'); \n" ;
                $i++;
            }
        }
        if (is_dir($file) && $file != '.' && $file != '..') {
            if(!($Set_ShowHiddenFile==0 and eregi("^\.",$file) )) {
                $TMP = $GLOBALS["path"];
                $GLOBALS["path"] .= $file."/";
                chdir($file);
                GetDirTree(".",$p);
                $GLOBALS["path"] = $TMP;
                chdir ("..");
            }
        }
    }
    closedir($handle);
    return $testcrap;
}
----------------------------------------------------------------

den laver et array som jeg så senere udskriver til brug i destroydrop (www.destroydrop.com/javascripts/tree), nu er problemet så at den ikke sorterer det så directories bliver udskrevet tilfældigt, er der en som kan lave så de bliver listet alfabetisk?

StufdBear
Avatar billede coderdk Praktikant
25. juli 2004 - 15:02 #1
Har du prøvet at bruge sort() (eller asort()) på dit array?
Avatar billede stufdbear Nybegynder
25. juli 2004 - 15:12 #2
Ja, den gør det ikke ordentlig eller den kan ikke direkte bruges fordi det array kan se ud som følger:

Array
(
    [0] => d.add(1,0,'Dir1','list.php?dir=Dir1', 'Dir1', 'main');

    [1] => d.add(2,1,'test1','list.php?dir=Dir1/test1', 'test1', 'main');

    [2] => d.add(3,0,'Atest','list.php?dir=Atest', 'Atest', 'main');

    [3] => d.add(4,3,'test','list.php?dir=Atest/test', 'test', 'main');
)
Avatar billede coderdk Praktikant
25. juli 2004 - 21:47 #3
Her er et kort eksempel på hvordan det kan køres, se på usort():

<?php

    function specialSort($a, $b)
    {
        preg_match( "/dir\=(.+?)'/i", $a, $am );
        preg_match( "/dir\=(.+?)'/i", $b, $bm );
        if ( $am[1] == $bm[1] )
        {
            return 0;
        }
        return ( $am[1] < $bm[1] ) ? -1 : 1;
    }

    $arr = array(
            "d.add(1,0,'Dir1','list.php?dir=Dir1', 'Dir1', 'main');"
            ,"d.add(2,1,'test1','list.php?dir=Dir1/test1', 'test1', 'main');"
            ,"d.add(3,0,'Atest','list.php?dir=Atest', 'Atest', 'main');"
            ,"d.add(4,3,'test','list.php?dir=Atest/test', 'test', 'main');"
        );
   
    usort( $arr, "specialSort" );

    while ( list( $key, $value ) = each( $arr ) )
    {
      echo "$key: $value\n";
    }
   
?>
Avatar billede stufdbear Nybegynder
25. juli 2004 - 22:34 #4
Du har fat i noget af det rigtige, men stadig ikke.
Destroydrop virker sådan at hver dir får et id (det første tal) og subdirs bliver smidt bagefter (tal nummer 2 :-)), så når man smider dit forslag ind i Destroydrop så ligger de som før :-)
Det skal sorteres inden og derefter bygger man så op, jag har prøvet at lave så den kun udskriver de forskellige dir og så bruge natsort($array), men jeg ved ikke lige hvordan jeg får lavet så det bliver delt op bagefter.

Sådan virker add()

----------------------------------------------------------------------------
Adds a node to the tree.
Can only be called before the tree is drawn.

id, pid and name are required.
Parameters
Name     Type     Description
id     Number     Unique identity number.
pid     Number     Number refering to the parent node. The value for the root node has to be -1.
name     String     Text label for the node.
url     String     Url for the node.
title     String     Title for the node.
target     String     Target for the node.
icon     String     Image file to use as the icon. Uses default if not specified.
iconOpen String Image file to use as the open icon. Uses default if not specified.
open     Boolean Is the node open.
----------------------------------------------------------------------------
Avatar billede coderdk Praktikant
25. juli 2004 - 23:19 #5
Du skriver det selv, er løsningen så ikke at ændre din GetDirTree så den bare gemmer en liste af paths, sortere denne og så løbe den igennem og bygge

                $testcrap[] = "d.add(".($i+1).",".$p.",'$file','list.php?dir=".$GLOBALS["path"].$file."', '$file', 'main'); \n" ;

Hvor $GLOBALS['path'].$file så erstattes af et element i dit sorterede array?
Avatar billede stufdbear Nybegynder
25. juli 2004 - 23:30 #6
Jo men jeg ved ikke hvordan jeg lige skal genopbygge det =)
Kan godt få lavet så den skriver en dir liste ud i række følge, det er det efterfølgende med id og pid jeg ikke er med på hvordan jeg får smidt tilbage.
Avatar billede stufdbear Nybegynder
25. juli 2004 - 23:31 #7
Jeg havde håbet på at det hele kunne blive lavet i funktionen GetDirTree
Avatar billede coderdk Praktikant
26. juli 2004 - 00:15 #8
Jeg er lidt træt, så jeg kan ikke lige se hvordan det skulle kunne lade sig gøre. Kan du ikke bare reindexere? Hvis jeg har forstået det ret, er det noget a la dette du leder efter:

<?php

    function specialSort($a, $b)
    {
        preg_match( "/dir\=(.+?)'/i", $a, $am );
        preg_match( "/dir\=(.+?)'/i", $b, $bm );
        if ( $am[1] == $bm[1] )
        {
            return 0;
        }
        return ( $am[1] < $bm[1] ) ? -1 : 1;
    }

    $arr = array(
            "d.add(1,0,'Dir1','list.php?dir=Dir1', 'Dir1', 'main');"
            ,"d.add(2,1,'test1','list.php?dir=Dir1/test1', 'test1', 'main');"
            ,"d.add(3,0,'Atest','list.php?dir=Atest', 'Atest', 'main');"
            ,"d.add(4,3,'test','list.php?dir=Atest/test', 'test', 'main');"
        );
 
    echo "<b>Before sort:</b><pre>";
    var_dump( $arr );

    usort( $arr, "specialSort" );

    echo "</pre><b>After sort, before reindexing:</b><pre>";
    var_dump( $arr );

    $used = array();
    $used[0] = 0;
    $nid = 0;
    foreach ( $arr as $idx => $item )
    {
        $nid++;
        preg_match( "/\((\d+),(\d+),('.*?'),('.*?'), ('.*?'), ('.*?')\)/i", $item, $m );
        if ( array_key_exists( $m[2], $used ) )
        {
            $npid = $used[ $m[2] ];
        }
        else
        {
            die( "Damn. Failed to rebuild." );
        }
        $used[ $m[1] ] = $nid;
        $arr[ $idx ] = "d.add($nid,$npid,$m[3],$m[4], $m[5], $m[6]);";
    }

    echo "</pre><b>After sort and reindexing:</b><pre>";
    var_dump( $arr );
   
?>

Eller hvad?
Avatar billede coderdk Praktikant
26. juli 2004 - 00:16 #9
Og et svar i tilfælde af det er dét ;)
Avatar billede stufdbear Nybegynder
26. juli 2004 - 00:31 #10
Se det er sådan det skal være, takker mange gange.... er også hoppet i seng nu, kan ikke tænke mere =)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester