🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

3152閲覧

PHPで連想配列を指定キーごとにグループ化したい

ringorin

総合スコア40

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/12/09 01:57

編集2020/12/09 02:13

###実現したいこと
お世話になります。
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);

もう少しいい方法ありましたら宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/12/09 02:28

何がやりたいのかいまいち分かりませんが、「連番」という概念が多分間違っています。 配列を使用したいのであれば、「'key' => 1」のように扱うのが適当かと。
ringorin

2020/12/09 04:54 編集

> 何がやりたいのかいまいち分かりません やりたいことは、実現したいことにあるような連想配列の変換なのですが…何が分かりませんでしたか?
guest

回答2

0

ベストアンサー

あってますかね?

PHP

1$result = []; 2$groups = []; 3foreach ( $rows as $row ) { 4 $groups[$row['group']] = 1; // dummmy 5 $groups[$row['group']] = count($groups); 6 $result['key_' . $groups[$row['group']]][] = $row; 7}

投稿2020/12/09 04:32

編集2020/12/09 04:39
ttyp03

総合スコア17000

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ringorin

2020/12/09 04:54 編集

ご回答ありがとうございます。 欲しいのは // 以下を得たいです にある連想配列になります。
ttyp03

2020/12/09 04:44

度々の修正失礼しました。 たぶんあってると思うので確認してみてください。
ringorin

2020/12/09 04:53

一回のforeachになってよかったです。ご修正どうもありがとうございました。
ttyp03

2020/12/09 05:08

一応補足。 groupが順番に並んでいない場合(例えばa,a,b,c,a,bみたいな)正しく動作しません。 その場合、ループ内最初の2行を次のように変更してください。 if(!array_key_exists($row['group'], $groups)){ $groups[$row['group']] = (count($groups) == 0)? 1: count($groups) + 1; }
ringorin

2020/12/09 05:43

今まさにそこにハマっておりましたので大変助かりました。改めてありがとうございます。
ttyp03

2020/12/09 05:52

最初に気づけばよかったのですが、すみません。 #質問するときはあらゆるパターンを想定した仕様や例題を書いておいた方が行き違いが少なくてよいですよ。
guest

0

php

1<?php 2 3$rows = [ 4 ['id' => 1, 'group' => 'a'], 5 ['id' => 2, 'group' => 'a'], 6 ['id' => 3, 'group' => 'c'], 7 ['id' => 4, 'group' => 'd'], 8]; 9 10$temp = []; 11foreach ($rows as $row) { 12 $temp[$row['group']][] = $row; 13} 14 15$res = []; 16$i = 0; 17foreach ($temp as $item) { 18 $i++; 19 $res['key_' . $i] = $item; 20} 21 22var_dump($res);

投稿2020/12/09 02:15

phper.k

総合スコア3923

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ringorin

2020/12/09 04:37

ご回答ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問