###実現したいこと
お世話になります。
group
の値ごとにグループ化し、任意の連番を付けたいです。
「連番」というのは、「key_
をプレフィックスとして1
から始める値(key_1
など)」になります。
php
1$rows = [ 2 ['id'=>1, 'group'=>'a'], 3 ['id'=>2, 'group'=>'a'], 4 ['id'=>3, 'group'=>'c'], 5 ['id'=>4, 'group'=>'d'], 6]; 7 8// 以下を得たいです 9 10$result = [ 11 'key_1' => [ 12 ['id'=>1, 'group'=>'a'], 13 ['id'=>2, 'group'=>'a'], 14 ], 15 'key_2' => [ 16 ['id'=>3, 'group'=>'c'], 17 ], 18 'key_3' => [ 19 ['id'=>4, 'group'=>'d'], 20 ] 21]; 22
###試していること
まずforeach
でキーをつけるまではいいのですが、これではグループ化できません。
php
1/* 2キーをつける 3--------------*/ 4$result = []; 5$i = 1; 6foreach ( $rows as $row ) { 7 $key = 'key_' . $i; 8 $result[$key][] = $row; 9 $i++; 10} 11 12/* 13結果を確認 14--------------*/ 15var_dump($result);
今度はグループ化しようと思うと、キーがつけられません。
php
1/* 2グループ化 3--------------*/ 4$result = []; 5foreach ( $rows as $row ) { 6 $group = $row['group']; 7 $result[$group][] = $row; 8} 9 10/* 11結果を確認 12--------------*/ 13var_dump($result);
先にグループ化してからキーを振りなおすために以下やってみたのですが、STEP4
で躓きました。
php
1/* 2グループ化 3--------------*/ 4$result = []; 5foreach ( $rows as $row ) { 6 $group = $row['group']; 7 $result[$group][] = $row; 8} 9 10/* 11キーをつける 12--------------*/ 13// STEP1. array_values で0からになるが、1からにしたいので余分な値を先頭に一つ追加しておく 14array_unshift($result,[]); 15// STEP2. array_values でグループ名になっているキーを0からの連番にする 16$result = array_values($result); 17// STEP3. 余分な値を削除する 18unset($result[0]); 19// STEP4. 連番にプレフィックスを付けて「key_1」のようにする 20extract($result, EXTR_PREFIX_ALL, 'key_'); 21 22/* 23結果を確認 24--------------*/ 25var_dump($result);
アドバイス宜しくお願い致します。
###2020-12-09 11:13追記
その後、以下のように二回foreach
をかければできましたが、泥臭すぎる印象です。
php
1/* 2グループ化 3--------------*/ 4$grouped = []; 5foreach ( $rows as $row ) { 6 $group = $row['group']; 7 $grouped[$group][] = $row; 8} 9 10/* 11キーをつける 12--------------*/ 13$result = []; 14$i = 1; 15foreach ( $grouped as $group => $array ) { 16 $key = 'key_' . $i; 17 $result[$key] = $array; 18 $i++; 19} 20 21/* 22結果を確認 23--------------*/ 24var_dump($result);
もう少しいい方法ありましたら宜しくお願い致します。
回答2件
あなたの回答
tips
プレビュー