美文网首页
php 获取 数组OR对象中的元素[支持多维对象中的元素获取]

php 获取 数组OR对象中的元素[支持多维对象中的元素获取]

作者: 骑蚂蚁上高速_jun | 来源:发表于2022-09-09 15:03 被阅读0次
/* 测试 */
$std = new stdClass();
$std->name = new stdClass();

$std->name->name = 'China';
//------------------------------------
$data = ['abc'=>['index'=>['db'=>['name'=>'asfsdfs']]]];

var_dump(DataUtils::get($data,  'abc.index.db.name','默认值'));
/**
 * php 获取 数组OR对象 中的元素
 * 支持多维对象中的元素获取, 中间使用.获取
 */
class DataUtils
{

    /**
     * 获取数据
     */
    public static function get($target, $key, $default = null){
        if (is_null($key)) {
            return $target;
        }
        $key = is_array($key) ? $key : explode('.', $key);
        foreach ($key as $i => $segment) {
            unset($key[$i]);        
            if (is_null($segment)) {
                return $target;
            }
            if ($segment === '*') {
                if ($target instanceof Collection) {
                    $target = $target->all();
                } elseif (! is_array($target)) {
                    return DataUtils::value($default);
                }
                $result = [];
                foreach ($target as $item) {
                    $result[] = DataUtils::get($item, $key);
                }
                return in_array('*', $key) ? DataUtils::collapse($result) : $result;
            }
            if (DataUtils::accessible($target) && DataUtils::exists($target, $segment)) {
                $target = $target[$segment];
            } elseif (is_object($target) && isset($target->{$segment})) {
                $target = $target->{$segment};
            } else {
                return DataUtils::value($default);
            }
        }
        return $target;
    }

    private static function accessible($value){
        return is_array($value) || $value instanceof ArrayAccess;
    }

     /**
     * Determine if the given key exists in the provided array.
     *
     * @param  \ArrayAccess|array  $array
     * @param  string|int  $key
     * @return bool
     */
    private static function exists($array, $key){
        if ($array instanceof Enumerable) {
            return $array->has($key);
        }

        if ($array instanceof ArrayAccess) {
            return $array->offsetExists($key);
        }

        return array_key_exists($key, $array);
    }

    private static function collapse($array){
        $results = [];

        foreach ($array as $values) {
            if ($values instanceof Collection) {
                $values = $values->all();
            } elseif (! is_array($values)) {
                continue;
            }

            $results[] = $values;
        }

        return array_merge([], ...$results);
    }

    private static function value($value, ...$args){
        return $value instanceof Closure ? $value(...$args) : $value;
    }

}

相关文章

网友评论

      本文标题:php 获取 数组OR对象中的元素[支持多维对象中的元素获取]

      本文链接:https://www.haomeiwen.com/subject/pntznrtx.html