質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.49%
PHP

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

2159閲覧

phpを使って、配列に入っているtextをid毎にカンマ区切りでまとめたい

aeofun

総合スコア12

PHP

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

1グッド

1クリップ

投稿2019/01/23 09:17

編集2019/01/24 07:16

前提・実現したいこと

下記のような配列を、同じid毎にtextをカンマ区切りで格納したいです。
foreach等、使いましたが思うように整形できません。
(プラス、textが3つ以上になった場合、ランダムで2つに絞るということもしたいです)

よろしくお願いします。


↓元データ

array:3 [ 0 => array:2 [ "id" => 1 "text" => "あいうえお" ] 1 => array:2 [ "id" => 1 "text" => "かきくけこ" ] 2 => array:2 [ "id" => 2 "text" => "さしすせそ" ] ]

↓理想

array:2 [ 0 => array:2 [ "id" => 1 "text" => "あいうえお,かきくけこ" ] 1 => array:2 [ "id" => 2 "text" => "さしすせそ" ] ]

試したこと

$contentss = array(0=>array("id"=>1,"text"=>"あいうえお"),1=>array("id"=>1,"text"=>"かきくけこ"),2=>array("id"=>2,"text"=>"さしすせそ")); $groups = []; foreach ($contentss as $content) {     $groups[$content["id"]][] = $content["text"]; }

↓結果

array:2 [ 1 => array:2 [ 0 => "あいうえお" 1 => "かきくけこ" ] 2 => array:1 [ 0 => "さしすせそ" ] ]

補足情報(FW/ツールのバージョンなど)

PHP 7.2.0
Laravel 5.1.46

bochan2👍を押しています

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

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

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

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

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

m.ts10806

2019/01/24 02:15

「【至急】」という割りに半日以上解決しなくても大丈夫な要件って何でしょうか。 個人個人事情はあると思いますが、他人である回答者は知ったこっちゃないので、質問要件に関係のない文言は外してください。 その分質問内容の充実化をはかってください。これではタグとの関連性が不明です。
aeofun

2019/01/24 07:18

ご指摘ありがとうございます! おっしゃる通りで、個人的な都合でしたので修正しました。次回から注意して作成します。
guest

回答3

0

Laravel タグ入ってるので Laravel Collection 使っていいんですよね?

php

1$before = [ 2 [ 3 'id' => 1, 4 'text' => 'あいうえお', 5 ], 6 [ 7 'id' => 1, 8 'text' => 'かきくけこ', 9 ], 10 [ 11 'id' => 2, 12 'text' => 'さしすせそ', 13 ], 14]; 15 16$after = collect($before) 17 ->groupBy('id') 18 ->map->shuffle() 19 ->map->take(2) 20 ->map->implode('text', ',') 21 ->map(function ($text, $id) { 22 return compact('id', 'text'); 23 }) 24 ->values() 25 ->toArray(); 26 27dump($after);

効率度外視だけど if foreach が1個も入ってなくてすべて宣言的なので個人的にはこれが好き

投稿2019/01/23 19:43

編集2019/01/23 19:56
mpyw

総合スコア5223

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

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

0

ベストアンサー

たとえばこう?

PHP

1$a=[ 2 ["id"=>10,"text"=>"あいうえお",], 3 ["id"=>10,"text"=>"かきくけこ",], 4 ["id"=>20,"text"=>"さしすせそ",], 5 ["id"=>10,"text"=>"たちつてと",], 6 ["id"=>30,"text"=>"なにぬねの",], 7 ["id"=>20,"text"=>"はひふへほ",], 8 ]; 9$b=[]; 10foreach($a as $val){ 11 $b[$val["id"]]=[ 12 "id"=>$val["id"], 13 "text"=>(isset($b[$val["id"]])?$b[$val["id"]]["text"].",":"").$val["text"], 14 ]; 15} 16$b=array_values($b); 17print_r($b);

投稿2019/01/23 10:06

編集2019/01/23 11:11
yambejp

総合スコア114747

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

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

yambejp

2019/01/23 11:12

元データを書くの忘れてたので修正しました サンプルが少なすぎるのでidとデータは適当に増やしときました
aeofun

2019/01/24 07:21

ありがとうございます!こちらの方法できれいにまとめることができました。
guest

0

$groups に配列を追加しているので、文字連結にするといい。
ランダムに関しては、いろいろやり方ありそうだけど、愚直に $groups を再スキャンして、text をパースして内容数を確認するのがわかりやすいかと。

投稿2019/01/23 09:27

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

aeofun

2019/01/23 10:05

ご回答ありがとうございます! >$groups に配列を追加しているので、文字連結にするといい。 文字連結は、implode()という関数がよいのでしょうか? foreach文の中を下記のように修正しましたが、上書きされて連結にはなりません...。 ``` $groups[$content["id"]] = implode(",",array($content["text"])); ``` 連結させていく処理は別途、作成する必要があるのでしょうか?
退会済みユーザー

退会済みユーザー

2019/01/23 11:28

疑問点はマニュアル見ると解決できますよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問