Hash

use - コントローラでHashクラスを使う

コントローラでHashクラスを使うには、まずはuseする必要があります。

クラスを定義する直前に記載します。

<?php
namespace App\Controller;

use Cake\Utility\Hash;

class TestController extends AppController
{
    // コントローラのクラス中
}

Hash::extract() - 配列のKeyをまとめて指定し、複数の値を取得する

Hash::extractを使用すると配列のKeyをまとめて指定し、複数の値を取得することができます。

{n}は、すべての数値キーに一致します。その配下のキーがidの連想配列を取得しています。

第一引数には、値を指定し、第二引数にパスを指定しています。

$users = [
    ['id' => 1, 'name' => 'makoto'],
    ['id' => 2, 'name' => 'daisuke'],
    ['id' => 3, 'name' => 'shin'],
    ['id' => 4, 'name' => 'takashi'],
];
$ids = Hash::extract($users, '{n}.id');

// $idsの中身
// [1,2,3,4];

Hash::insert() - 配列に値を挿入する

Hash::insert()で配列に値を挿入することができます。
第一引数には、元の配列を指定します。
第二引数には、パスを指定します。
第三引数には、追加する値を指定します。

$person = [
    '男' => [
        'name' => '太郎'
    ]
];
$result = Hash::insert($person, '女', ['name' => '洋子']);

var_dump($result);


/* 出力結果
array(2) {
  ["男"]=>
  array(1) {
    ["name"]=>
    string(6) "太郎"
  }
  ["女"]=>
  array(1) {
    ["name"]=>
    string(6) "洋子"
  }
}
*/

Hash::remove() - 配列の中身を指定して削除する

Hash::remove()を使い、配列のパスを指定して削除することができます。
第二引数に、パスを指定します。
 

$list = [
    '男性' =>
        [
            'name' => '太郎'
        ],
    '女性' =>
        [
            'name' => '洋子'
        ]
];
$result = Hash::remove($list, '女性');

var_dump($result);

// 出力結果
array(1) {
  ["男性"]=>
  array(1) {
    ["name"]=>
    string(6) "太郎"
  }
}

Hash::combine() - 配列のキーと値を整形する

Hash::combine()の引数は、以下の内容になります。

Hash::combine(
    array $data, // 処理対象の配列
    $keyPath, // 配列のキーとするパス
    $valuePath = null, // 配列に入れる値のパス(省略可能)
    $groupPath = null // 配列の値をグループ化するパス(省略可能)
)

以下の例では、配列のキーと値を指定して実行しています。{n}は、数値キーとマッチする式です。

$list = [
        [
            'name' => '太郎',
            'sex'  => '男性'
        ],
        [
            'name' => '洋子',
            'sex'  => '女性'
        ]
];
$result = Hash::combine($list, '{n}.name', '{n}');
var_dump($result);

// 出力結果
array(2) {
  ["太郎"]=>
  array(2) {
    ["name"]=>
    string(6) "太郎"
    ["sex"]=>
    string(6) "男性"
  }
  ["洋子"]=>
  array(2) {
    ["name"]=>
    string(6) "洋子"
    ["sex"]=>
    string(6) "女性"
  }

Hash::combine() - 配列をグループ化する

Hash::combine()の引数は、以下の内容になります。

Hash::combine(
    array $data, // 処理対象の配列
    $keyPath, // 配列のキーとするパス
    $valuePath = null, // 配列に入れる値のパス(省略可能)
    $groupPath = null // 配列の値をグループ化するパス(省略可能)
)

以下の例では、配列のキーと値とグループ化をするキーを指定して実行しています。
{n}は、数値キーとマッチする式です。

$list = [
        [
            'name' => '太郎',
            'sex'  => '男性'
        ],
        [
            'name' => '洋子',
            'sex'  => '女性'
        ]
];
$result = Hash::combine($list, '{n}.name', '{n}', '{n}.sex');
var_dump($result);

// 出力結果
array(2) {
  ["男性"]=>
  array(1) {
    ["太郎"]=>
    array(2) {
      ["name"]=>
      string(6) "太郎"
      ["sex"]=>
      string(6) "男性"
    }
  }
  ["女性"]=>
  array(1) {
    ["洋子"]=>
    array(2) {
      ["name"]=>
      string(6) "洋子"
      ["sex"]=>
      string(6) "女性"
    }
  }
}

Hash::format() - で配列のデータを整形する

Hash::format()の引数は、以下のとおりです。

Hash::format(
    array $data, // 処理対象の配列
    array $paths, // 配列でパスを指定
    $format // フォーマット指定
)

それでは、使用してみましょう。

$list = [
    [
        'name' => '太郎',
        'sex'  => '男性'
    ],
    [
        'name' => '洋子',
        'sex'  => '女性'
    ]
];
$result = Hash::format($list, ['{n}.name', '{n}.sex'], '%1$s(%2$s)');

var_dump($result);

// 出力結果
array(2) {
  [0]=>
  string(18) "太郎(男性)"
  [1]=>
  string(18) "洋子(女性)"
}

%1$sは、一つ目の文字列という意味です。

一つ目の数値を指定する場合は、%1$dと記載します。

Hash::contains() - 配列のキーと値が存在しているか確認する

Hash::contains()を使用すると配列のキーと値が存在しているか確認することができます。

それでは使用例を見てみましょう。

$list1 = [
        [
            'name' => '太郎',
            'sex'  => '男性'
        ],
        [
            'name' => '洋子',
            'sex'  => '女性'
        ]
];

$list2 = [
    [
        'name' => '太郎',
        'sex'  => '男性'
    ],
    [
        'name' => '洋子',
        'sex'  => '女性'
    ],
    [
        'name' => '高志',
        'sex'  => '男性'
    ],
];

// true
$result = Hash::contains($list1, $list1);
// false
$result = Hash::contains($list1, $list2);
// true
$result = Hash::contains($list2, $list1);

Hash::check() - 配列のパスがあるか確認する

Hash::check()で配列のパスがあるか確認することができます。

第二引数に、パスを指定します。

$list = [
    '食べ物' => [
        '麺類' => 'ラーメン',
    ],
];

// true
$result = Hash::check($list, '食べ物.麺類');

Hash::filter() - 配列から空の値を削除する

Hash::filter() - 配列から空の値を削除する

Hash::filter()を使用すると配列の空の値を削除することができます。

なお、0は削除されません。

$list = [
    '主食' => [
        'チャーハン',
        'お寿司',
        false
    ],
    'デザート' => [],
    'ドリンク' => false,
    'スープ'  => null,
    'サラダ'  => 0,
];

$result = Hash::filter($list);

// 出力結果
array(2) {
  ["主食"]=>
  array(2) {
    [0]=>
    string(15) "チャーハン"
    [1]=>
    string(9) "お寿司"
  }
  ["サラダ"]=>
  int(0)
}

Hash::flatten() - 多次元配列を1次元配列にする

Hash::flatten()を使用して、多次元配列を1次元配列にすることができます。

$list = [
    '麺類' => [
        'ラーメン',
        'うどん',
    ],
    'スイーツ' => [
        'ナタデココ',
    ],
];

$result = Hash::flatten($list);

var_dump($result);

// 出力結果
array(3) {
  ["麺類.0"]=>
  string(12) "ラーメン"
  ["麺類.1"]=>
  string(9) "うどん"
  ["スイーツ.0"]=>
  string(15) "ナタデココ"
}

Hash::expand() - 平坦化された配列を多次元配列に戻す

Hash::expand()を使用するとHash::flatten()で平坦化された配列を、多次元配列に戻すことができます。

$list = [
    '麺類' => [
        'ラーメン',
        'うどん',
    ],
    'スイーツ' => [
        'ナタデココ',
    ],
];

$result = Hash::flatten($list);

var_dump($result);

/* 出力結果
array(3) {
  ["麺類.0"]=>
  string(12) "ラーメン"
  ["麺類.1"]=>
  string(9) "うどん"
  ["スイーツ.0"]=>
  string(15) "ナタデココ"
}
*/

$result = Hash::expand($result);

var_dump($result);

// 出力結果
array(2) {
  ["麺類"]=>
  array(2) {
    [0]=>
    string(12) "ラーメン"
    [1]=>
    string(9) "うどん"
  }
  ["スイーツ"]=>
  array(1) {
    [0]=>
    string(15) "ナタデココ"
  }
}

Hash::merge() - 配列をマージする

Hash::merge()で配列をマージすることができます。

Hash::merge()では、値のある配列のキーが存在している場合は、格納できる次キーに配列の値を格納します。

$list1 = [
    0 => [
        0 => 'ラーメン',
        1 => 'うどん',
    ],
    1 => [
        0 => '寿司',
    ],
];

$list2 = [
    0 => [
        0 => 'ラーメン',
        1 => 'うどん',
        2 => 'カレーうどん',
    ],
    1 => [
        0 => 'ナタデココ',
    ],
];

$result = Hash::merge($list1, $list2);

var_dump($result);

// 出力結果
array(2) {
  [0]=>
  array(5) {
    [0]=>
    string(12) "ラーメン"
    [1]=>
    string(9) "うどん"
    [2]=>
    string(12) "ラーメン"
    [3]=>
    string(9) "うどん"
    [4]=>
    string(18) "カレーうどん"
  }
  [1]=>
  array(2) {
    [0]=>
    string(6) "寿司"
    [1]=>
    string(15) "ナタデココ"
  }
}

Hash::numeric() - 配列の値がすべて数値かどうか確認する

Hash::numeric()を使用すると配列の値がすべて数値かどうか確認することができます。

$list = [
    0 => 11
];

$result = Hash::numeric($list);

// true
var_dump($result);

$list = [
    0 => 'test'
];

$result = Hash::numeric($list);

// false
var_dump($result);

Hash::map() - すべての配列の要素に対してfinctionを実行する

Hash::map()を使用して、すべての配列の要素に対してfinctionを実行することができます。

引数は、以下のように指定します。

Hash::map(
    array $data, // 処理対象の配列
    $path, // パスの指定
    $function // 実行するメソッド指定
);

 

それでは実行例を見てみましょう。

public function plusOne($value)
{
    return $value + 1;
}

.....


$list = [
    2,
    4,
];

// $this->plusOneを実行しています。
$result = Hash::map($list, "{n}", [$this, 'plusOne']);

var_dump($result);

// 出力結果
array(2) {
  [0]=>
  int(3)
  [1]=>
  int(5)
}

Hash::dimensions() - 配列の次元数を確認する

Hash::dimensions()で配列の次元数を確認することができます。

Hash::dimensions()では、1つ目の配列の次元数を確認しています。

$list = [
    0 => [
        0 => 'ラーメン',
        1 => 'うどん',
    ],
    1 =>  '寿司',
];

$result = Hash::dimensions($list);

// int(2)
var_dump($result);

Hash::maxDimensions() - 配列のもっとも多い次元数を調べる

Hash::maxDimensions()を使用すると配列のもっとも多い次元数を確認することができます。

$list = [
    0 =>  '寿司',
    1 => [
        0 => 'ラーメン',
        1 => 'うどん',
    ],
];

// true
$result = Hash::maxDimensions($list);

// int(2)
var_dump($result);

Hash::diff() - 配列の差分を確認する

Hash::diff()を使用して、配列の差分を確認することができます。

$list1 = [
    'ラーメン',
    'カレー',
];

$list2 = [
    'ラーメン',
    'カレーうどん',
];


$result = Hash::diff($list1, $list2);

var_dump($result);

// 出力結果
array(1) {
  [1]=>
  string(9) "カレー"
}

Hash::mergeDiff() - 配列の差分をマージする

Hash::mergeDiff()を使用して、配列の差分をマージすることができます。

配列のインデックスが定義されていない配列のみをマージします。

$list1 = [
    'ラーメン',
    'カレー',
];

$list2 = [
    'ラーメン',
    'カレーうどん',
    'お寿司',
];


$result = Hash::mergeDiff($list1, $list2);

var_dump($result);

// 出力結果
array(3) {
  [0]=>
  string(12) "ラーメン"
  [1]=>
  string(9) "カレー"
  [2]=>
  string(9) "お寿司"
}

Hash::normalize() - 配列を正規化する

Hash::normalize()で配列を正規化することができます。

配列を正規化すると値を持つ数値キーは、null を値とする文字列キーへと変換されます。

配列を正規化することで、 Hash::merge()で扱いやすい配列になります。

$list = [
    0             => '焼きそば',
    1             => '牛乳',
    'ラーメン'     => null,
    'カレーうどん' => null,
    'お寿司'    => null
];

$result = Hash::normalize($list);

var_dump($result);

array(5) {
  ["焼きそば"]=>
  NULL
  ["牛乳"]=>
  NULL
  ["ラーメン"]=>
  NULL
  ["カレーうどん"]=>
  NULL
  ["お寿司"]=>
  NULL
}

Hash::nest() - 配列をネストする

Hash::nest()で配列をネストすることができます。

引数は、以下のように指定します。

Hash::nest(
    array $data, 
    array $options = []
);

$optionsの内容

children
子の配列に使用するキー名。デフォルトは children に設定されています。

idPath
各要素を識別するためのキーを指定します。

parentPath
各要素の親要素を識別するためのキーを指定します。デフォルトは {n}.$alias.parent_idに設定されています。

root
最上位となる要素のidを指定します。

 

それでは、簡単な使用例を見てみましょう。

$list = [
    ['data' => ['id' => 1, 'parent_id' => null]],
    ['data' => ['id' => 2, 'parent_id' => 1]],
    ['data' => ['id' => 3, 'parent_id' => 1]],
    ['data' => ['id' => 4, 'parent_id' => 1]],
    ['data' => ['id' => 5, 'parent_id' => 1]],
    ['data' => ['id' => 6, 'parent_id' => null]],
    ['data' => ['id' => 7, 'parent_id' => 6]],
    ['data' => ['id' => 8, 'parent_id' => 6]],
    ['data' => ['id' => 9, 'parent_id' => 6]],
    ['data' => ['id' => 10, 'parent_id' => 6]]
];

$result = Hash::nest($list, ['root' => 1]);

var_dump($result);

// 出力結果
array(1) {
  [0]=>
  array(2) {
    ["data"]=>
    array(2) {
      ["id"]=>
      int(1)
      ["parent_id"]=>
      NULL
    }
    ["children"]=>
    array(4) {
      [0]=>
      array(2) {
        ["data"]=>
        array(2) {
          ["id"]=>
          int(2)
          ["parent_id"]=>
          int(1)
        }
        ["children"]=>
        array(0) {
        }
      }
      [1]=>
      array(2) {
        ["data"]=>
        array(2) {
          ["id"]=>
          int(3)
          ["parent_id"]=>
          int(1)
        }
        ["children"]=>
        array(0) {
        }
      }
      [2]=>
      array(2) {
        ["data"]=>
        array(2) {
          ["id"]=>
          int(4)
          ["parent_id"]=>
          int(1)
        }
        ["children"]=>
        array(0) {
        }
      }
      [3]=>
      array(2) {
        ["data"]=>
        array(2) {
          ["id"]=>
          int(5)
          ["parent_id"]=>
          int(1)
        }
        ["children"]=>
        array(0) {
        }
      }
    }
  }
}

------------------------------
作成日:2016年08月27日
更新日:2018年02月07日
------------------------------

ページの先頭へ