我有一个文件,看起来像这样(换行和奇怪的空格):
Player: Alive: Score: Ping: Member of Team:
player1 No 16 69 dogs
bug Yes 2 63 insects
name with space No 0 69 cats
bob No 0 69 dogs
我怎么能抓住第一列,并把它变成一个数组?
期望输出值:
$players[1] ----> "player1"
$players[2] ----> "bug"
$players[3] ----> "name with空格"
$players[4] ----> "bob"
<?php
$a=file('file.txt');
$pos=strpos($a[0],'Alive:');
$res=array_map(function($x) use ($pos){
return trim(substr($x,0,$pos));
},$a);
unset($res[0]);
For PHP 5.2
<?php
$a=file('file.txt');
$pos=strpos($a[0],'Alive:');
function funcname($x,$pos){
return trim(substr($x,0,$pos));
}
$res=array_map('funcname',$a,array_fill(0,count($a),$pos));
unset($res[0]);
另一个使用正则表达式的选项如下:
preg_match_all('/^.{0,15}?(?= {2}|(?<=^.{15}))/m', $subject, $matches);
$players = $matches[0];
unset($players[0]); // remove header
var_export($players);
生成的$players
数组看起来像
array (
1 => 'player1',
2 => 'bug',
3 => 'name with space',
4 => 'bob',
)
注意:与任何基于正则表达式的解决方案一样,如果上面的看起来像魔术,那么请不要使用。如果您不知道正则表达式实际上要匹配什么,那么将正则表达式复制粘贴到代码中是完全没有意义的。
下面是使用迭代器的一种方法:
class SubstringIterator extends IteratorIterator
{
protected $startAtOffset, $endAtOffset;
public function __construct($iterator, $startAtOffset, $endAtOffset = null) {
parent::__construct($iterator);
$this->startAtOffset = $startAtOffset;
$this->endAtOffset = $endAtOffset;
}
public function current() {
return substr(parent::current(), $this->startAtOffset, $this->endAtOffset);
}
}
你可以这样使用:
$playerIterator = new LimitIterator(
new SubstringIterator(
new SplFileObject('yourFile.txt'),
0, // start at beginning of line
15 // end before Alive:
)
, 1 // start at line 2 in file (omits the headline)
);
然后可以在迭代器上foreach
,例如
foreach ($playerIterator as $player) {
echo $player, PHP_EOL;
}
输出:player1
bug
name with space
bob
或者将堆叠迭代器转换为数组:
$array = iterator_to_array($playerIterator);
print_r($array);
输出:Array
(
[1] => player1
[2] => bug
[3] => name with space
[4] => bob
)
用你的文件数据
最简单的方法:
$file = file_get_contents($filepath);
$column_width = strpos($file,'Alive:') + 1;
preg_match_all('/^(.{'.$column_width.'}).*$/m', $file, $matches);
unset($matches[1][0]);
$result = array_map('trim', $matches[1]);
最后的$result是:
array (
0 => 'player1',
1 => 'bug',
2 => 'name with space',
3 => 'bob',
),