Hash::conbine()でneeds an equal number of keys + values エラー
いつもお世話になっているCakePHPの便利なHash::conbine()。
今回見慣れないエラーが出てしまい検索してもなかなか対処法が見つからなかったのでメモ。
次のようなユーザー情報を持った配列があったとして,
$users = [ [ 'User' => [ 'id' => 1, 'name' => 'tanaka' ], ], [ 'User' => [ 'id' => 2, 'name' => 'suzuki' ], ], [ 'User' => [ 'id' => 1, 'name' => 'tanaka' ], ], [ 'User' => [ ], ], ];
これをHash::conbine()してid => name の配列を取り出したいとする。
$userList = Hash::combine($users, '{n}.User.id', '{n}.User.name');
/*
array (size=2)
1 => string 'tanaka' (length=6)
2 => string 'suzuki' (length=6)
*/
これはOK。問題は id => [id => (id), name => (name)] の配列を取り出したいとき起こった。
$newUsers = Hash::combine($users, '{n}.User.id', '{n}.User');
/*
Hash::combine() needs an equal number of keys + values.
Error: An Internal Error Has Occurred.
*/
Hash::conbine()の第3引数を ‘{n}.User.name’ から ‘{n}.User’ にしたら InternalError 発生。
$users 配列の4番目の User が空なのが原因らしい。
(じゃぁ'{n}.User.name’の時はなんでエラー起きないのか。。。)
対処
空が原因ならばHash::conbine()する前に空を削除してしまえばよい。
Hash::filter()を使えば一発。
$newUsers = Hash::combine(Hash::filter($users), '{n}.User.id', '{n}.User');
/*
array (size=2)
1 =>
array (size=2)
'id' => int 1
'name' => string 'tanaka' (length=6)
2 =>
array (size=2)
'id' => int 2
'name' => string 'suzuki' (length=6)
*/

