能夠說php的數組已經算是很是很是很是強大的存在,不只操做數組的方法多,並且有關聯數組,因此數組就是php最核心的東東。php
爲了方便,這裏將全部方法都歸爲類Arr的靜態方法 都在class Arr {}
裏。laravel
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
數組
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