[PHP] Functie geeft niet de juiste array terug.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • xehbit
  • Registratie: Februari 2009
  • Laatst online: 26-08 22:19
Hallo Tweakers,

Ik ben bezig met een project waarmee ik mappen kan zoeken op mijn webserver, daarvoor heb ik de volgende functie geschreven.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    function SearchFolder($path = '.', $search){
        if($search == "" || !is_dir($path))         return false;
        if($dh = opendir($path)){
            while(false !== ($file = readdir($dh))){
                if($file != "." && $file != ".."){
                    if(is_dir($path.'/'.$file)){
                        $return[]=$path.'/'.$file.' [FOLDER]';
                        $tmp = SearchFolder($path.'/'.$file, $search);
                        echo print_r($tmp);
                        $return = array_merge($return, $tmp);
                    } else {
                        $return[]=$path.'/'.$file.' [FILE]';
                    }
                    
                }
            }
        }
        return $return;
    }


Het rare is, de $tmp word geen array, terwijl er op het laatst toch echt staat return $return; en e waarde $return word wel een array.

Ik zie hier eigenlijk geen fout in zitten, hopelijk andere wel :)

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 14:53

MueR

Admin Tweakers Discord

is niet lief

Ga eens debuggen dan? Ik je namelijk nergens return als array initialiseren. Leuk dat je in een loop besluit dat er een variabele $return is en dat je daar toevallig een array van maakt, maar als je een keer geen resultaten hebt wordt het geen array.

Overigens is het niet handig om een variabelen met een default in je functie call te zetten en daarna pas variabelen zonder, dan is het nut van de default weg.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • Koetjeboe
  • Registratie: Maart 2002
  • Laatst online: 20-09 21:46

Koetjeboe

Boe, zegt de koe

Begin maar eens met je error reporting aan zetten, er zitten wel wat foutjes in, die je er zelf makkelijk kunt uithalen als je waarschuwingen van php krijgt.

code:
1
error_reporting(E_ALL);


Oa dus dat je $return nergens initialiseert.

[ Voor 10% gewijzigd door Koetjeboe op 18-06-2010 11:02 ]


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 10:43

Matis

Rubber Rocket

@ TS, kijk eens hoe ze het oplossen in de RecursiveDirectoryIterator class van PHP ;)

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Modbreak:Wil je dat soort teksten voortaan achterwege laten?


Ik zou de code weggooien en de reactie van Matis goed lezen :).

[ Voor 64% gewijzigd door MueR op 18-06-2010 12:02 ]


Acties:
  • 0 Henk 'm!

  • xehbit
  • Registratie: Februari 2009
  • Laatst online: 26-08 22:19
Het is me toch gelukt om het werken te kunnen krijgen :)
er moest in de functie een $return = array(); komen. En nu werkt het :D
Bedankt voor e reacties :)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
    function SearchFolder($path = '.', $search){
        $return = array();
        if($search == "" || !is_dir($path))            return false;
        if($dh = opendir($path)){
            while(false !== ($file = readdir($dh))){
                if($file != "." && $file != ".."){
                    if(is_dir($path.'/'.$file)){
                        $return[]=$path.'/'.$file.' [FOLDER]';
                        $tmp = SearchFolder($path.'/'.$file, $search);
                        echo print_r($tmp);
                        $return = array_merge($return, $tmp);
                    } else {
                        $return[]=$path.'/'.$file.' [FILE]';
                    }
                    
                }
            }
        }
        return $return;
    }
?>

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Goed... ik zal mijn post dan nog maar even samenvatten, want ik ben van mening dat die toch best nuttig was:

• je gebruikt geen closedir() na de opendir()
echo print_r is een hele vreemde constructie als je het tweede argument van print_r niet gebruikt
• recursie is nooit verstanding om zomaar aan te beginnen, zeker niet als beginnende programmeur
• vermijd dan ook de recursie en gebruik een SplQueue

Acties:
  • 0 Henk 'm!

  • wackmaniac
  • Registratie: Februari 2004
  • Laatst online: 19-09 18:02
De fout zit oa hier:

PHP:
1
if($search == "" || !is_dir($path))            return false;


Maak daar maar eens van:
PHP:
1
if($search == "" || !is_dir($path))            return array();


Je moet even opletten dat je ALTIJD een array teruggeft als je die verwacht. En aangezien FALSE !== ARRAY ...

Read the code, write the code, be the code!


Acties:
  • 0 Henk 'm!

  • afraca
  • Registratie: April 2009
  • Laatst online: 13-08 16:46

afraca

Open Source!

Het is gelukkig al eerder gezegd, waarom moeilijk doen als het makkelijk kan?
Matis schreef op vrijdag 18 juni 2010 @ 11:04:
@ TS, kijk eens hoe ze het oplossen in de RecursiveDirectoryIterator class van PHP ;)
Zelf maak ik hiervan gebruik om grote bestanden recursief uit een directory te vissen (en filter filename is een zelf in elkaar geknutselde functie) :

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php

$fileSPLObjects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($_POST['path']),RecursiveIteratorIterator::SELF_FIRST);
try {
    foreach( $fileSPLObjects as $fullFileName => $fileSPLObject ) {
        
        if(!$fileSPLObject->isDir() && $fileSPLObject->getSize() > 400000000){
            $list[] = ucwords(filter_filename($fileSPLObject->getFilename()));
        }  
    }
}
catch (UnexpectedValueException $e) {
        printf("Directory [%s] contained a directory we can not recurse into", $directory);
}

?>


Heb er overigens nog op GoT onlangs een topic voor moeten aanmaken, om dat die class nou niet héél logisch is, maar er is mee te werken....

edit: Jaja, $list word ooit daarvoor nog wel gedeclareerd.

IMDB vote history | Next-gen OS, audio en video player, search engine en Movie DB

Pagina: 1