php将文件拆分为多维数组
我需要一些帮助来将文件内容拆分为多维数组 文件内容示例:php将文件拆分为多维数组,php,arrays,regex,multidimensional-array,Php,Arrays,Regex,Multidimensional Array,我需要一些帮助来将文件内容拆分为多维数组 文件内容示例: --[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 TARGET
--[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';
我可以成功地取出密钥,并且可以将文件分割成特定的元素,但是我在尝试创建数组时遇到了困难。任何帮助都将不胜感激。提前谢谢。就像Barmar说的那样,你应该使用fgets而不是file\u get\u内容逐行检查它 下面是一个示例脚本,它可以满足您的要求。您可能希望通过额外的验证等方式对其进行扩展
<?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);
就像Barmar说的那样,你应该使用fgets而不是file\u get\u内容逐行检查它
下面是一个示例脚本,它可以满足您的要求。您可能希望通过额外的验证等方式对其进行扩展
<?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);
while($line=fgets($file))用逐行阅读,而不是用file\u get\u contents()
阅读整个内容。那些“目标”键在文件内容中是单键和多键(常量)静态的吗?是的,“单键”和“多键”是静态的。其他一切都不是。“宏代码”的长度会有所不同。这意味着每个“宏代码”将覆盖不同数量的行。在($line=fgets($file))
时,使用逐行读取,而不是使用文件获取内容()读取整个内容。这些“目标”键在文件内容中是单个的
和多个
静态的(常量)?是,“单”和“多”是静态的。其他一切都不是。“宏代码”的长度会有所不同。这意味着每个“宏代码”将覆盖不同数量的行。