Проблема с массивом PHP, array_merge () не решает проблему - PullRequest
0 голосов
/ 14 марта 2011

Как решить проблему с массивом?

Ожидаемый результат:

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

Неудачный результат, который я получаю сейчас:

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

PHP код:

<?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();
?>

Обновление:
При замене $array=array($mod); на $array[]=$mod; не возвращается ожидаемый результат .

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
)

Ответы [ 4 ]

3 голосов
/ 14 марта 2011

array_merge () принимает несколько параметров, массивов, которые вы хотите объединить, в вашей ситуации это должно быть:

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

Обратите внимание, что вы можете просто добавить новую запись в ваш глобальный массив (второй пример)), чтобы добавить значение.Array_merge съедает больше памяти, чем нужно.

1 голос
/ 14 марта 2011

Попробуйте заменить закомментированную строку на $b[] = $array

1 голос
/ 14 марта 2011
                $array=array($mod);
                //$b=array_merge($array); // it doesn't solve the problem
                print_r($array);

Во-первых, для array_merge требуется как минимум два массива.Вы предоставляете только один, так что не с чем слиться.Ваша «живая» версия каждый раз создает новый массив, поэтому вы получаете «плохой» вывод.Почему бы просто не сделать

 $array[] = $mod;

, который будет добавлять mtime файла в массив на каждой итерации?Возможно, вы также захотите сохранить детали файла, чтобы вы знали, откуда исходит mtime, поэтому

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

может быть более полезным.

1 голос
/ 14 марта 2011

Вы можете добиться этого, заменив этот код: $array=array($mod); на этот код: $array[]=$mod;.

...