PHP解析YAML,存储在DB中以便修改值,然后返回原始结构
我需要能够在MySQL数据库中存储、修改和检索YAML数据内容 我的项目(和问题)目标:PHP解析YAML,存储在DB中以便修改值,然后返回原始结构,php,mysql,parsing,multidimensional-array,yaml,Php,Mysql,Parsing,Multidimensional Array,Yaml,我需要能够在MySQL数据库中存储、修改和检索YAML数据内容 我的项目(和问题)目标: 将.yml文件解析为PHP多维数组 将这些存储到MySQL数据库中 允许修改数据库主目标中的单个值 从数据库中检索值,解析并放回.yml文件中 步骤1-YAML文件示例 string 'name: singular: null plural: null fields: price: label: Preis company_id: label: null pl
- 将.yml文件解析为PHP多维数组
- 将这些存储到MySQL数据库中
- 允许修改数据库主目标中的单个值
- 从数据库中检索值,解析并放回.yml文件中
string 'name:
singular: null
plural: null
fields:
price:
label: Preis
company_id:
label: null
placeholder: null'
这里需要注意的重要事项是,嵌套键的数量可能是无限的,而且键和值可能具有相同的名称/数据
步骤2-将其放入PHP数组中
我用它来解析YAML。这太棒了!它给了我以下信息:
array
'name' =>
array
'singular' => null
'plural' => null
'fields' =>
array
'price' =>
array
'label' => string 'Preis' (length=5)
'company_id' =>
array
'label' => null
'placeholder' => null
我的下一个目标是将它们存储在MySQL数据库中。所以
第3步-CSV他们
在这里,我编写了自己的函数,它基本上是一个长长的foreach()
s列表,用于将这些细节分离到以下数组中:
array
0 => string 'name||singular||' (length=16)
1 => string 'name||plural||' (length=14)
2 => string 'fields||price||label||Preis' (length=27)
3 => string 'fields||company_id||label||' (length=27)
4 => string 'fields||company_id||placeholder||' (length=33)
步骤4-MySQL数据库
从逻辑上讲,我试图将这些字符串存储在数据库中。我不确定这个模式。我猜值将是value列中的结束($array[$key]
),而key列将包含数组中的其余元素
这将有效地允许我在将数据库中的值拉出、解析并返回到.yml文件之前更改它们
第五步-我迷路了!
所以我不知道现在该怎么办。目前我正试图用以下逻辑解析这些字符串:
- 最后一个值
是该值,数组中以前的所有元素都是父键end($array[$key]
- 一旦代码正常工作,有效地将这些字符串转换回数组将是下一个优先事项
- 实现我的项目目标的更合适的方法(见上图),如果有
- 将此数据存储在数据库中的最佳方法是允许轻松修改值(例如,您在步骤1中看到的
s)null
- 从数据库返回此数据后,使用PHP函数将这些键和值返回到原始数组的确切结构(步骤2),以便我可以使用Spyc将其转换回YAML并输出到.yml文件
CREATE TABLE key_values(
id INT PRIMARY KEY AUTO_INCREMENT,
parent_id INT,
type VARCHAR(255),
key VARCHAR(255),
value VARCHAR(255)
)
在这种情况下,id
是指根记录的方式,parent\u id
是链接子记录的机制,type
用于区分数组映射和索引数组。key
和value
用于存储各自的值
这样,您就可以创建适当的记录
数据中的一个示例可能是创建根节点:
INSERT INTO key_values VALUES (parent_id, type, key, value)
VALUES (NULL, 'map', NULL NULL)
然后为名称
键添加值,假定前一个插入的id
为1:
INSERT INTO key_values VALUES (parent_id, type, key, value)
VALUES (1, 'map', 'name' NULL)
该过程针对每个值递归重复:
INSERT INTO key_values VALUES (parent_id, type, key, value)
VALUES (2, 'string', 'singular' NULL),
(2, 'string', 'plural' NULL)
在任何情况下,您都需要为所有这些编写一个包装器类,否则它将太复杂而无法使用
实际上,我不确定经历所有这些麻烦会比简单地将YAML存储在LONGTEXT
字段中并在一天内调用要容易得多。操作和重新保存通常没有那么昂贵。在多层树结构上迭代是非常困难的
不过,对于纯YAML方法,您必须小心避免在竞争条件下踩踏写操作,但使用跟踪保存所针对版本的revision
列并不能解决这一问题。请构造更新,使其不匹配:
UPDATE yamls SET value='...', revision=93 WHERE id=20 AND revision=92
如果其他进程已经对其进行了更新,您将看到查询无法运行,并且可以相应地进行处理。这很有趣!我稍后将尝试您的代码。我最初是在研究修改的预排序树遍历:但这似乎是一个好方法(而且更简单、更高效)方法。使用您答案中的代码,我应该能够更新子元素,为其提供所有父键。那么这是访问该值的正确方法吗?我可以编写一个PHP函数来创建此字符串,具体取决于所查找的值和传入的键。func($value,array($key1,$key2))
例如…这实际上取决于您想访问一个键还是多个键。在WHERE
子句中指定type
应该是不必要的,因为它只是为了提供信息。您是对的,我为这篇文章准备的包装非常史诗般,但这正是我所需要的。谢谢!