我试图再次专注于我的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.
我也可能需要能够访问每个项目的其他字段。
答案 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"
}
}
根据你的例子,这种模式对你也有用。