PHP将数组从旧配置文件合并到新配置文件
我的应用程序的旧配置文件如下所示:PHP将数组从旧配置文件合并到新配置文件,php,arrays,file,merge,Php,Arrays,File,Merge,我的应用程序的旧配置文件如下所示: <?php return array( 'URL' => 'https://' . $_SERVER['HTTP_HOST'] . str_replace('public', '', dirname($_SERVER['SCRIPT_NAME'])), 'DOMAIN' => $_SERVER['HTTP_HOST'], 'PATH_CONTROLLER' => realpath(dirname(__FILE__
<?php
return array(
'URL' => 'https://' . $_SERVER['HTTP_HOST'] . str_replace('public', '', dirname($_SERVER['SCRIPT_NAME'])),
'DOMAIN' => $_SERVER['HTTP_HOST'],
'PATH_CONTROLLER' => realpath(dirname(__FILE__).'/../../') . '/application/controller/',
'DEBUG' => true,
'EMAIL_USED_MAILER' => 'phpmailer',
'SEND_MAIL_TO' => 'myreal@email.com'
);
<?php
return array(
'URL' => 'https://' . $_SERVER['HTTP_HOST'] . str_replace('public', '', dirname($_SERVER['SCRIPT_NAME'])),
'DOMAIN' => $_SERVER['HTTP_HOST'],
'PATH_CONTROLLER' => realpath(dirname(__FILE__).'/../../') . '/application/controller/',
'DEBUG' => false,
'EMAIL_USED_MAILER' => 'phpmailer',
'SEND_MAIL_TO' => 'your_mail@example.net',
'SEND_MAIL_FROM' => '',
'NEW_VAR' => 'foo'
);
首先,为了验证我是否正确理解了您的问题,我的回答基于以下假设:
您正在开发一个安装在多台服务器上的PHP应用程序(您自己或其他人可以下载您的应用程序)
每个安装都可以有自己的自定义配置,比如在名为config.php的文件中
您正在应用程序中的某个地方阅读此用户配置,假设您有一个类似于getConfig(){$config=include('config.php');return$config;}
您正在更新此应用程序,随着该更新,用户可以更改一些新的配置选项
如果以上都是真的,那么我建议采用以下工作流程:
不要触摸用户配置文件。是的,它可以自动完成,但要做到这一点很难,而且把事情搞砸的机会很大。例如:如果一个用户有一个写在两行上的选项——PHP同步正确,但是如果您在upgrade.PHP中假设每个配置都在一行上,那么您可能会破坏他或她的配置文件
在某处记录新的配置选项和/或提供一个包含所有可用选项的config.example.php
将当前现有的getConfig()
-函数(从假设3)更改为如下所示,这样您就可以进行一次安全的合并,并保证能够正常工作:
代码:
听起来您需要编写一个脚本来解析这两个配置文件并找出差异,然后生成一个新的配置文件。根据文件的内容,您可能可以使用一个简单的bash命令。@varlogtim是的,没错,我也在考虑awk和sed,但更喜欢php解决方案……文件中还有什么?一个可能的开始是将整个文件读入一个变量,上的分解
,
,然后上的分解
,这将为您提供一个键值数组
,然后您可以使用该数组比较键,以查看是否存在一个不在另一个中的键。不过,最好是用字符串替换您想要保留的任何字段。例如,"myreal@email.com“你想留什么就留什么。
<?php
return array(
'URL' => 'https://' . $_SERVER['HTTP_HOST'] . str_replace('public', '', dirname($_SERVER['SCRIPT_NAME'])),
'DOMAIN' => $_SERVER['HTTP_HOST'],
'PATH_CONTROLLER' => realpath(dirname(__FILE__).'/../../') . '/application/controller/',
'DEBUG' => true,
'EMAIL_USED_MAILER' => 'phpmailer',
'SEND_MAIL_TO' => 'myreal@email.com',
'SEND_MAIL_FROM' => '',
'NEW_VAR' => 'foo'
);
function getConfig() {
$applicationDefaultConfig = array(
'SEND_MAIL_FROM' => '',
'NEW_VAR' => 'foo'
);
$usersConfig = include('config.php');
return array_merge($applicationDefaultConfig, $usersConfig);
}