Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP解析YAML,存储在DB中以便修改值,然后返回原始结构_Php_Mysql_Parsing_Multidimensional Array_Yaml - Fatal编程技术网

PHP解析YAML,存储在DB中以便修改值,然后返回原始结构

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

我需要能够在MySQL数据库中存储、修改和检索YAML数据内容

我的项目(和问题)目标:

  • 将.yml文件解析为PHP多维数组
  • 将这些存储到MySQL数据库中
  • 允许修改数据库主目标中的单个值
  • 从数据库中检索值,解析并放回.yml文件中
步骤1-YAML文件示例

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中看到的
    null
    s)
  • 从数据库返回此数据后,使用PHP函数将这些键和值返回到原始数组的确切结构(步骤2),以便我可以使用Spyc将其转换回YAML并输出到.yml文件

如果您想创建一个可以序列化为YAML的键值存储,您可能只需要创建:

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
应该是不必要的,因为它只是为了提供信息。您是对的,我为这篇文章准备的包装非常史诗般,但这正是我所需要的。谢谢!