概要
ドキュメント明後日便利そうなヘルパーを書いてきます。主に配列操作系。
大体配列をコレクションに変換してあれこれしていたり、冗長な配列操作を書いていたんですが
これらを使えばもっとスッキリかけるようになりそう。
data_fill()
data_fill関数は「ドット」記法を使用し、ターゲットの配列やオブジェクトへ足りない値をセットします。
$data = ['products' => ['desk' => ['price' => 100]]];
data_fill($data, 'products.desk.price', 200);
// 既にあるから値を入れない
// ['products' => ['desk' => ['price' => 100]]]
data_fill($data, 'products.desk.discount', 10);
// 存在しないから'discount' => 10が追加される
// ['products' => ['desk' => ['price' => 100, 'discount' => 10]]]
nullが入ってたら上書きしてくれるんかな?
$data = ['products' => ['desk' => ['price' => 100,'discount' => null]]];
dd(data_fill($data, 'products.desk.discount', 10));
array:1 [▼
"products" => array:1 [▶
"desk" => array:2 [▶
"price" => 100
"discount" => null
]
]
]
だめでした。キーがあるかどうかなんですな
ワイルドカード
アスタリスクで複数の配列全て対象にできる
$data = [
'products' => [
['name' => 'Desk 1', 'price' => 100],
['name' => 'Desk 2'],
],
];
data_fill($data, 'products.*.price', 200);
array:1 [▼
"products" => array:2 [▶
0 => array:2 [▶
"name" => "Desk 1"
"price" => 100
]
1 => array:2 [▶
"name" => "Desk 2"
"price" => 200
]
]
]
data_get()
data_get関数は「ドット」記法を使用し、ネストした配列やオブジェクトから値を取得します。
$data = ['products' => ['desk' => ['price' => 100]]];
$price = data_get($data, 'products.desk.price');
// 100
data_get関数は、指定したキーが存在しない場合に返す、デフォルト値も指定できます。
$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'];
こーれは便利だ。常用確定
三項演算子わちゃわちゃとかを見なくて済むし共有しよ
data_set()
data_set関数は「ドット」記法を使用し、ネストした配列やオブジェクトに値をセットします。
$data = ['products' => ['desk' => ['price' => 100]]];
data_set($data, 'products.desk.price', 200);
// ['products' => ['desk' => ['price' => 200]]]
この関数は、アスタリスクを使用したワイルドカードも受け入れ、それに応じてターゲットに値を設定します。
$data = [
'products' => [
['name' => 'Desk 1', 'price' => 100],
['name' => 'Desk 2', 'price' => 150],
],
];
data_set($data, 'products.*.price', 200);
/*
[
'products' => [
['name' => 'Desk 1', 'price' => 200],
['name' => 'Desk 2', 'price' => 200],
]
]
*/
デフォルトでは、既存の値はすべて上書きされます。値が存在しない場合にのみ値をセットする場合は、関数の4番目の引数にfalseを渡してください。
$data = ['products' => ['desk' => ['price' => 100]]];
data_set($data, 'products.desk.price', 200, $overwrite = false);
// ['products' => ['desk' => ['price' => 100]]]
まとめ
基本的に連想配列の操作はdata_get
とdata_set
で事足りてしまいそう
配列の中身をゴニョゴニョしようとした時に思い出して使おうと思います。