【问题标题】:php splitting a file into a multidimensional arrayphp将文件拆分为多维数组
【发布时间】:2016-03-26 03:31:50
【问题描述】:

在将文件内容拆分为多维数组时,我需要一些帮助。

文件内容示例:

--[DEATH KNIGHT]--
--|Blood|--
--{Single}--
/* MACRO CODE FOR SINGLE TARGET */
--{MULTI}--
/* MACRO CODE FOR MULTIPLE TARGETS */
--|Frost|--
/* MACRO CODE FOR SINGLE TARGET */
--{MULTI}--
/* MACRO CODE FOR MULTIPLE TARGETS */
--{Single}--
--[DRUID]--
--|Guardian|--
--{Single}--
/* MACRO CODE FOR SINGLE TARGET */
--{Multi}--
/* MACRO CODE FOR MULTIPLE TARGETS */

我需要读取此文件并将其拆分为具有以下结构的数组:

array(
  'DEATHKNIGHT' => array(
    'Blood' => array(
      'Single' = 'Single Target Macro Code',
      'Multi' = 'Multiple Target Macro Code'
      ),
    'Frost' => array(
      'Single' = 'Single Target Macro Code',
      'Multi' = 'Multiple Target Macro Code'
      )
  ),
  'DRUID' => array(
    'Guardian' => array(
      'Single' = 'Single Target Macro Code',
      'Multi' = 'Multiple Target Macro Code'
      )
)

我正在使用 file_get_contents() 将文件的内容读入字符串。我正在使用 preg_match_all() 来提取我定义的数组键。以下是我正在使用的正则表达式:

$class_regex = '/(?:-{2})(?:\[)(?:[A-Z][\w]+)(?:[\s][A-Z][\w]+)?(?:\])(?:-{2})/';
$spec_regex = '/(?:-{2})(?:\|)(?:[A-Z][\w]+)(?:[\s][A-Z][\w]+)?(?:\|)(?:-{2})/i';
$target_regex = '/(?:-{2})(?:\{)(?:[A-Z][\w]+)(?:[\s][\(][\d][\D][\)])?(?:\})(?:-{2})/i';

我可以成功提取密钥,并且可以将文件分成特定元素,但是在尝试创建数组时我很挣扎。任何帮助将不胜感激。提前谢谢你。

【问题讨论】:

  • while ($line = fgets($file))逐行阅读,而不是用file_get_contents()阅读全文。
  • 这些“目标”键 SingleMulti 是文件内容中的静态(常量)吗?
  • 是的,'Single' 和 'Multi' 是静态的。其他一切都不是。 “宏代码”的长度会有所不同。这意味着每个“宏代码”将覆盖不同数量的行。

标签: php arrays regex multidimensional-array


【解决方案1】:

就像 Barmar 所说,您应该使用 fgets 而不是 file_get_contents 逐行浏览它。

这是一个示例脚本,可以满足您的要求。您可能希望通过额外的验证等来扩展它。

<?php
$parsed = array();
$handle = fopen("source.txt", "r");
if ($handle) {
    while (($line = fgets($handle, 4096)) !== false) {
        if (preg_match('/^--\[((?:[A-Z][\w]+)(?:[\s][A-Z][\w]+)?)\]--$/', $line, $match)) {
            $class = $match[1];
        } elseif (preg_match('/^--\|((?:[A-Z][\w]+)(?:[\s][A-Z][\w]+)?)\|--$/', $line, $match)) {
            $spec = $match[1];
        } elseif (preg_match('/^--\{((?:[A-Z][\w]+)(?:[\s][A-Z][\w]+)?)\}--$/', $line, $match)) {
            $target = $match[1];
        } else {
            if (isset($class) && isset($spec) && isset($target)) {
                if (empty($parsed[$class])) {
                    $parsed[$class] = array();
                }
                if (empty($parsed[$class][$spec])) {
                    $parsed[$class][$spec] = array();
                }
                if (empty($parsed[$class][$spec][$target])) {
                    $parsed[$class][$spec][$target] = '';
                }
                $parsed[$class][$spec][$target] .= $line;
            }
        }
    }
    if (!feof($handle)) {
        echo "Error: unexpected fgets() fail\n";
    }
    fclose($handle);
}
echo print_r($parsed);

【讨论】:

    猜你喜欢
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多