PHP 中高效的读取和写入生成 yaml 配置文件
前言
PHP 读取YAML文件和生成YAML文件的简单操作方法,PHP 把 yaml 转换成数组有两种方式, 一种用 yaml 扩展, 另一种使用 别人开发好的 PHP_yaml 扩展。
一、使用 composer require symfony/yaml 来操作yaml
1、安装,前提配置好了 composer
composer require symfony/yaml
2、代码中引入
<?php
// Yaml
use Symfony\Component\Yaml\Yaml;
3、基本使用<?php
// Yaml
use Symfony\Component\Yaml\Yaml;
// 解析 YAML 为数组
$value = Yaml::parse("foo: bar");
// 读取 YAML 文件
$value = Yaml::parseFile('/path/to/file.yaml');
// 定义数组
$array = [
'foo' => 'bar',
'bar' => ['foo' => 'bar', 'bar' => 'baz'],
];
// 把 PHP 数组 转换成 YAML 配置
$yaml = Yaml::dump($array);
// 存储到指定文件中
file_put_contents('/path/to/file.yaml', $yaml);
二、使用PHP 编译 扩展 YAML 来操作
对于将 PHP 的数据转换成 YAML 来说,其实就和 JSON 相关的操作差不多,将数组转换成 YAML 格式的字符串。
$addr = array(
"given" => "Chris",
"family"=> "Dumars",
"address"=> array(
"lines"=> "458 Walkman Dr.
Suite #292",
"city"=> "Royal Oak",
"state"=> "MI",
"postal"=> 48046,
),
);
$invoice = array (
"invoice"=> 34843,
"date"=> 980208000,
"bill-to"=> $addr,
"ship-to"=> $addr,
"product"=> array(
array(
"sku"=> "BL394D",
"quantity"=> 4,
"description"=> "篮球",
"price"=> 450,
),
array(
"sku"=> "BL4438H",
"quantity"=> 1,
"description"=> "Super Hoop",
"price"=> 2392,
),
),
"tax"=> 251.42,
"total"=> 4443.52,
"comments"=> "Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.",
);
$yamlString = yaml_emit($invoice);
var_dump($yamlString);
// string(624) "---
// invoice: 34843
// date: 980208000
// bill-to:
// given: Chris
// family: Dumars
// address:
// lines: |-
// 458 Walkman Dr.
// Suite #292
// city: Royal Oak
// state: MI
// postal: 48046
// ship-to:
// given: Chris
// family: Dumars
// address:
// lines: |-
// 458 Walkman Dr.
// Suite #292
// city: Royal Oak
// state: MI
// postal: 48046
// product:
// - sku: BL394D
// quantity: 4
// description: "\u7BEE\u7403"
// price: 450
// - sku: BL4438H
// quantity: 1
// description: Super Hoop
// price: 2392
// tax: 251.42
// total: 4443.52
// comments: Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.
// ...
// "
可以看到 yaml_emit() 函数转换的结果是非常标准的 YAML 格式。开头有 --- ,结尾有 ... 。
但你会发现有很多教程或者框架中的 .yml 文件中是没有这些符号的,从官方文档中得知这些符号是建议写得,而我们的扩展则是非常地遵守建议,也就是转换的结果非常地标准。
此外,在测试代码中我们加入了中文的内容。可以看到直接转换的时候中文被编码了。就像 JSON 操作一样,在 YAML 这个扩展的函数中,我们也可以指定编码格式让中文原样显示。
var_dump(yaml_emit($invoice, YAML_UTF8_ENCODING));
// string(616) "---
// ………………
// description: 篮球
// ………………
// ...
// "
将 YAML 转为 PHP 数组
没错,也是类似于 JSON 操作的,将 YAML 格式的字符串格式内容反转回 PHP 数据内容。
var_dump(yaml_parse($yamlString));
// array(8) {
// ["invoice"]=>
// int(34843)
// ["date"]=>
// int(980208000)
// ["bill-to"]=>
// array(3) {
// ["given"]=>
// string(5) "Chris"
// ["family"]=>
// string(6) "Dumars"
// ………………
// ………………
同样非常简单地一个 yaml_parse() 函数。除了直接操作字符串之外,我们还可以直接提取文件内容来进行转换,包括上面的 yaml_emit() 函数也是有类似的直接将结果写入到文件中的。
var_dump(yaml_parse_file('styleci.yml'));
// array(3) {
// ["php"]=>
// array(3) {
// ["preset"]=>
// string(7) "laravel"
// ["disabled"]=>
// array(1) {
// [0]=>
// string(10) "unused_use"
// }
// ["finder"]=>
// array(1) {
// ["not-name"]=>
// array(2) {
// [0]=>
// string(9) "index.php"
// [1]=>
// string(10) "server.php"
// }
// }
// }
// ["js"]=>
// array(1) {
// ["finder"]=>
// array(1) {
// ["not-name"]=>
// array(1) {
// [0]=>
// string(14) "webpack.mix.js"
// }
// }
// }
// ["css"]=>
// bool(true)
// }
我们测试的这个文件就是 Laravel 中自带的那个 .styleci.yml 文件。在 Laravel 框架中并没有要求我们安装这个 YAML 扩展,似乎在框架中本身就有解决读取转换这种 YAML 格式的工具,这个我们最后再说。和 yaml_parse_file() 类似地,yaml_emit_file() 是直接将 PHP 数据转换为 YAML 格式之后直接写入到一个文件中,大家可以自己测试一下。
回调函数处理标签
不管是 yaml_emit() 还是 yaml_parse() 都是支持一个回调参数操作的。我们先来看看例子。
// php:
// preset: !laravel laravel
// disabled:
// ………………
// ………………
function callback($value){
return str_replace('laravel', 'new version laravel8', $value);
}
$ndocs = 0;
var_dump(yaml_parse_file('styleci.yml', 0, $ndocs, ['!laravel'=>'callback']));
// array(3) {
// ["php"]=>
// array(3) {
// ["preset"]=>
// string(20) "new version laravel8"
// ["disabled"]=>
// array(1) {
// ……………………
// ……………………
这是什么意思呢?
laravel 这种写法可以看做是 YAML 中的一种标签格式的写法。
而这个回调的作用就是在遇到类似的这类标签的时候,使用什么回调函数来进行处理。
比如我们的原文档中的 laravel 后面的内容是 laravel 。
在回调函数中我们将内容替换成了 new version laravel9 ,
最后输出的结果就是 preset 字段的内容变成了 new version laravel8 。
更加详细的内容以及更多地语法还是需要我们深入地了解 YAML 格式的语法才能够更加清楚。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanehee
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
excel下划线不显示怎么办
PHP中文网 06-23 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
微信运动停用后别人还能看到步数吗
PHP中文网 07-22 -
excel打印预览压线压字怎么办
PHP中文网 06-22