在 GO 中解析多维数组

Parse multidimensional arrays in GO

我想在 GO 中解析多维数组

目标是将数组字符串 a 运行 反序列化到循环中以获取值。

PHP中,我使用这个:

代码:

<?php
$x='a:2:{i:0;a:6:{s:8:"category";i:0;s:3:"url";s:0:"";s:6:"ruleid";i:0;s:9:"redirtype";i:0;s:8:"protocol";i:0;s:6:"PARSED";a:1:{s:4:"path";s:0:"";}}i:1;a:6:{s:8:"category";i:0;s:3:"url";s:3:"jjj";s:6:"ruleid";i:0;s:9:"redirtype";i:0;s:8:"protocol";i:0;s:6:"PARSED";a:1:{s:4:"path";s:3:"jjj";}}}';
$x = unserialize($x);
//Print Array
print_r($x);
//Parse Array
foreach ($x as $key => $value){
    //commandes
    echo "category is :".$x[$key]["category"]."\n";
    
    echo "path is :".$x[$key]["PARSED"]["path"]."\n";
}

输出:

Array
(
    [0] => Array
        (
            [category] => 0
            [url] => 
            [ruleid] => 0
            [redirtype] => 0
            [protocol] => 0
            [PARSED] => Array
                (
                    [path] => 
                )

        )

    [1] => Array
        (
            [category] => 0
            [url] => jjj
            [ruleid] => 0
            [redirtype] => 0
            [protocol] => 0
            [PARSED] => Array
                (
                    [path] => jjj
                )

        )

)
category is :0
path is :
category is :0
path is :jjj

GO 中,我设法反序列化字符串,但我不知道如何 运行 循环在 php

代码:

package main

import (
    "fmt"
    "github.com/techoner/gophp/serialize"
)

func main() {
    var line = []byte(`a:2:{i:0;a:6:{s:8:"category";i:0;s:3:"url";s:0:"";s:6:"ruleid";i:0;s:9:"redirtype";i:0;s:8:"protocol";i:0;s:6:"PARSED";a:1:{s:4:"path";s:0:"";}}i:1;a:6:{s:8:"category";i:0;s:3:"url";s:3:"jjj";s:6:"ruleid";i:0;s:9:"redirtype";i:0;s:8:"protocol";i:0;s:6:"PARSED";a:1:{s:4:"path";s:3:"jjj";}}}`)
    out, _ := serialize.UnMarshal([]byte(line))
    fmt.Println(out)
}

输出:

[map[PARSED:map[path:<nil>] category:0 protocol:0 redirtype:0 ruleid:0 url:<nil>] 

map[PARSED:map[path:jjj] category:0 protocol:0 redirtype:0 ruleid:0 url:jjj]]

有人可以帮忙吗?

在 Golang 中,你没有任何未知数组或对象的解析器,你的未知数据是接口,所以首先,你应该将数据转换为数组或对象,然后循环遍历它,下面的代码将做什么你要。

func main() {
    var line = []byte(`a:2:{i:0;a:6:{s:8:"category";i:0;s:3:"url";s:0:"";s:6:"ruleid";i:0;s:9:"redirtype";i:0;s:8:"protocol";i:0;s:6:"PARSED";a:1:{s:4:"path";s:0:"";}}i:1;a:6:{s:8:"category";i:0;s:3:"url";s:3:"jjj";s:6:"ruleid";i:0;s:9:"redirtype";i:0;s:8:"protocol";i:0;s:6:"PARSED";a:1:{s:4:"path";s:3:"jjj";}}}`)

    out, _ := serialize.UnMarshal(line)
    dataList := out.([]interface{})
    for _, data := range dataList {
        for k, v := range data.(map[string]interface{}) {
            if k == "category" {
                fmt.Printf("category is :%v\n", v)
            } else if k == "PARSED" {
                fmt.Printf("path is :%v\n", v.(map[string]interface{})["path"])
            }
        }
    }
}

输出:

path is :<nil>
category is :0
category is :0
path is :jjj

另外,这个包没有像 json.Unmarshal 那样的任何转换方法,因此您应该根据自己的数据知识来完成。