1

我需要根据单个 CSV 文件的内容在单个目录中重写多个文件。

例如,CSV 文件将包含如下内容:

define("LANG_BLABLA", "NEW");

在目录中的一个文件中,它将包含以下内容:

define("LANG_BLABLA", "OLD");

该脚本将搜索目录以及 CSV“LANG_BLABLA”与旧目录 LANG 匹配的任何匹配项,它将使用“NEW”更新“OLD”

我的问题是如何准确地在 1 个数组中列出目录中文件的内容,以便我可以轻松地搜索它们并在必要时进行替换。

谢谢。

4

3 回答 3

0

您可以使用http://php.net/manual/en/function.fgetcsv.php将 CSV 文件解析为数组fgetcsv

于 2013-07-03T14:27:00.463 回答
0

搜索目录相对容易:

<?
clearstatcache();
$folder  = "C:/web/website.com/some/folder";
$objects = scandir($folder, SCANDIR_SORT_NONE);
foreach ($objects as $obj) {
    if ($obj === '.' || $obj === '..')
        continue; // current and parent dirs
    $path = "{$folder}/{$obj}";
    if (strcasecmp(substr($path, -4), '.php') !== 0)
        continue // Not a PHP file
    if (is_link($path))
        $path = realpath($path);
    if ( ! is_file($path))
        continue; // Not a file, probably a folder
    $data = file_get_contents($path);
    if ($data === false)
        die('Some error occured...')
    // ...
    // Do your magic here
    // ...
    if (file_put_contents($path, $data) === false)
        die('Failed to write file...');
}

至于动态修改 PHP 文件,这可能表明您需要将这些东西放入数据库或内存数据存储中...... MySQL、SQLite、MongoDB、memcached、Redis 等应该这样做。您应该使用哪个取决于您的项目的性质。

于 2013-07-03T14:58:25.020 回答
0

首先,如果您使用 .php 文件,我不会推荐此工作流程。尝试集中您的定义语句,然后在一个位置进行更改。

但这是一个适用于 csv 文件的解决方案。它不完整,您必须添加一些您想要的逻辑。

/**
 * Will return an array with key value coding of your csv
 * @param $defineFile Your file which contains multiple definitions e.g. define("LANG_BLABLA", "NEW");\n define("LANG_ROFL", "LOL");
 * @return array
 */
public function getKeyValueArray($defineFile)
{
    if (!file_exists($defineFile)) {
        return array();
    } else {
        $fp = @fopen($defineFile, 'r');
        $values = explode("\n", fread($fp, filesize($defineFile)));
        $newValues = array();
        foreach ($values as $val) {
            preg_match("%.*\"(.*)?\",\s+\"(.*)?\".*%", $val, $matches);
            $newValues[$matches[1]] = $matches[2];
        }
    }
}
/**
* This is s stub! You should implement the rest yourself.
*/
public function updateThings()
    {
        //Read your definition into an array
        $defs=$this->getKeyValueArray("/some/path/to/your/file");
        $scanDir="/your/desired/path/with/input/files/";
        $otherFiles= scandir($scanDir);
        foreach($otherFiles as $file){
            if($file!="." && $file!=".."){
                //read in the file definition
                $oldDefinitionArray=$this->getKeyValueArray($scanDir.$file);
                //Now you have your old file in an array e.g. array("LANG_BLABLA" => "OLD")
                //and you already have your new file in $defs
                //You now loop over both and check for each key in $defs
                //if its value equals the value in the $oldDefinitionArray.
                //You then update your csv or rewrite or do whatever you like.
            }
        }
    }
于 2013-07-03T15:01:31.100 回答