PHP   发布时间:2022-04-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了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,请注明来意。
标签: