捕获文本文件中的数组
Capturing an array inside text file
不幸的是,我有一个程序将一些信息保存在文本文件中,使文本文件几乎像一个数据库。所以我决定创建一个能够处理它的前端。
文件内容示例:
Host {
Name = test1
Address = 192.168.0.1
Port = 8080
}
Host {
Name = test2
Address = 192.168.0.2
Port = 8080
}
首先,我使用 fwrite()
在文件末尾插入新主机。但是,当我尝试使用 seek()
通过函数编辑主机时,效果不佳,因为它是逐字节计数的。
好的,所以我尝试为此创建一个数组,以尝试编辑像“名称”这样的数据。我实际上以这篇文章为基础:how to convert a string with brackets to an array in php.
Array ( [Host ] => Array ( [ Name = test1 Address = 192.168.0.1 Port = 8080 ] => Array ( ) ) )
谁能指导我正确的做法?
我的代码:
<?php
$input = shell_exec("cat /etc/Program/Hosts.conf");
$output = array();
$pointer = &$output;
while( ($index = strpos( $input, '{')) !== false) {
if( $index != 0) {
$key = substr( $input, 0, $index);
$pointer[$key] = array();
$pointer = &$pointer[$key];
$input = substr( $input, $index);
continue;
}
$end_index = strpos( $input, '}');
$array_key = substr( $input, $index + 1, $end_index - 1);
$pointer[$array_key] = array();
$pointer = &$pointer[$array_key];
$input = substr( $input, $end_index + 1);
}
print_r( $output);
?>
您可以使用file()
将文件转换为行数组,然后操作该数组以获得主机数组。试试这个
function hostsToArray($filepath){
$file = array_map('trim', file($filepath, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES));
$array = [];
$i = 0;
foreach ($file as $line) {
if( $line === 'Host {' ){
$array[$i] = [];
}else if( $line === '}' ){
$i++;
}else{
list($key, $value) = explode(' = ', $line);
$array[$i][$key] = $value;
}
}
return $array;
}
$hosts = hostsToArray('/etc/Program/Hosts.conf');
print_r($hosts);
不幸的是,我有一个程序将一些信息保存在文本文件中,使文本文件几乎像一个数据库。所以我决定创建一个能够处理它的前端。
文件内容示例:
Host {
Name = test1
Address = 192.168.0.1
Port = 8080
}
Host {
Name = test2
Address = 192.168.0.2
Port = 8080
}
首先,我使用 fwrite()
在文件末尾插入新主机。但是,当我尝试使用 seek()
通过函数编辑主机时,效果不佳,因为它是逐字节计数的。
好的,所以我尝试为此创建一个数组,以尝试编辑像“名称”这样的数据。我实际上以这篇文章为基础:how to convert a string with brackets to an array in php.
Array ( [Host ] => Array ( [ Name = test1 Address = 192.168.0.1 Port = 8080 ] => Array ( ) ) )
谁能指导我正确的做法?
我的代码:
<?php
$input = shell_exec("cat /etc/Program/Hosts.conf");
$output = array();
$pointer = &$output;
while( ($index = strpos( $input, '{')) !== false) {
if( $index != 0) {
$key = substr( $input, 0, $index);
$pointer[$key] = array();
$pointer = &$pointer[$key];
$input = substr( $input, $index);
continue;
}
$end_index = strpos( $input, '}');
$array_key = substr( $input, $index + 1, $end_index - 1);
$pointer[$array_key] = array();
$pointer = &$pointer[$array_key];
$input = substr( $input, $end_index + 1);
}
print_r( $output);
?>
您可以使用file()
将文件转换为行数组,然后操作该数组以获得主机数组。试试这个
function hostsToArray($filepath){
$file = array_map('trim', file($filepath, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES));
$array = [];
$i = 0;
foreach ($file as $line) {
if( $line === 'Host {' ){
$array[$i] = [];
}else if( $line === '}' ){
$i++;
}else{
list($key, $value) = explode(' = ', $line);
$array[$i][$key] = $value;
}
}
return $array;
}
$hosts = hostsToArray('/etc/Program/Hosts.conf');
print_r($hosts);