没错,自己挖的坑,哭着也得填

内容简要

  • 复杂嵌套JSON转换为数组
  • 文件操作
  • 实战爬虫

需要的技术

  • 基本的PHP常识
  • 基本的函数使用
  • 学习过前几篇文章

正文

复杂JSON解析

众所周知,JSON是一种特别常用的数据类型。用它可以用一段文字,存储多个信息。它的格式如下:

{"名称":"内容(值)","名称2":"内容2(值)","名称n":"内容n(值)"}

那么,PHP有个很好的函数:json_decode();,传入json字符串就会解析为Array。做个实验:

<?php
$data = '{"path":"common.php","site":"https://xxx.com/common.zip"}'; 
$decode = json_decode($data,true); //true写上,我也不知道有什么用

那么,decode变量会是一个Array数组,它的结构是这样的:

Array(
    "path" => "common.php",
    "site" => "https://xxx.com/common.zip",
);

那么,echo一个$decode['path'],会正常输出common.php
这时候如果来点复杂的json,可能就不是一回事了:
{"path":[{"name1":"common.php","name2":"admin_common.php"}],"site":[{"s1":"https://xxx.com/common.zip","s2":"https://xxx.com/common2.zip"}],"code":200}
再次用这个函数,发现返回了NULL。

是时候找万能的百度了。
还真让我找到了什么,原文链接:https://www.cnblogs.com/gaohj/p/3223421.html
代码如下:

function json_to_array($str) {
    if (is_string($str))
        $str = json_decode($str);
    $arr=array();
    foreach($str as $k=>$v) {
        if(is_object($v) || is_array($v))
            $arr[$k]=json_to_array($v);
        else
            $arr[$k]=$v;
    }
    return $arr;
}

还用了递归...
给大佬倒一杯卡布奇诺。
写一下注释:

function json_to_array($str) {
    if (is_string($str)) //若为字符串
        $str = json_decode($str); //先用自带函数解析一次
    $arr=array(); //定义一个用来放回的数组
    foreach($str as $k=>$v) { //循环数组
        if(is_object($v) || is_array($v))
            $arr[$k]=json_to_array($v); //递归调用自己
        else
            $arr[$k]=$v; //把数据存到arr里面
    }
    return $arr; //返回
}

这注释也没人能看懂了
使用方法:

$data = '{"path":[{"name1":"common.php","name2":"admin_common.php"}],"site":[{"s1":"https://xxx.com/common.zip","s2":"https://xxx.com/common2.zip"}],"code":200}';
$arr = jaon_to_array($data); //解析一下

此刻,var_dump一下,成功了。

(时间有点晚,先写到这里,JSON解析部分结束,明天后天看有时间接着写)

Last modification:October 17th, 2020 at 11:28 pm
如果这篇文章帮到了你,就打赏一下吧(只支持QQ)