我想创建一个类来将平面文件数据库信息解析为一个大的类似多维数组。我曾在一个排序蟒式的格式格式化数据库的想法如下:将平面文件数据库信息解析到多维数组中
"tree #1":
"key" "value"
"sub-tree #1":
"key" "value"
"key #2" "value"
"key #3" "value"
我试图让它解析这一点,并建立和阵列,同时在分析它的键/值丢进去,我希望它是非常动态和可扩展的。我尝试过很多不同的技术,而且我一直都被困在这些尝试中。这是我最近的:
function parse($file=null) {
$file = $file ? $file : $this->dbfile;
### character variables
# get values of
$src = file_get_contents($file);
# current character number
$p = 0;
### array variables
# temp shit
$a = array();
# set $ln keys
$ln = array("q"=>0,"k"=>null,"v"=>null,"s"=>null,"p"=>null);
# indent level
$ilvl = 0;
### go time
while (strlen($src) > $p) {
$chr = $src[$p];
# quote
if ($chr == "\"") {
if ($ln["q"] == 1) { // quote open?
$ln["q"] = 0; // close it
if (!$ln["k"]) { // key yet?
$ln["k"] = $ln["s"]; // set key
$ln["s"] = null;
$a[$ln["k"]] = $ln["v"]; // write to current array
} else { // value time
$ln["v"] = $ln["s"]; // set value
$ln["s"] = null;
}
} else {
$ln["q"] = 1; // open quote
}
}
elseif ($chr == "\n" && $ln["q"] == 0) {
$ln = array("q"=>0,"k"=>null,"v"=>null,"s"=>null,"p"=>null);
$llvl = $ilvl;
}
# beginning of subset
elseif ($chr == ":" && $ln["q"] == 0) {
$ilvl++;
if (!array_key_exists($ilvl,$a)) { $a[$ilvl] = array(); }
$a[$ilvl][$ln["k"]] = array("@mbdb-parent"=> $ilvl-1 .":".$ln["k"]);
$ln = array("q"=>0,"k"=>null,"v"=>null,"s"=>null,"p"=>null);
$this->debug("INDENT++",$ilvl);
}
# end of subset
elseif ($chr == "}") {
$ilvl--;
$this->debug("INDENT--",$ilvl);
}
# other characters
else {
if ($ln["q"] == 1) {
$ln["s"] .= $chr;
} else {
# error
}
}
$p++;
}
var_dump($a);
}
我真的不知道该从哪里出发。让我最困扰的事情是按照我在这里的方式设置多维值,如$this->c["main"]["sub"]["etc"]
。它可以完成吗?当数据嵌套在数据库文件中时,我怎样才能真正嵌套数组?
我一直在回答你的问题,直到你开始谈论你将如何格式化数据。没有不敬的意图,但是当SQLITE,MySQL,PostgreSQL,JSON,YAML,Pickle和其他几个人坐在那里等着你使用时,这是疯狂的? – gahooa
你的平板数据是什么样的?或者,你的第一个代码片段就是这样吗? –
@gahooa同意。 XML,序列化的PHP,CSV等。制作自己的平面文件格式是疯狂的。 –