首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将这个字符串拆分成一个数组?

如何将这个字符串拆分成一个数组?
EN

Stack Overflow用户
提问于 2015-06-28 01:44:21
回答 6查看 104关注 0票数 2

因此,我有一些查询游戏服务器的数据,我需要找到一种方法来提取这些信息,以便在我的网站上使用。

代码语言:javascript
复制
# 7 "player1" 1156 STEAM_0:4:00100365   0 09:52   84    3 175.77.234.241:27505
# 8 "player2" 1149 STEAM_0:0:39163243  2 14:05   52    0 109.175.131.239:65423
# 9 "player " 1159 STEAM_0:0:162  31 07:19   45    0 78.1.126.130:27025
#10 "gameer123" 1146 STEAM_0:0:701135   4 16:41   94    0 191.200.0.100:14097

以上行的格式为:"id“"name”"userid“”唯一id“"frag”"time“"ping”"loss“"adr”

我如何提取这些信息并将其转换为数组,这样我就有了如下所示的内容

代码语言:javascript
复制
[0] => Array
    (
        [Id] => 0
        [Name] => Player0
        [Frags] => 0
        [Time] => 50856
        [Uniqueid] => STEAM_0:4:001534362
    )

[1] => Array
    (
        [Id] => 0
        [Name] => Player1
        [Frags] => 4
        [Time] => 1447
        [Uniqueid] => STEAM_0:4:00100365
    )

顺便说一句,我只需要球员的名字,碎片,时间和唯一的I。

EN

回答 6

Stack Overflow用户

发布于 2015-06-28 02:27:11

代码语言:javascript
复制
$keys = ["id", "name", "userid", "uniqueid", "frag", "time", "ping", "loss", "adr"];
$result = [];

foreach($array as $row){
    $row_array = preg_split('/\s+\"([^\"]+)\"\s+|#\s*|\s+/', $row, 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
    $result[] = array_combine($keys, $row_array);
    }
    var_export($result);

结果

代码语言:javascript
复制
array (
  0 => 
  array (
    'id' => '7',
    'name' => 'player1',
    'userid' => '1156',
    'uniqueid' => 'STEAM_0:4:00100365',
    'frag' => '0',
    'time' => '09:52',
    'ping' => '84',
    'loss' => '3',
    'adr' => '175.77.234.241:27505',
  ),
  1 => 
  array (
    'id' => '8',
    'name' => 'player2',
    'userid' => '1149',
    'uniqueid' => 'STEAM_0:0:39163243',
    'frag' => '2',
    'time' => '14:05',
    'ping' => '52',
    'loss' => '0',
    'adr' => '109.175.131.239:65423',
  ),
  2 => 
  array (
    'id' => '9',
    'name' => 'player ',
    'userid' => '1159',
    'uniqueid' => 'STEAM_0:0:162',
    'frag' => '31',
    'time' => '07:19',
    'ping' => '45',
    'loss' => '0',
    'adr' => '78.1.126.130:27025',
  ),
  3 => 
  array (
    'id' => '10',
    'name' => 'gameer123',
    'userid' => '1146',
    'uniqueid' => 'STEAM_0:0:701135',
    'frag' => '4',
    'time' => '16:41',
    'ping' => '94',
    'loss' => '0',
    'adr' => '191.200.0.100:14097',
  ),
)
票数 2
EN

Stack Overflow用户

发布于 2015-06-28 02:54:27

这是另一种RegEx方法,使用命名模式,这些模式被直接回收到数组键中,用于干净的、最终的数组。您可以在下面的解决方案中使用这里建议的任何RegEx模式集,只需在每个模式的括号的开头添加(?<Keyname>...)以使其命名即可。

代码语言:javascript
复制
$data = <<<EOL
# 7 "player1" 1156 STEAM_0:4:00100365   0 09:52   84    3 175.77.234.241:27505
# 8 "player2" 1149 STEAM_0:0:39163243  2 14:05   52    0 109.175.131.239:65423
# 9 "player" 1159 STEAM_0:0:162  31 07:19   45    0 78.1.126.130:27025
#10 "gameer123" 1146 STEAM_0:0:701135   4 16:41   94    0 191.200.0.100:14097
EOL;

/* Matching the source data with named patterns */

preg_match_all('#(?<Id>\d+)\s+"(?<Name>[[:alnum:]]+)"\s+\d+\s+(?<Uniqueid>STEAM_[0-9_:]+)\s+(?<Frags>\d+)\s+(?<Time>[\d:]{5})#m', $data, $fields, PREG_SET_ORDER);

/* Cleaning up the numeric keys from RegEx matches */

foreach($fields as $num=>$set) {
    $fields[$num] = array_diff_key($set, array_flip( array_filter( array_keys($set), 'is_int')) );
}

print_r($fields);

结果如下:

代码语言:javascript
复制
Array
(
    [0] => Array
        (
            [Id] => 7
            [Name] => player1
            [Uniqueid] => STEAM_0:4:00100365
            [Frags] => 0
            [Time] => 09:52
        )

    [1] => Array
        (
            [Id] => 8
            [Name] => player2
            [Uniqueid] => STEAM_0:0:39163243
            [Frags] => 2
            [Time] => 14:05
        )

    [2] => Array
        (
            [Id] => 9
            [Name] => player
            [Uniqueid] => STEAM_0:0:162
            [Frags] => 31
            [Time] => 07:19
        )

    [3] => Array
        (
            [Id] => 10
            [Name] => gameer123
            [Uniqueid] => STEAM_0:0:701135
            [Frags] => 4
            [Time] => 16:41
        )

)

请注意,我已经将源数据的第三行从"player "修改为"player",假设这是一个拼写错误。如果玩家名字中有其他字符,则添加到:(?<Name>[[:alnum:] _-]+)等中。

========

我将命名模式int-key-cleaner回收到一个函数中,以防有人需要经常使用。

代码语言:javascript
复制
    /* In place of the foreach-loop above, use: */

$fields = remove_int_keys_pma($fields);

    /* And stick these two functions somewhere. */

/* Remove integer keys from preg_match_all sets. (Must use PREG_SET_ORDER.) */

function remove_int_keys_pma($array) {
    foreach($array as $k=>$set) {
        $array[$k] = remove_int_keys($set);
    }
    return $array;
}

/* Remove integer keys from an array. */

function remove_int_keys($array) {
    return array_diff_key($array, array_flip( array_filter( array_keys($array), 'is_int')) );
}
票数 2
EN

Stack Overflow用户

发布于 2015-06-28 01:55:15

你可以使用explode()函数;

代码语言:javascript
复制
$result = [];
$number = 0;
foreach($mysql_result_rows as $row){
    $row_array = explode(' ', $row);
    $result[$number]['Id'] = trim($row_array['0'], ' ');
    $result[$number]['Name'] = trim($row_array['1'], '"');
    $result[$number]['Frags'] = trim($row_array['4'], ' ');
    $result[$number]['Time'] = trim($row_array['5'], ' ');
    $result[$number]['Uniqueid'] = trim($row_array['3'], ' ');
    $number++; 
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31091639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档