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

相關文章
相關標籤/搜索