LoginSignup
1
0

More than 1 year has passed since last update.

【Laravel】個人的な初知りな便利配列操作系へルパ

Last updated at Posted at 2022-12-17

概要

ドキュメント明後日便利そうなヘルパーを書いてきます。主に配列操作系。

大体配列をコレクションに変換してあれこれしていたり、冗長な配列操作を書いていたんですが
これらを使えばもっとスッキリかけるようになりそう。

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_getdata_setで事足りてしまいそう
配列の中身をゴニョゴニョしようとした時に思い出して使おうと思います。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0