PHP对Array的封装学习

能够说php的数组已经算是很是很是很是强大的存在,不只操做数组的方法多,并且有关联数组,因此数组就是php最核心的东东。php

为了方便,这里将全部方法都归为类Arr的静态方法 都在class Arr {}里。laravel

get

public static function get($array, $key, $default=null) {
    // $key 若是没有传,或者是为 null,那么就直接返回传过来的 $array
    if (is_null($key)) {
        return $array;
    }
    
    // 若是要获取的 $key 在数组第一纬就找到了,也直接返回 $array[$key]。
    if (isset($array[$key])) {
        return $array[$key];
    }
    
    // 若是传的 $key 是这种形式的 `key1.key2`,那么就是找到对应的二维了,
    // 经过 explode() 方法将`$key`以`.`进行分割成数组,而且遍历。
    // 不过须要有一个先决条件,那就是传来的数组必须是数组格式,
    // 而且数组里有对应的`key`键。那么就能以`key1.key2`这种写法找到二维的键值。
    
    foreach(explode('.', $key) as $segment) {
        if (!is_array($array) || !array_key_exists($segment, $array)) {
            return $default;
        }
        $array = $array[$segment];
    }
    
    return $array;
}
复制代码

用法:Arr::get(['key1' => ['key2' => 1]], 'key1.key2') 返回: // 1数组

set

public static function set(&$array, $key, $value) {
    // 若是$key为空
    if (is_null($key)) {
        return $array = $value;
    }
    
    // 将$key以点分割成数组
    $keys = explode('.', $keys);
    
    // 若是分隔出来的数组里元素个数大于1 如 key1.key2这样
    while (count($keys) > 1) {
        // 每次取头一个
        $key = array_shift($keys);
        
        // 在设置的过程当中,若是没有这个键值,那么让其值为空数组,可以使后面的继续添加。
        if (!isset($array[$key]) || !is_array($array[$key])) {
            $array[$key] = [];
        }
        // 将$array[$key]这个以& 引用传递给变量 $array 
        $array = &$array[$key];
    }
    // 而后 $array再将最后剩余的惟一一个值得 $keys 进行赋值
    $array[array_shift($keys)] = $value;
    
    // 这个返回的意义不大,就是直接返回最后赋值时候得数组。
    return $array;
    
}
复制代码

用法:spa

$arr = ['a' => 1, 'b' => 2];
Arr::set($arr, 'b.c', 3)
print_r($arr)   // 为了清晰,改个写法 ['a' => 1, 'b' => ['c' => 3]]
复制代码

小结:很好的利用到了 '&' 这个进行引用传递,再加上 array_shift 配合 while(count($keys) > 1) 也巧妙的解决了无限往下遍历到最后一个进行赋值的难点。棒!code

...未完待续 考虑到有的可能会用到laravel里的集合, 打算先研究集合的实现。get

相关文章
相关标签/搜索