PHP对Array的封装学习

193 阅读1分钟

可以说php的数组已经算是非常非常非常强大的存在,不仅操作数组的方法多,而且有关联数组,所以数组就是php最核心的东东。

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

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;
    
}

用法:

$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) 也巧妙的解决了无限往下遍历到最后一个进行赋值的难点。棒!

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