PHP захватить первое слово из строки - PullRequest
4 голосов
/ 17 июля 2011

У меня есть файл, который выглядит так (с переводом строки и странным интервалом):

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] ----> "Ошибка"
$ Players [3] ----> "Имя с пробелом"
$ Players [4] ----> "Боб"

Ответы [ 4 ]

6 голосов
/ 17 июля 2011
<?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]);

Для 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]);
3 голосов
/ 17 июля 2011

Другой вариант с использованием регулярного выражения может выглядеть следующим образом:

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

Примечание: Как и для любого регулярного выраженияна основе решения, если вышеприведенное выглядит как волшебство, тогда , пожалуйста, не используйте его .Нет абсолютно никакого смысла копировать и вставлять регулярное выражение в ваш код, если вы не понимаете, с чем оно на самом деле пытается соответствовать.

1 голос
/ 17 июля 2011

Вот подход с итераторами:

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            
)

Демонстрация приведенных выше примеров с данными вашего файла

0 голосов
/ 17 июля 2011

Самый простой способ:

$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]);

Окончательный результат в $:

array (
    0 => 'player1',
    1 => 'bug',
    2 => 'name with space',
    3 => 'bob',
  ),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...