能够说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