大佬教程收集整理的这篇文章主要介绍了PHP解析自定义纯文本数据库,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
该文件是结构化的.文件中的每个项目都由大括号{}分隔,并以逗号开头.每个项目都有其拥有的属性列表,并且属性可以存在或不存在.如果不存在,服务器将假定它们为“默认”.
每个条目都用大括号括起来,并以逗号结尾:{},
该文件还包含标准的C注释,//以及/ * * /
该项目的每个属性都是从33个属性池中标准化的,其中只有3个是强制性的.可以包括或不包括属性.后端程序假定不包含的属性为默认属性.
有一些属性可以是多行甚至是多属性(如果需要的话,可以构成一个数组).
因此,该文件大致如下所示:
itemdb: (
/*
{
Multi line comment
here to explain the file
},
*/
// Here starts the items
{
Id: 500
DatabaseName: "Item_1"
Name: "Item 1"
Type: 1
Buy: 40
Weight: 10
},
{
Id: 501
DatabaseName: "Item_2"
Name: "Item 2"
Type: 1
Sell: 600
Weight: 200
Script: <" do stuff; ">
},
// Here is some more items
{
Id: 637
DatabaseName: "Item_137"
Name: "Item 137"
Type: 5
Buy: 9000
Weight: 300
Trade: {
nodrop: true
noTrade: true
}
Script: <"
do this stuff;
then this stuff;
">
},
// Note: Edited this in 2015-11-23, see below.
)
我需要一种将所有元素分解为数组以显示给用户的方法.数组看起来像这样(来自上面的示例):
$itemDB = Array
(
[500] => Array
(
[DatabaseName] => Item_1
[Name] => Item 1
[Type] => 1
[Buy] => 40
[Weight] => 10
)
[501] => Array
(
[DatabaseName] => Item_2
[Name] => Item 2
[Type] => 1
[Sell] => 600
[Weight] => 200
[Script] => do stuff
)
[637] => Array
(
[DatabaseName] => Item_137
[Name] => Item 137
[Type] => 5
[Buy] => 9000
[Weight] => 300
[Trade] => array
(
[nodrop] => true
[noTrade] => true
)
[Script] => do this stuff;\nthen this stuff
)
);
(因此,基本上将文件分成多维数组,文件的’Id’属性是每个数组的键,文件的每个属性是其自己的键/值)
我确实想出了以下代码来将数组分成每个条目:
$ready = str_replace(array("{","}"),"|", $itemDB);
$itemDB_explode = explode("|", $ready);
但是这段代码只会让我半途而废.我基本上得出这样的数组:
[7]=> string(124) " Id: 501 DatabaseName: "Item_2" Name: "Item 2" Type: 1 Sell: 600 Weight: 200 Script: <" do stuff "> "
但是对于我的一生,我无法弄清楚如何获得比这更进一步的信息,包括如何使数组的键成为Id以及每个属性都有自己的键/值.
重点是向用户显示条目,允许他们进行编辑,然后将文件保存回去.希望我能在将其保存回本方面获得帮助.
对于那些无疑会问的人:是的,我知道类似这样的内容更适合sql数据库.问题是该文件以及读取和解释该文件的后端不是我写的,我无法更改它.我只是在编写基于Web的前端以轻松更改该文件.
预先感谢您提供的帮助.
编辑2015-11-23:
我从最初的问题中删除了一些属性.考虑对实际文件进行的编辑,并添加那些缺少的属性:
{
Id: 845
DatabaseName: "Item_345"
Name: "Item 345"
Type: 3
Buy: 30000
Nouse: {
override: 30
sitting: true
}
Stack: [99, 4]
OnEquipScript: <" do this stuff; ">
OnUnequipScript: <"
do some more stuff;
this is some more stuff;
">
},
考虑一下文件中该附加块的结果数组是什么样的:
[845] => Array
(
[DatabaseName] => Item_345
[Name] => Item 345
[Type] => 3
[Buy] => 30000
[Nouse] => array
(
[override] => 30
[sitting] => true
)
[Stack] =>
(
[0] => 99
[1] => 4
)
[OnEquipScript] => do this stuff;
[OnUnequipScript] => do some more stuff;\nthis is some more stuff;
)
解决方法:
我以为我可以在15分钟内将其搁置,但多行脚本最终将我困住了.因此,它花了35分钟,但我可以向您保证,您还没走到一半;)
<?PHP
$items = array();
$in_comment = false;
$in_Trade = false;
$in_script = false;
$itemDB = file("foo.txt");
foreach ($itemDB as $row) {
$row = trim($row);
if (strpos($row, "//") === 0) continue;
if (strpos($row, "/*") === 0) {
$in_comment = true;
continue;
}
if (strpos($row, "*/") === 0) {
$in_comment = false;
continue;
}
if ($in_comment) continue;
if ($row === "itemdb: (") continue;
if ($row === ")") continue;
if (strpos($row, "{") === 0) {
$item = array();
}
elseif (!$in_Trade && strpos($row, "}") === 0) {
$items[$item["Id"]] = $item;
} else {
$row = explode(":", $row);
$key = trim($row[0]);
$val = isset($row[1]) ? trim($row[1]) : "";
if ($key === "Trade" && strpos($val, "{") === 0) {
$in_Trade = true;
$item["Trade"] = array();
continue;
} elseif ($in_Trade && $key === "}") {
$in_Trade = false;
continue;
} elseif ($key === "Script") {
$in_script = true;
$item["Script"] = "";
}
if ($in_Trade) {
$item["Trade"][$key] = $val;
} elseif ($in_script) {
$item["Script"] .= (empty($val) ? $key : $val) . "\n";
if (strpos($key, "\">") !== false || strpos($val, "\">") !== false) {
$item["Script"] = str_replace(array("<\"", "\">"), "", $item["Script"]);
$item["Script"] = trim($item["Script"]);
$in_script = false;
}
} else {
$item[$key] = $val;
}
}
}
print_r($items);
以上是大佬教程为你收集整理的PHP解析自定义纯文本数据库全部内容,希望文章能够帮你解决PHP解析自定义纯文本数据库所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。