如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留链接信息。

苏南大叔在上一篇文章中,对php的yaml的parse函数,进行了初步解读。文章见这里:https://newsn.net/say/php-yaml-parse.html 。我们可以知道,php的对yaml的parse函数,有四个参数,而我们只是解读试用了第一个参数。

在本篇文章中,苏南大叔将对后面三个参数进行解读。由于三个parse函数(yaml_parse_file,yaml_parse_url,yaml_parse)的参数都比较类似,这里我们以最基础的yaml_parse函数为例,展开阐述本篇文章的详细内容。yaml_parse 函数的说明见这里:https://doc.php.sh/zh/function.yaml-parse.html

mixed yaml_parse ( string $input [, int $pos = 0 [, int &$ndocs [, array $callbacks = null ]]] )

第一个参数 $input

$input是yml的字符串。我们不详细说明。

第二个参数 $pos

官方说明是这样的:Document to extract from stream (-1 for all documents, 0 for first document, ...)。苏南大叔实验了一下,这个参数是有关yml文档格式的。我们采用下面的文档格式,来说明这个参数。字符串的写法,我们采用了<<<这种定界符写法。

$yaml = <<<YAML
---
- event1:
  name: My Event
  date: 2017-11-12
---        
- event2:
  name: My Event 2
  date:  2017-11-18     
YAML;
$data = yaml_parse($yaml);
$data1 = yaml_parse($yaml, -1);
$data2 = yaml_parse($yaml, 0);
$data3 = yaml_parse($yaml, 1);
$data4 = yaml_parse($yaml, 2);
var_dump($data);
var_dump($data1);
var_dump($data2);
var_dump($data3);
var_dump($data4);

返回值如下:

array(1) {
  [0]=>
  array(3) {
    ["event1"]=>
    NULL
    ["name"]=>
    string(8) "My Event"
    ["date"]=>
    string(10) "2017-11-12"
  }
}
array(2) {
  [0]=>
  array(1) {
    [0]=>
    array(3) {
      ["event1"]=>
      NULL
      ["name"]=>
      string(8) "My Event"
      ["date"]=>
      string(10) "2017-11-12"
    }
  }
  [1]=>
  array(1) {
    [0]=>
    array(3) {
      ["event2"]=>
      NULL
      ["name"]=>
      string(10) "My Event 2"
      ["date"]=>
      string(10) "2017-11-18"
    }
  }
}
array(1) {
  [0]=>
  array(3) {
    ["event1"]=>
    NULL
    ["name"]=>
    string(8) "My Event"
    ["date"]=>
    string(10) "2017-11-12"
  }
}
array(1) {
  [0]=>
  array(3) {
    ["event2"]=>
    NULL
    ["name"]=>
    string(10) "My Event 2"
    ["date"]=>
    string(10) "2017-11-18"
  }
}
bool(false)

所以,这个参数描述的是yml文档里面的"---",大家感受一下。默认值是0,就是说,如果yml里面存在着多个"---"的话,那么只解析第一个“---”的内容,这个参数默认值的设定,苏南大叔认为不妥,默认应该解析全部(默认-1)才对。您说呢?

第三个参数 $ndocs

官方的说明是:If ndocs is provided, then it is filled with the number of documents found in stream。这个参数采用了 hacklangphp 极为诟病的引用类型。凭空创造了一个变量,并对其进行了赋值。当然了,这在php的世界里面是比较常见的事情了。

我们再看看这个新的例子:

$yaml = <<<YAML
---
- event1:
  name: My Event
  date: 2017-11-12
---        
- event2:
  name: My Event 2
  date:  2017-11-18     
YAML;
yaml_parse($yaml, -1, $ndoc);
yaml_parse($yaml, 0, $ndoc1);
yaml_parse($yaml, 1, $ndoc2);
yaml_parse($yaml, 2, $ndoc3);
var_dump($ndoc);
var_dump($ndoc1);
var_dump($ndoc2);
var_dump($ndoc3);

我们得到的值是:

int(2)
int(1)
int(2)
int(2)

所以,关于这个参数,苏南大叔的解读是:无论最终的处理结果如何,在处理的过程中,yaml_parse所经历的yml格式中的“---”的数量。

第四个参数 $callbacks

官方说明是:Content handlers for YAML nodes. Associative array of YAML tag => callable mappings. See parse callbacks for more details.

这个callback有些匪夷所思的节奏,首先,我们需要明确一点,我们写的是php,而不是node,所以这个callback的用法肯定和node是不一样的。php官方,有专门对这个callback参数的说明文档,见这里:https://doc.php.sh/zh/yaml.callbacks.parse.html

我们看一下下面的例子。

function _yaml_date($value, $tag, $flags) {
    return new DateTime($value);
}

$yaml = <<<YAML
event1:
   name: My Event
   date: !date 2017-11-22
   diy: !sunan awesome
YAML;
$data = yaml_parse($yaml);
print_r($data);
$data2 = yaml_parse($yaml, -1, $ndocs, array('!date' => '_yaml_date'));
print_r($data2);

function _yaml_sunan($value, $tag, $flags) {
    //var_dump(func_get_args());
    return "hi," . $value . "," . $tag . "," . $flags;
}

$data3 = yaml_parse($yaml, -1, $ndocs, array('!date' => '_yaml_date', '!sunan' => '_yaml_sunan',));
print_r($data3);

我们得到的返回值是这样的:


Array
(
    [event1] => Array
        (
            [name] => My Event
            [date] => 2017-11-22
            [diy] => awesome
        )

)
Array
(
    [0] => Array
        (
            [event1] => Array
                (
                    [name] => My Event
                    [date] => DateTime Object
                        (
                            [date] => 2017-11-22 00:00:00.000000
                            [timezone_type] => 3
                            [timezone] => PRC
                        )

                    [diy] => awesome
                )

        )

)
Array
(
    [0] => Array
        (
            [event1] => Array
                (
                    [name] => My Event
                    [date] => DateTime Object
                        (
                            [date] => 2017-11-22 00:00:00.000000
                            [timezone_type] => 3
                            [timezone] => PRC
                        )

                    [diy] => hi,awesome,!sunan,1
                )

        )

)

我们从这个例子里面,我们可以看到:

  • $callback是个数组,定义了在yml中碰到某种以!开头的“类型”时,该如何处理。至于callback函数里面的最后一个参数$flag,苏南大叔暂时没有看出来是什么意思,似乎恒定为1。官方也没有对其进行说明。大家如果有知道的,可以留言告诉我哦。谢谢~
  • 对于yml里面的以!开头的“类型”,如果不指定callback处理函数的话,那么将会被直接忽略。

总结

yml的格式,空格---- 都是有特殊含义的,所以不能随便删除。关于yml的更多解读,欢迎查看苏南大叔的更多文章:https://newsn.net/tag/yml/

  【php】秘籍文章入口,仅传授于有缘之人  php    yaml

欢迎转载传播本篇原创文章,转载请保留链接及作者信息。
本站采用创作共用版权协议, 要求署名、非商业用途和相同方式共享。
转载本站内容必须也遵循“署名-非商业用途-相同方式共享”的创作共用协议。
程序如此灵动~》下所有原创文章,如被用于商业用途,请您按规定支付稿费。

苏南大叔需要你的支持

打赏任意金额,发送截图到邮箱 shang@newsn.net ,可以领取精选回馈如下(任选其一):
  • 《前端视频教程大礼包》一套
  • 《wordpress精选皮肤》一套
  • 《dedecms织梦精选模板》一套
感谢您的打赏,让我更有动力,将更多精彩教程文章,呈现给大家!谢谢!

岁月静好

关注互联网发展,关注苏南大叔的《程序如此灵动~》博客
本文章来自:程序如此灵动~
博客地址为:https://newsn.net/
原文地址为:https://newsn.net/say/php-yaml-parse-2.html
上一篇好文:php的yaml解析函数
下一篇好文:php的yaml生成(emit)函数,深度解读

如果您转载了本文章,出于某种原因,并没有注明作者或者出处。
在这里,苏南大叔也表示理解和支持。因为苏南大叔深深地明白:
您会在合适的时机,合适的地方,给本博客一个外链。对吧?
您若开心,便是安好!岁月静好,但愿世界和平,没有纷争~