php使用点语法操作多维数组、动态生成多维数组、逐级给数组键赋值

<?php

class Arr
{
    
    /**
     * 数组取值,支持点分割的键,为了避免歧义,数组的键不要有`.`
     * @param array $data 要取值的数组
     * @param string $key 要取的键,如果键为null,则返回整个数组
     * @param mixed $default 默认值
     * @param bool $exists 引用返回键是否存在
     * @return mixed
     */
    public function arrGetter(array $data, $key, $default = null, &$exists = null)
    {
        if ($key === null) {
            return $data;
        }

        foreach (explode('.', $key) as $k) {
            if (is_array($data) && array_key_exists($k, $data)) {
                $data = $data[$k];
            } else {
                $exists = false;
                return $default;
            }
        }

        $exists = true;
        return $data;
    }

    /**
     * 数组赋值,支持点分割的键,为了避免歧义,数组的键不要有`.`
     * @param array $data 要赋值的数组
     * @param string $key 赋值的键,如果为null,就把整个数组改变为$value
     * @param mixed $value 要设置的值
     * @return array 返回最后一维数组
     */
    public function arrSetter(array &$data, $key, $value)
    {
        if ($key === null) {
            return $data = $value;
        }

        $keys = explode('.', $key);
        while (count($keys) > 1) {
            $key = array_shift($keys);
            if (!isset($data[$key]) || !is_array($data[$key])) {
                $data[$key] = [];
            }
            $data = &$data[$key];
        }
        $data[array_shift($keys)] = $value;
        return $data;
    }

    /**
     * 数组删除某个键,为了避免歧义,数组的键不要有`.`
     * @param array $data 要操作的数组
     * @param string $key 要删除的键
     */
    public function arrUnset(array &$data, $key)
    {
        $keys = explode('.', $key);
        while (count($keys) > 1) {
            $key = array_shift($keys);
            if (isset($data[$key]) && is_array($data[$key])) {
                $data = &$data[$key];
            } else {
                return;
            }
        }
        unset($data[array_shift($keys)]);
    }
}

更多资讯请访问:https://github.com/suyar
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章