以下對每個方法做自我理解的解釋,皆會擷取官網範例,更佳釐清方法用法。
陣列
Arr::accessible 檢查參數是不是陣列或Collection
use Illuminate\Support\Arr; use Illuminate\Support\Collection; $isAccessible = Arr::accessible(['a' => 1, 'b' => 2]); // true $isAccessible = Arr::accessible(new Collection); // true $isAccessible = Arr::accessible('abc'); // false $isAccessible = Arr::accessible(new stdClass); // false
Arr::add([array],[key],[value]) 陣列中如果第二個傳入參數key值,如果「不存在」或 key 的值為 null 寫入陣列
use Illuminate\Support\Arr; use Illuminate\Support\Collection; $isAccessible = Arr::accessible(['a' => 1, 'b' => 2]); // true $isAccessible = Arr::accessible(new Collection); // true $isAccessible = Arr::accessible('abc'); // false $isAccessible = Arr::accessible(new stdClass); // false
Arr::collapse 將多個陣列合併成一個
use Illuminate\Support\Arr; $array = Arr::collapse([[1, 2, 3], [4, 5, 6], [7, 8, 9]]); // [1, 2, 3, 4, 5, 6, 7, 8, 9]
Arr::crossJoin 這叫笛卡兒積,返回所有陣列
use Illuminate\Support\Arr; $matrix = Arr::crossJoin([1, 2], ['a', 'b']); /* [ [1, 'a'], [1, 'b'], [2, 'a'], [2, 'b'], ] */ $matrix = Arr::crossJoin([1, 2], ['a', 'b'], ['I', 'II']); /* [ [1, 'a', 'I'], [1, 'a', 'II'], [1, 'b', 'I'], [1, 'b', 'II'], [2, 'a', 'I'], [2, 'a', 'II'], [2, 'b', 'I'], [2, 'b', 'II'], ] */
Arr::divide 陣列返回一個二維陣列,將key 以及 value 拆成兩個陣列,如下範例
use Illuminate\Support\Arr; [$keys, $values] = Arr::divide(['name' => 'Desk']); // $keys: ['name'] // $values: ['Desk']
Arr::dot 函數會把多為陣列中的key 平鋪成一為陣列,新的陣列將使用「.」符號來表示階層
use Illuminate\Support\Arr; $array = ['products' => ['desk' => ['price' => 100]]]; $flattened = Arr::dot($array); // ['products.desk.price' => 100]
Arr::except 移除某個鍵值元素,如下範例將price刪除
use Illuminate\Support\Arr; $array = ['name' => 'Desk', 'price' => 100]; $filtered = Arr::except($array, ['price']); // ['name' => 'Desk']
Arr::exists 如下所示,檢查陣列中是否有 name 或 salary 鍵值的存在
use Illuminate\Support\Arr; $array = ['name' => 'John Doe', 'age' => 17]; $exists = Arr::exists($array, 'name'); // true $exists = Arr::exists($array, 'salary'); // false
Arr::first 返回陣列第一個元素
use Illuminate\Support\Arr; $array = ['name' => 'John Doe', 'age' => 17]; $exists = Arr::exists($array, 'name'); // true $exists = Arr::exists($array, 'salary'); // false
Arr::flatten 將多為陣列的值全部取出,並且平鋪成一維陣列
use Illuminate\Support\Arr; $array = ['name' => 'John Doe', 'age' => 17]; $exists = Arr::exists($array, 'name'); // true $exists = Arr::exists($array, 'salary'); // false
Arr::forget 傳入一個陣列以及字串,字串使用「.」的方式表階層,將陣列中的對應階層移除。
use Illuminate\Support\Arr; $array = ['products' => ['desk' => ['price' => 100]]]; Arr::forget($array, 'products.desk'); // ['products' => []]
Arr::get 傳入一個陣列以及字串,字串使用「.」的方式表示階層,用這樣的方式方面取出對應的值以可以指令預設值。
use Illuminate\Support\Arr; $array = ['products' => ['desk' => ['price' => 100]]]; $price = Arr::get($array, 'products.desk.price'); // 100 $discount = Arr::get($array, 'products.desk.discount', 0); // 0
Arr::has 函數使用「.」方式表示陣列階層,確認陣列中是否有存在該階層的值,可以一比對兩個,「皆存在」才會顯示 true。
use Illuminate\Support\Arr; $array = ['product' => ['name' => 'Desk', 'price' => 100]]; $contains = Arr::has($array, 'product.name'); // true $contains = Arr::has($array, ['product.price', 'product.discount']); // false
Arr::hasAny 如上檢查陣列是否有對應的鍵值存在,「任一個」存在就回傳 true
use Illuminate\Support\Arr; $array = ['product' => ['name' => 'Desk', 'price' => 100]]; $contains = Arr::hasAny($array, 'product.name'); // true $contains = Arr::hasAny($array, ['product.name', 'product.discount']); // true $contains = Arr::hasAny($array, ['category', 'product.discount']); // false
Arr::isAssoc 判斷陣列的key 有設定自訂鍵值,如果為預設的鍵值將回傳false
use Illuminate\Support\Arr; $isAssoc = Arr::isAssoc(['product' => ['name' => 'Desk', 'price' => 100]]); // true $isAssoc = Arr::isAssoc([1, 2, 3]); // false $isAssoc = Arr::isAssoc(["0" => 'a', "1" => 'b', "2" => 'c'])); // false $isAssoc = Arr::isAssoc(["1" => 'a', "0" => 'b', "2" => 'c'])); // true $isAssoc = Arr::isAssoc(["a" => 'a', "b" => 'b', "c" => 'c'])); // true
Arr::last 回傳滿足指定條件的最後一個元素值,如下所示200與300接大於等於150回傳最後一個符合結果300,已可指定預設值,如果沒有找到回傳預設值。
use Illuminate\Support\Arr; $array = [100, 200, 300, 110]; $last = Arr::last($array, function ($value, $key) { return $value >= 150; }); // 300 $default = 0; $last = Arr::last($array, function ($value, $key, $default) { return $value >= 301; }); // 0
Arr::only 處理陣列是如果只要某幾個元素,可以一個陣列,並且帶入需要的key值即可得到只有這幾個結果的陣列
use Illuminate\Support\Arr; $array = ['name' => 'Desk', 'price' => 100, 'orders' => 10]; $slice = Arr::only($array, ['name', 'price']); // ['name' => 'Desk', 'price' => 100]
Arr::pluck 這個Victor我還蠻常使用的,可以在複雜的階層陣列中,找出某個位置的值,如下找出developer底下的name的key值,回傳全部的陣列。
use Illuminate\Support\Arr; $array = [ ['developer' => ['id' => 1, 'name' => 'Taylor']], ['developer' => ['id' => 2, 'name' => 'Abigail']], ]; $names = Arr::pluck($array, 'developer.name'); // ['Taylor', 'Abigail']
也可以如下範例所示將developer的id設定對應的key值。
$names = Arr::pluck($array, 'developer.name', 'developer.id'); // [1 => 'Taylor', 2 => 'Abigail']
Arr::prepend 元素存入陣列的第一個位置
use Illuminate\Support\Arr; $array = ['one', 'two', 'three', 'four']; $array = Arr::prepend($array, 'zero'); // ['zero', 'one', 'two', 'three', 'four']
亦可指定鍵值並插入陣列的第一個位置
use Illuminate\Support\Arr; $array = ['price' => 100]; $array = Arr::prepend($array, 'Desk', 'name'); // ['name' => 'Desk', 'price' => 100]
Arr::pull 取得需要的元素,並刪除元陣列的該元素,如下所示,將key 等於name回傳,並將陣列內的name元素刪除。
use Illuminate\Support\Arr; $array = ['name' => 'Desk', 'price' => 100]; $name = Arr::pull($array, 'name'); // $name: Desk // $array: ['price' => 100] $value = Arr::pull($array, $key, $default); // 可以設定不存在時,返回預設值,原陣列不改變
Arr::query 將陣列的內容,轉為查詢的字串,就是網址後面常常看到的query。
use Illuminate\Support\Arr; $array = ['name' => 'Taylor', 'order' => ['column' => 'created_at', 'direction' => 'desc']]; Arr::query($array); // name=Taylor&order[column]=created_at&order[direction]=desc
Arr::random 隨意取出陣列中的一個值
use Illuminate\Support\Arr; $array = [1, 2, 3, 4, 5]; $random = Arr::random($array); // 4 - (retrieved randomly)
Arr::set 傳入三個參數,預計修改的陣列、字串、值,可以在陣列中,依照中間傳入的字串,格式使用「.」的方式再多維陣列中加入元素。
use Illuminate\Support\Arr; $array = ['products' => ['desk' => ['price' => 100]]]; Arr::set($array, 'products.desk.price', 200); // ['products' => ['desk' => ['price' => 200]]]
Arr::shuffle 隨機排序陣列內的元素
use Illuminate\Support\Arr; $array = Arr::shuffle([1, 2, 3, 4, 5]); // [3, 2, 5, 1, 4] - (generated randomly)
Arr::sort 陣列正序排序
use Illuminate\Support\Arr; $array = ['Desk', 'Table', 'Chair']; $sorted = Arr::sort($array); // ['Chair', 'Desk', 'Table']
亦可以指定使用某個key做排序。
use Illuminate\Support\Arr; $array = [ ['name' => 'Desk'], ['name' => 'Table'], ['name' => 'Chair'], ]; $sorted = array_values(Arr::sort($array, function ($value) { return $value['name']; })); /* [ ['name' => 'Chair'], ['name' => 'Desk'], ['name' => 'Table'], ] */
Arr::sortRecursive 有點不太知道用意,稍後再補~
use Illuminate\Support\Arr; $array = [ ['Roman', 'Taylor', 'Li'], ['PHP', 'Ruby', 'JavaScript'], ['one' => 1, 'two' => 2, 'three' => 3], ]; $sorted = Arr::sortRecursive($array); /* [ ['JavaScript', 'PHP', 'Ruby'], ['one' => 1, 'three' => 3, 'two' => 2], ['Li', 'Roman', 'Taylor'], ] */
Arr::where 過濾陣列,寫入特定過濾條件過濾
use Illuminate\Support\Arr; $array = [100, '200', 300, '400', 500]; $filtered = Arr::where($array, function ($value, $key) { return is_string($value); }); // [1 => '200', 3 => '400']
Arr::wrap 將值轉為陣列,如果原本已經是陣列將不會有任何變化。
use Illuminate\Support\Arr; $string = 'Laravel'; $array = Arr::wrap($string); // ['Laravel']
如果給定的值為 null
use Illuminate\Support\Arr; $nothing = null; $array = Arr::wrap($nothing); // []
data_fill 如果有對應的key值,將元素加入
$data = ['products' => ['desk' => ['price' => 100]]]; data_fill($data, 'products.desk.price', 200); // ['products' => ['desk' => ['price' => 100]]] data_fill($data, 'products.desk.discount', 10); // ['products' => ['desk' => ['price' => 100, 'discount' => 10]]]
亦可使用 「*」 如下所示,將子陣列缺少 products 下一層全部的子陣列,如果缺少price並設定值200,已有的陣列則不改變。
$data = [ 'products' => [ ['name' => 'Desk 1', 'price' => 100], ['name' => 'Desk 2'], ], ]; data_fill($data, 'products.*.price', 200); /* [ 'products' => [ ['name' => 'Desk 1', 'price' => 100], ['name' => 'Desk 2', 'price' => 200], ], ] */
data_get
data_set 函數使用「.」符號從多維陣列或物件中根據指定鍵檢索回傳值,亦可以給予預設值,在未找到的情況下回傳預設值。
$data = ['products' => ['desk' => ['price' => 100]]]; $price = data_get($data, 'products.desk.price'); // 100 $discount = data_get($data, 'products.desk.discount', 0); // 0
亦可以在還數中使用 「*」通配符找尋所有匹配的值
$data = [ 'product-one' => ['name' => 'Desk 1', 'price' => 100], 'product-two' => ['name' => 'Desk 2', 'price' => 150], ]; data_get($data, '*.name'); // ['Desk 1', 'Desk 2'];
head 返回第一個值
$array = [100, 200, 300]; $first = head($array); // 100
last 返回最後一個值
$array = [100, 200, 300]; $last = last($array); // 300
以上就是Laravel操作陣列的函數,後面幾種函數有些與Arr類別相同,差別在於可以不用建立Arr類別的實體,以上提供給讀者參考,Victor使用自己的方式些一遍主要是增加我的印象,最完整的請參考Laravel 官方文件或框架原始碼 Arr類別。