捕获文本文件中的数组

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