[PHP] Mappenstructuur achterhalen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • robg1984
  • Registratie: December 2002
  • Laatst online: 17-09 11:18
In de database staan alle mappen. Een map kan een submap zijn van een hoofdmap en een submap kan ook weer submappen hebben...

In de database staat het volgende:

file_id file_folder file_name
2 0 Occasions
3 0 Producten
4 0 Images
5 2 thumbs
6 2 thumbs_2
7 3 big
8 3 big_2

Ik wilde volgende array terug krijgen:

code:
1
2
3
4
5
6
7
8
9
10
11
Array
(
    [0] => 
    [4] => Images/
    [2] => Occasions/
    [5] => Occasions/thumbs/
    [6] => Occasions/thumbs_2/
    [3] => Producten/
    [7] => Producten/big/
    [8] => Producten/big_2/
)


maar ik krijg de volgende array terug:

code:
1
2
3
4
5
6
7
8
9
10
11
Array
(
    [0] => 
    [4] => Images/
    [2] => Occasions/
    [5] => Occasions/thumbs/
    [6] => Occasions/thumbs/thumbs_2/
    [3] => Producten/
    [7] => Producten/big/
    [8] => Producten/big/big_2/
)


Dit komt doordat hij altijd $value ervoor zet, zie onderstaande code...

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
class Files {
    public static $fileparents  =   array(0=>'');
    public static $options      =   array(0=>'');
            
    public function __construct(){
        $this->db = new dbMySQL;
                
        $folderData=array('items' => array(),'parents' => array()); 
        $folders=mysql_query('SELECT * FROM '.self::$table.' WHERE file_type=2 ORDER BY file_name');
        while ($f = mysql_fetch_assoc($folders)){
            $folderData['items'][$f['file_id']] = $f;
            $folderData['parents'][$f['file_folder']][] = $f['file_id'];
        }
        
        self::buildFolderList(0, $folderData);  
        self::buildFolderListOptions(0, $folderData);   
        
        echo '<pre>';
        print_r(self::$options);
    }
    public function buildFolderListOptions($parentId,$folderData,$value=''){
        if (isset($folderData['parents'][$parentId])){
            foreach ($folderData['parents'][$parentId] as $itemId){
                $value=$value.$folderData['items'][$itemId]['file_name'].'/';
                self::$options[$folderData['items'][$itemId]['file_id']]=$value;
                self::buildFolderListOptions($itemId, $folderData, $value);
                if($folderData['items'][$itemId]['file_folder']==0) $value='';
            }
        }
    }
}
?>


Hoe kan ik dit het beste oplossen?

Acties:
  • 0 Henk 'm!

  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

Ik zou bijhouden wat de waarde van file_folder is, is deze hetzelfde dan zit je dus nog op het zelfde niveau ...

Acties:
  • 0 Henk 'm!

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

http://www.sitepoint.com/article/hierarchical-data-database beter dan dit kan ik het niet uitleggen.

Programmer - an organism that turns coffee into software.


Acties:
  • 0 Henk 'm!

  • robg1984
  • Registratie: December 2002
  • Laatst online: 17-09 11:18
@TheRookie: ik ga daar eens naar kijken
@LuCarD: Mijn code heb ik gebaseerd op: http://crisp.tweakblogs.n...using-only-one-query.html
Bij jou heb je dus onder andere als parent een naam en geen id?

Acties:
  • 0 Henk 'm!

  • robg1984
  • Registratie: December 2002
  • Laatst online: 17-09 11:18
Het werkt.
Ik heb nu de functie aangepast in:

PHP:
1
2
3
4
5
6
7
8
9
10
public function buildFolderListOptions($parentId,$folderData,$value='', $last=''){
    if (isset($folderData['parents'][$parentId])){
        foreach ($folderData['parents'][$parentId] as $itemId){
            $value=$last.$folderData['items'][$itemId]['file_name'].'/';
            self::$options[$folderData['items'][$itemId]['file_id']]=$value;
            self::buildFolderListOptions($itemId, $folderData, $value, $last.$folderData['items'][$itemId]['file_name'].'/');
            if($folderData['items'][$itemId]['file_folder']==0) $value='';
        }
    }
}

Acties:
  • 0 Henk 'm!

Verwijderd

http://www.php.net/spl/ ?

RecursiveDirectoryItterator;
lijkt mij wel handig dan iig....
Pagina: 1