slickのような画像を一定時間毎に差し替えて表示する処理で、読み込みたい画像ファイルの設定情報を配列で下記のように持たせていたとする:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php $setting = [ [ 'image_url' => '/img/display_1.jpg', 'link_url' => 'https://masyus.work/pages/1', ], [ 'image_url' => '/img/display_2.jpg', 'link_url' => 'https://masyus.work/pages/2', ], [ 'image_url' => '/img/display_3.jpg', 'link_url' => 'https://masyus.work/pages/3', ], ]; return $setting; ?> |
この中に、2020/07/01 00:00:00から2020/07/31 23:59:59までの期間限定で、display_z.jpgという画像を2番目に表示させるようにしたいというニーズをマーケティング側から受け取ったとする。さてどのように実装するか?
if()で配列を定義し直す
一番オーソドックスな書き方ではあるが、配列自体を定義し直してしまう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
<?php $setting = [ [ 'image_url' => '/img/display_1.jpg', 'link_url' => 'https://masyus.work/pages/1', ], [ 'image_url' => '/img/display_2.jpg', 'link_url' => 'https://masyus.work/pages/2', ], [ 'image_url' => '/img/display_3.jpg', 'link_url' => 'https://masyus.work/pages/3', ], ]; if (strtotime('2020-07-01 00:00:00') <= time() && time() < strtotime('2020-08-01 00:00:00')) { $setting = [ [ 'image_url' => '/img/display_1.jpg', 'link_url' => 'https://masyus.work/pages/1', ], [ 'image_url' => '/img/display_z.jpg', 'link_url' => 'https://masyus.work/pages/z', ], [ 'image_url' => '/img/display_2.jpg', 'link_url' => 'https://masyus.work/pages/2', ], [ 'image_url' => '/img/display_3.jpg', 'link_url' => 'https://masyus.work/pages/3', ], ]; } print_r($setting); // 出力結果 array(4) { [0]=> array(2) { ["image_url"]=> string(18) "/img/display_1.jpg" ["link_url"]=> string(27) "https://masyus.work/pages/1" } [1]=> array(2) { ["image_url"]=> string(18) "/img/display_z.jpg" ["link_url"]=> string(27) "https://masyus.work/pages/z" } [2]=> array(2) { ["image_url"]=> string(18) "/img/display_2.jpg" ["link_url"]=> string(27) "https://masyus.work/pages/2" } [3]=> array(2) { ["image_url"]=> string(18) "/img/display_3.jpg" ["link_url"]=> string(27) "https://masyus.work/pages/3" } } return $setting; ?> |
ただ、配列の要素数が多いと冗長すぎるので、他にもっと簡単な方法は無いかと模索する。
array_splice()を活用し、配列の任意の場所に配列を挿入する
見つけたのがこの方法。array_splice()は配列の一部を削除して他の要素で置換するのが本来の使い方だが、既存の配列要素を削除せずに他の配列要素を流し込むという使い方もできる。ポイントは2つあり、
- array_splice()の第3引数を0(配列要素を1つも削除させない)にする
- 配列を挿入したい場合、array_splice()の第4引数を[]で囲んだ上で挿入したい配列を指定する
を守ること。具体的には下記のように書ける:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
<?php $setting = [ [ 'image_url' => '/img/display_1.jpg', 'link_url' => 'https://masyus.work/pages/1', ], [ 'image_url' => '/img/display_2.jpg', 'link_url' => 'https://masyus.work/pages/2', ], [ 'image_url' => '/img/display_3.jpg', 'link_url' => 'https://masyus.work/pages/3', ], ]; if (strtotime('2020-07-01 00:00:00') <= time() && time() < strtotime('2020-08-01 00:00:00')) { array_splice( $setting, 1, // 挿入したいindex番号 0, // リプレイス個数 [ // 挿入内容 [ 'image_url' => '/img/display_z.jpg', 'link_url' => 'https://masyus.work/pages/z', ], ], ); } print_r($setting); // 出力結果 array(4) { [0]=> array(2) { ["image_url"]=> string(18) "/img/display_1.jpg" ["link_url"]=> string(27) "https://masyus.work/pages/1" } [1]=> array(2) { ["image_url"]=> string(18) "/img/display_z.jpg" ["link_url"]=> string(27) "https://masyus.work/pages/z" } [2]=> array(2) { ["image_url"]=> string(18) "/img/display_2.jpg" ["link_url"]=> string(27) "https://masyus.work/pages/2" } [3]=> array(2) { ["image_url"]=> string(18) "/img/display_3.jpg" ["link_url"]=> string(27) "https://masyus.work/pages/3" } } return $setting; ?> |
これ、覚えておくとなかなか便利。
参考)