从行中抓取第一个单词


PHP Grab first word from line

我有一个文件,看起来像这样(换行和奇怪的空格):

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',
  ),