如何拆分从ftp_rawlist()获取的数组中的项

时间:2013-03-31 17:55:20

标签: php arrays ftp split

我试图再次专注于我的PHP技能,但我似乎仍然坚持使用数组。

我有一个包含700个项目的数组。然而,每个项目都是这样的:

-rw-r--r-- 1 u37148 u37148 714513 Dec 31 23:06 01-01-13-etc.tar.gz --> ITEM 1 in array
-rw-r--r-- 1 u37148 u37148 7402504 Dec 31 23:06 01-01-13-home-bnc.tar.gz --> ITEM 2 in array
etcetera

如上所示,每个项目都具有相同的结构,并且 9个单独的字符串以空格分隔符分隔。

我只需要提取每个项目的第9个字段需要什么代码? 我需要一个新的数组:

01-01-13-etc.tar.gz ; 01-01-13-home-bnc.tar.gz ; ... and so on.

我也可能需要能够访问每个项目的其他字段。

2 个答案:

答案 0 :(得分:0)

如果输入数组中的字符串始终具有相同的结构,则可以尝试以下操作:

$result = array();
foreach($input as $item)
    $result[] = explode(" ", $item)[8];

<强>更新

根据对fab的回答的评论,您可以尝试preg_split而不是explode

$result = array();
foreach($input as $item)
    $result[] = preg_split("/\s+/", $item, 9)[8];

这将通过一系列空格分割字符串,并返回包含9个项目的数组(最后一个可以包含空格)。

答案 1 :(得分:0)

您可以在$parts = explode(' ', $item)的空格处拆分字符串,然后使用$parts[8]访问第九部分,但我更喜欢正则表达式,即:

/^(?:.*? ){8}(.*?) /

如果您退一步,这可以使整个过程更容易。我想你的数组是file($someLogFile)的结果。在这种情况下,您可以将文件读入字符串,然后一次性获取文件名:

$log = file_get_contents($someLogFile);
preg_match_all('/^(?:.*? ){8}(.*?) /m', $log, $matches);
$fileNames = $matches[1];

更新

根据评论的上下文,现在构建合理的解决方案要容易得多。不幸的是,FTP LIST的输出通常不是简单的可分析的制表符分隔结构,而是为人类可读性而非机器可读性而设计的ASCII表。

尽管如此,如果您知道格式,可以使用捕获所有部分的正则表达式。

示例:

<?php
$ftp = ftp_connect('ftp.mozilla.org');
ftp_login($ftp, 'anonymous', '');
$rawlist = ftp_rawlist($ftp, '/');
$rawlist = join("\n", $rawlist);

preg_match_all('/^([drwx+-]{10})\s+(\d+)\s+(\w+)\s+(\w+)\s+(\d+)\s+(.{12}) (.*)$/m', $rawlist, $matches, PREG_SET_ORDER);

var_dump($matches);

<强>输出:

array(3) {
  [0]=>
  array(8) {
    [0]=>
    string(62) "-rw-r--r--    1 ftp      ftp           528 Nov 01  2007 README"
    [1]=>
    string(10) "-rw-r--r--"
    [2]=>
    string(1) "1"
    [3]=>
    string(3) "ftp"
    [4]=>
    string(3) "ftp"
    [5]=>
    string(3) "528"
    [6]=>
    string(12) "Nov 01  2007"
    [7]=>
    string(6) "README"
  }
  [1]=>
  array(8) {
    [0]=>
    string(66) "-rw-r--r--    1 ftp      ftp           561 Oct 03 15:44 index.ht
ml"
    [1]=>
    string(10) "-rw-r--r--"
    [2]=>
    string(1) "1"
    [3]=>
    string(3) "ftp"
    [4]=>
    string(3) "ftp"
    [5]=>
    string(3) "561"
    [6]=>
    string(12) "Oct 03 15:44"
    [7]=>
    string(10) "index.html"
  }
  [2]=>
  array(8) {
    [0]=>
    string(59) "drwxr-xr-x   43 ftp      ftp          4096 Aug 08  2012 pub"
    [1]=>
    string(10) "drwxr-xr-x"
    [2]=>
    string(2) "43"
    [3]=>
    string(3) "ftp"
    [4]=>
    string(3) "ftp"
    [5]=>
    string(4) "4096"
    [6]=>
    string(12) "Aug 08  2012"
    [7]=>
    string(3) "pub"
  }
}

根据你的例子,这种模式对你也有用。