PHP

CakePHP2で配列のキーと値を保持したまま結合させたいときはHash::mergeを使えばいい話

2021年1月23日

CakePHP2で配列のキーと値を保持したまま結合させたいときはHash::mergeを使えばいい話と書かれた画像

 

あなた
cakephpで配列のキーを保持しつつ結合する方法はありますか?

 

Hash::mergeがおすすめですよ。
てんし君

 

CakePHP2で配列のキーと値を保持したまま結合させる実例

 

今回は特定の年から、今年までの年がそれぞれkeyとvalueにある配列を取得する配列を参考に紹介します。

 

つまり現在が2021年で、取得をはじめる年が2015年の場合は以下のような配列がほしいわけです。

 

[
    [2015] => 2015
    [2016] => 2016
    [2017] => 2017
    [2018] => 2018
    [2019] => 2019
    [2020] => 2020
    [2021] => 2021
]

 

つまりは以下のような配列を今年まで足していけばいいわけです。

 

[
    [] =>]

 

というわけでkeyを保持しつつマージする方法を実例を用いて解説します。

 

実際のコード

 

実際のコードは以下のとおりです。

 

     $startYear = '2015';
        $yearsList = $this->__getTargetYearList($startYear);

//求めたい配列を返す関数
private function __getTargetYearList($startYear){
        $thisYear = date('Y');
        $targetYearsList = [$startYear => $startYear];
        while($startYear < $thisYear){
            $startYear++;
            $addTargetYear = [$startYear => $startYear];
            $targetYearsList = Hash::merge($targetYearsList, $addTargetYear);
        }
        return $targetYearsList;
    }

 

タイトルの通りHash::mergeを使うとkeyを保持してくれたまま結合してくれます。

 

array_mergeの場合

 

PHPで配列結合といえばarray_mergeを思い浮かべる方も多いはずです。

先程の関数のHash::mergeの部分をarray_mergeにすると以下のような配列が返ってきます。

 

[
    [0] => 2015
    [1] => 2016
    [2] => 2017
    [3] => 2018
    [4] => 2019
    [5] => 2020
    [6] => 2021
]

 

array_mergeは数値添字が振りなおされます。(0からkeyが始まる)

ちなみにkeyが数値でかぶると新しい数値添字が振られます。

 

また、数値のkeyは連番に修正されます。

 

例えば以下のときは

 

        $a = [0 => 1, 1 => 2];
        $b = [0 => 1, 10 => 3];
        $c = array_merge($a, $b);

 

$cは次のようになります。

[
    [0] => 1
    [1] => 2
    [2] => 1
    [3] => 3
]

 

ちなみにkeyが文字列でかぶると上書きされます。

 

        $a = ['a' => 2, 1 => 2];
        $b = ['a' => 1, 10 => 3];
        $c = array_merge($a, $b);

 

このときの$cは以下のとおりです。

 

[
    [a] => 1
    [0] => 2
    [1] => 3
]

array_merge_recursiveの場合

 

配列のkeyが同じで、上書きさせたくない場合(再帰的に結合したい場合)はarray_merge_recuisiveが使えます。

 

例えば以下の場合を考えてみましょう。

 

        $a = ['a' => 2, 1 => 2];
        $b = ['a' => 1, 10 => 3];
        $c = array_merge($a, $b);

 

$cは以下のようになります。

array_mergeでは'a'がキーの要素は上書きされていましたが、array_merge_recuisiveでは'a'の中に配列ができています。

 

ただし数値のkeyは連番に修正されます。

 

[
    [a] => Array
        (
            [0] => 2
            [1] => 1
        )

    [0] => 2
    [1] => 3
]

Hash::mergeの場合

 

せっかくなので上記のarray_merge、array_merge_recursiveで使った配列の結合の挙動をHash::mergeでも見ておきましょう。

 

        $a = ['a' => 2, 1 => 2];
        $b = ['a' => 1, 10 => 3];
        $c = Hash::merge($a, $b);

 

$cは以下のようになります。

再帰的な結合はないですが、keyが数値であっても連番にならないで結合されています。

[
    [a] => 1
    [1] => 2
    [10] => 3
]

 

公式には以下のように書いてありました。

この関数は PHP の array_merge と array_merge_recursive の 両方の機能を持っていると考えることができます。この2つの関数との違いは、一方の配列キーが もう一方に含まれていた場合には (array_merge と違って) 再帰的に動きますが、 含まれていなかった場合には (array_merge_recursive と違って) 再帰的には動きません。

引用:cakephp2 cookbook

 

結合後の配列の希望ごとに使い分けよう

 

Hash::mergeの最大のメリットはkeyが数値であっても結合後に値を保持できるところです。

 

keyをなんらかの値として使いたい場合には使えると思います。

 

また、array_mergeとarray_merge_recursiveも、違いを把握しておくとコーディングの幅が広がると思います。

 

PHPは配列ゲーみたいなところもあるので配列系の関数はよく使うものは覚えておくといいと思います。

 

今回は以上です。

 

プログラミングスクールに関する情報

【無料あり】プログラミングスクールおすすめランキング【WEBエンジニアになりたい方向け】と書かれた画像
【無料あり】プログラミングスクールおすすめランキング【WEBエンジニアになりたい方向け】

  あなたプログラミングスクールに通いたいけどたくさんありすぎてどこがいいのかわかりません。   最近はエンジニアブームということもありプログラミングスクールが増えました。 一方でたくさんありすぎてど ...

続きを見る

返金保証ありのプログラミングスクールランキング【エンジニアが選びました】と表示されたパソコンの画面
【転職保証つき】返金保証ありのプログラミングスクールランキング【エンジニアが選びました】

  あなた返金保証がついているオススメのプログラミングスクールってありますか?   結論から話すと、返金保証つきのプログラミングスクールランキングは次の通りです。   1位:DMMWEBキャンプ  【 ...

続きを見る

wordpress
【無料あり】WEB制作を学べるオンラインスクールランキング【副業で稼ぎたい方向け】

  あなたWeb制作の副業で稼ぎたいけど、どのスクールで学ぶのが良いの? スクール選びで失敗はしたくないです。   ↑このような疑問や不安を解決するべく、現役のWebエンジニアがWEB制作を学べるスク ...

続きを見る

フリーランス
無料あり:フリーランスを目指せるプログラミングスクールランキング【体験をもとに徹底分析しました】

  あなたフリーランスエンジニアを目指すことができるプログラミングスクールってありますか?   最近では、高年収や働きやすさの魅力からフリーランスエンジニアを目指す方も増えてきました。 結論から話すと ...

続きを見る

WEB系自社開発企業にいけるプログラミングスクールランキング【現役エンジニアおすすめ】と書かれた画像
WEB系自社開発企業にいけるプログラミングスクールランキング【現役エンジニアおすすめ】

  あなたWEB系の自社開発企業に就職したいです。 オススメのスクールを教えて下さい。   結論から話すと、WEB系自社開発に行きやすいスクールのランキングは以下の通り。   第1位:テックアカデミー ...

続きを見る

-PHP

S