-1

ローカルマシンのcrontabにインストールするPHPスクリプトを作成しようとしています。

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関数に指定された3番目のパラメーターに渡す方法がわからないことです。$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 に答える