因此,我有一些查询游戏服务器的数据,我需要找到一种方法来提取这些信息,以便在我的网站上使用。
# 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”
我如何提取这些信息并将其转换为数组,这样我就有了如下所示的内容
[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。
发布于 2015-06-28 02:27:11
$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);结果
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',
),
)发布于 2015-06-28 02:54:27
这是另一种RegEx方法,使用命名模式,这些模式被直接回收到数组键中,用于干净的、最终的数组。您可以在下面的解决方案中使用这里建议的任何RegEx模式集,只需在每个模式的括号的开头添加(?<Keyname>...)以使其命名即可。
$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);结果如下:
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回收到一个函数中,以防有人需要经常使用。
/* 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')) );
}发布于 2015-06-28 01:55:15
你可以使用explode()函数;
$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++;
}https://stackoverflow.com/questions/31091639
复制相似问题