-1

我正在尝试编写一个 PHP 脚本来安装在我的本地机器的 crontab 中,它将:

1) 登录远程 FTP 服务器
2) 检索文件列表
3) 下载自今天凌晨 12:00 以来创建的所有文件。

我已经能够将一些代码示例散列在一起并更接近我的预期结果。然而,我已经变得相当卡在一点上。为了获取新文件,我不得不使用 ftp_rawlist 函数。这将返回一个嵌套数组,其中每个文件都表示为一个数组,其中包含表示其属性(用户、组、大小等)的元素。我能够与数组中的项目进行交互,但是一旦我找到了我想要下载的“数组”,我就很难做到这一点。

编码

<?php 

    // define function to sync directory structure via ftp;

    date_default_timezone_set('America/New_York');
    chdir('/Users/robotlaptop/Desktop/phpfiles');

    // define some login credentials
    $ftp_username = 'xxx';
    $ftp_userpass = 'xxx';
    $ftp_server = 'xxx';
    // set up a connection
    $conn_id = ftp_connect($ftp_server);
    $login_result = ftp_login($conn_id, $ftp_username, $ftp_userpass);
    $sync_compare = date('d M');

    // set passive mode on
    ftp_pasv($conn_id, true);

        function listDetailed($resource, $directory = '.') { 
            if (is_array($children = @ftp_rawlist($resource, $directory))) { 
                $items = array(); 
                global $conn_id;
                global $sync_compare;
                foreach ($children as $child) { 
                    $chunks = preg_split("/\s+/", $child); 
                    list($item['rights'], $item['number'], $item['user'], $item['group'], $item['size'], $item['month'], $item['day'], $item['time']) = $chunks; 
                    $item['type'] = $chunks[0]{0} === 'd' ? 'directory' : 'file'; 
                    array_splice($chunks, 0, 8); 
                    $items[implode(" ", $chunks)] = $item; 
                    $synctest = $item['day'] . ' ' . $item['month'];

                    if ($sync_compare == $synctest ) {
                        ftp_get($conn_id, 'testfile', $file, FTP_BINARY);
                        }


                    }

                return $items; 
            } 

            // Throw exception or return false < up to you 
        } 


    $testme = listDetailed($conn_id, '/');

    print_r($testme);
    //print_r($testme);

    ftp_close($conn_id);

?>

上面的问题最具体地说是我无法弄清楚如何将表示文件名的数组的名称传递给给出现在循环内部的 ftp_get 函数的第三个参数。我尝试将 $file 更改为 $items,这在概念上是有意义的,但这是一个数组的名称,所以它不起作用。如果我猜对了,我需要弄清楚如何获得一个代表文件名字符串的变量。如果您查看 print_r 的输出(如下),您将看到每个文件名都映射到一个键值。

对不起,如果这个问题太简单了;我是编程新手。

的输出 print_r($testme)

    Array
    (
        [dandelions.txt] => Array
            (
                [time] => 16:12
                [day] => 12
                [month] => Mar
                [size] => 21
                [group] => 0
                [user] => 0
                [number] => 1
                [rights] => -rw-r--r--
                [type] => file
            )

        [goobs.txt] => Array
            (
                [time] => 21:34
                [day] => 29
                [month] => Nov
                [size] => 31
                [group] => 0
                [user] => 0
                [number] => 1
                [rights] => -rw-r--r--
                [type] => file
            )

    )
4

2 回答 2

1

要仅获取数组的键,可以使用array_keys

例如:

$array = [
    'hello.txt' => [
        'somerandomdata',
        'somemorerandomdata',
        'evenmore'
    ],
    'newfile.txt' => [
        'blah',
        'randomdata'
    ]
];
print_r(array_keys($array));

将返回

Array
(
    [0] => hello.txt
    [1] => newfile.txt
)
于 2013-03-12T18:03:11.243 回答
1

您可以按如下方式访问 foreach 中的数组键,假设文件数组为$files

foreach ($files as $file_name => $file_info) {

 ...

 } 
于 2013-03-12T18:04:13.430 回答