up vote 0 down vote favorite
share [g+] share [fb]

How to solve array problem?

Excepted result:

Array
(
    [0] => 2011/03/13
    [1] => 2011/03/14
    [2] => 2011/02/21
)

Failed result that I get now:

Array
(
    [0] => 2011/03/13
)
Array
(
    [0] => 2011/03/14
)
Array
(
    [0] => 2011/02/21
)

PHP code:

<?php
function get_dir_iterative($dir='.',$exclude=array('cgi-bin','.','..')){
    $exclude=array_flip($exclude);
    if(!is_dir($dir)){return;}
    $dh=opendir($dir);
    if(!$dh){return;}
    $stack=array($dh);
    $level=0;
    while(count($stack)){
        if(false!==($file=readdir($stack[0]))){
            if(!isset($exclude[$file])){
                if(is_dir("$dir/$file")){
                    $dh=opendir("$file/$dir");
                    if($dh){
                        $d=$file;
                        array_unshift($stack,$dh);
                        ++$level;
                    }
                }else{
                    if(isset($d)&&$level>0){
                        $mod=date('Y/m/d',filemtime("$d/$file"));
                        $ds="$d/";
                    }else{
                        $mod=date('Y/m/d',filemtime($file));
                        $ds='';
                    }
                    $array=array($mod);
                    //$b=array_merge($array); // it doesn't solve the problem
                    print_r($array);
                }
            }
        }else{
            closedir(array_shift($stack));
            --$level;
        }
    }
}
get_dir_iterative();
?>

Update:
On replacing $array=array($mod); with $array[]=$mod; does not return excepted result.

Array
(
    [0] => 2011/03/13
)
Array
(
    [0] => 2011/03/13
    [1] => 2011/03/14
)
Array
(
    [0] => 2011/03/13
    [1] => 2011/03/14
    [2] => 2011/02/21
)
link|improve this question

73% accept rate
feedback

4 Answers

up vote 1 down vote accepted
                $array=array($mod);
                //$b=array_merge($array); // it doesn't solve the problem
                print_r($array);

For one, array_merge requires at least two arrays to do its thing. You're only providing one, so there's nothing to merge with. Your "live" version creates a new array each time, so that's why you're getting the 'bad' output. Why not simply do

 $array[] = $mod;

which'll append the file's mtime to the array on each iteration? You might want to store the file's details as well, so you know where the mtime's coming from, so

 $array[$dir/$file] = $mod;

might be of more use.

link|improve this answer
1  
You're doing the print_r from within the loop, so you're getting all the intermediate stages while the array's still being built. Move the print_r() command OUTSIDE the while() loop so you only get the final result. – Marc B Mar 14 '11 at 16:20
You are right! It returns my excepted result. Thanks a lot! – Binyamin Mar 14 '11 at 16:24
feedback

array_merge() takes several parameters, the arrays that you want to merge, in your situation it should be:

array_merge($array, $mod);
// Or:
$array[] = $mod;

Note that you can simply add a new entry to your global array (second example) to add a value. Array_merge eats more memory than it needs.

link|improve this answer
Unfortunately $array[]=$mod; returns Array ( [0] => 2011/03/13 ) Array ( [0] => 2011/03/13 [1] => 2011/03/14 ) Array ( [0] => 2011/03/13 [1] => 2011/03/14 [2] => 2011/02/21 ) and not Array ( [0] => 2011/03/13 [1] => 2011/03/14 [2] => 2011/02/21 ). Any solution? – Binyamin Mar 14 '11 at 16:13
Well, why don't you print your value after the loop? – Artusamak Mar 14 '11 at 17:26
feedback

You can achieve this by replacing this code: $array=array($mod); with this code: $array[]=$mod;.

link|improve this answer
feedback

Try replacing the commented out line with $b[] = $array

link|improve this answer
You're doing a print_r from within the loop, so you're seeing the array at each iteration as it's built. move the print_r statement OUTSIDE the loop so you only see the final result. I don't know why you're getting the full y/m/d h:m:s output - your date format string should only return the y/m/d portion. Possibly your live code is doing something different than what you'd pasted here. – Marc B Mar 14 '11 at 16:15
feedback

Your Answer

 
or
required, but never shown

Not the answer you're looking for? Browse other questions tagged or ask your own question.