PHP

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

投稿日:

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は配列ゲーみたいなところもあるので配列系の関数はよく使うものは覚えておくといいと思います。

 

今回は以上です。

 

-PHP

Copyright© エンジニアてんし君ブログ , 2021 All Rights Reserved.