这是一个好用且强大的工具类,可以在网页上快捷的配置更多使用方法。
这是一个会将文本手动输入的Ini数据的文本转换成数组的一个工具类
方便在开发一些及其复杂的配置,但是又不想使用json,并且人又能读得懂的配置,就可以使用这个工具类。
开发者:荔枝、某毅

数据演示

开始使用

由于工具类是在PHP8.0开发的,暂未测试是否向下兼容

1.准备一串字符串数据

[title1]
miku = aaa
[title2]
miku[].qaq = aaa
[title3]
miku.qaq=aaa

2.将工具类IniUtil引入进PHP当中并使用准备好的字符串调用toArray方法

declare(strict_types=1);
require_once 'IniUtil.php';
$config = file_get_contents(__DIR__ . '/data.txt');
$data = IniUtil::toArray((string)$config);
print_r($data);

使用该方法可以直接得到上方演示图的效果
该工具的使用方法肥肠的煎蛋,我就不做过多介绍
<p style="color:#red">如果不会可以在评论区积极留言!</p>

IniUtil工具代码

<?php
declare(strict_types=1);

class IniUtil
{

    /**
     * 数据递归
     * @param array $a1
     * @param array $a2
     * @return array
     */
    private static function arrayMerge(array $a1, array $a2): array
    {
        $arr = $a1 + $a2;
        foreach ($arr as $k => $v) {
            if (is_array($v) && isset($a1[$k]) && isset($a2[$k])) {
                $arr[$k] = self::arrayMerge($a1[$k], $a2[$k]);
            }
        }
        return $arr;
    }

    /**
     * 对象解析器
     * @param $src
     * @param array $link
     * @param string $value
     */
    private static function parseObj(&$src, array $link, string $value)
    {
        if (count($link) <= 0) {
            $src = $value;
            return;
        }
        //拿到第一个key
        $shift = array_shift($link);
        //判断当前链式是否带[]
        if (str_contains($shift, '[]')) {
            //数组解析,创建数组
            $key = str_replace("[]", "", $shift);
            $src[$key][] = [];
            $index = count($src[$key]) - 1;
            self::parseObj($src[$key][$index], $link, $value);
            //解析对象
        } else {
            $src[$shift] = [];
            self::parseObj($src[$shift], $link, $value);
        }
    }

    /**
     * JSON转化数组
     * @param string $content
     * @return array
     */
    public static function toArray(string $content): array
    {
        $data = preg_split('/[\r\n]+/s', trim($content));
        $list = [];
        $nodeName = "";
        foreach ($data as $value) {
            if (empty($value)) {
                continue;
            }
            preg_match('#\\[(.*?)\\]$#', $value, $match);
            if (isset($match[1])) {
                $nodeName = $match[1];
                if (!array_key_exists($nodeName, $list)) {
                    $list[$nodeName] = [];
                }
            } else {
                if (!empty($nodeName)) {
                    $temporary = explode('=', $value);
                    if (count($temporary) != 2) {
                        //异常处理
                        exit("配置解析异常,{$value} 没有赋值");
                        //throw new JSONException('配置解析异常,' . $value . ' 没有赋值');
                    }

                    $left = trim($temporary[0]);
                    $leftParse = explode(".", $left);
                    $src = [];
                    self::parseObj($src, $leftParse, trim($temporary[1]));
                    $list[$nodeName] = self::arrayMerge($list[$nodeName], $src);
                } else {
                    //异常处理
                    exit("配置解析异常,{$value} 不能没有节点");
                    //throw new JSONException("配置解析异常,{$value} 不能没有节点");
                }
            }
        }
        return $list;
    }
}

下载工具类(含演示): Ini工具类(含演示).zip
工具类: IniUtil.php (在下载包内)
演示包使用说明: 访问parsing.php即可预览效果!

该文章以及工具类为原创设计,如需转载请标注好本小站地址哦!

最后修改:2022 年 05 月 09 日 10 : 54 AM