0

我试图再次专注于我的 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.

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

4

2 回答 2

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 个项目的数组(最后一个可以包含空格)。

于 2013-03-31T18:01:35.577 回答
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"
  }
}

就我可以通过您的示例判断而言,该模式也应该对您有用。

于 2013-03-31T19:03:27.250 回答