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
 

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