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

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

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

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

Q&A

解決済

3回答

389閲覧

PHPでの配列の生成について

gomiobake666

総合スコア6

PHP

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

0グッド

0クリップ

投稿2022/07/21 08:31

編集2022/07/21 12:08
Array ( [0] => Array ( [age] => 10 ) [1] => Array ( [age] => 20 ) [2] => Array ( [age] => 30 ) [3] => Array ( [age] => 40 ) [4] => Array ( [age] => 50 ) [5] => Array ( [age] => 60 ) [6] => Array ( [age] => 70 ) [7] => Array ( [age] => 80 ) [8] => Array ( [age] => 90 ) [9] => Array ( [age] => 100 ) )

上記のような配列があります。
上記の配列をforeachで下記のようにループしています。

$userStr = 1; foreach ($ageList as $age) { $newAgeArr += array( 'user' . $userStr => $age ); if (${"user" . $userStr} == 0) { $notAge++; } }

上記のように現在は処理しているのですが、こちらのやり方では、下記のような配列が生成されます。

Array ( [user1] => 10 [user2] => 20 [user3] => 30 [user4] => 40 [user5] => 50 [user6] => 60 [user7] => 70 [user8] => 80 [user9] => 90 [user10] => 100 )

このような配列の形ではなく下記のような配列の形を生成したいのですが、うまくいかず苦戦しております。
ご教授いただけると幸いです。

Array ( [0] => Array ( [user1] => 10 [user2] => 20 [user3] => 30 [user4] => 40 [user5] => 50 ) [1] => Array ( [user1] => 60 [user2] => 70 [user3] => 80 [user4] => 90 [user5] => 100 ) )

補足

5づつで配列を生成したいという意味です。

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

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

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

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

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

phper.k

2022/07/21 08:42

ルールが不明です。 5件ずつ分けたいってこと?
gomiobake666

2022/07/21 10:16

すみません。その通りです。
guest

回答3

0

ベストアンサー

foreach での愚直なループ

php

1<?php 2 3$users = [ 4 ['age' => 10], 5 ['age' => 20], 6 ['age' => 30], 7 ['age' => 40], 8 ['age' => 50], 9 ['age' => 60], 10 ['age' => 70], 11 ['age' => 80], 12 ['age' => 90], 13 ['age' => 100], 14]; 15 16$results = []; 17foreach ($users as $i => $user) { 18 $results[intdiv($i, 5)]['user' . ($i + 1)] = $user['age']; 19} 20 21var_dump($results);

foreach 禁止縛り

php

1<?php 2 3$users = [ 4 ['age' => 10], 5 ['age' => 20], 6 ['age' => 30], 7 ['age' => 40], 8 ['age' => 50], 9 ['age' => 60], 10 ['age' => 70], 11 ['age' => 80], 12 ['age' => 90], 13 ['age' => 100], 14]; 15 16$results = array_map( 17 fn (array $ages) => array_combine( 18 array_map( 19 fn (int $i) => 'user' . ($i + 1), 20 array_keys($ages), 21 ), 22 $ages, 23 ), 24 array_chunk( 25 array_column($users, 'age'), 26 5, 27 ), 28); 29 30var_dump($results);

PHP は

  • ネストした配列代入を行ったとき,子孫の配列が存在していなくても暗黙的に初期化出来る
  • array_* 系の関数は便利だけどキーを書き換えるのが苦手

という特徴を持っているので,操作が複雑になればなるほど foreach を素直に書いたほうがスッキリするケースが多いです。一方単純なものであれば array_* 系関数でスッキリすることもあるので,臨機応変に対応する姿勢を身につけるとよいでしょう。


問題にいちゃもんつけるのもアレなので,あくまで個人的な意見ですが, user1 user2 ... のような文字列混じり・1開始の連番は, PHP に限らずプログラミングで広くアンチパターンとされることが多いです。本当に必要がない限り, 0 1 ... のようにゼロ開始の整数連番のまま持っておくほうが好まれます。

この要件がなければ,今回の問題も以下のように書いて終わりで済みます。

php

1$results = array_chunk(array_column($users, 'age'), 5);

投稿2022/07/21 17:08

編集2022/07/22 01:26
mpyw

総合スコア5223

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

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

0

php

1$x = array_chunk($newAgeArr, 5); 2var_dump($x);

--- 追記 ---
仕様を誤解してましたので再度

php

1$ageList = [['age'=>10],['age'=>20],['age'=>30],['age'=>40],['age'=>50],['age'=>60],['age'=>70],['age'=>80],['age'=>90],['age'=>100]]; 2$newAgeArr = []; 3foreach (array_chunk(array_map(fn($x)=>$x['age'],$ageList),5) as $x) { 4 $newAgeArr []= array_combine(array_map(fn($s)=>'user'.$s,range(1,count($x))),$x); 5} 6var_dump($newAgeArr);

もし $ageList のフィルターが必要なら array_map() する前にどうぞ。

投稿2022/07/21 11:20

編集2022/07/22 11:18
takasima20

総合スコア7458

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

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

gomiobake666

2022/07/21 12:07

ありがとうございます。 こちらで5つづつの配列が生成されるのは確認できたのですが、僕としては配列のキー名も指定したかったので、少し僕がしたかった内容とは異なります。
takasima20

2022/07/21 19:57

あー、失敬しました。(汗)
gomiobake666

2022/07/25 13:23

いえいえ!ご丁寧にありがとうございます!
guest

0

PHP

1$a=[ 2 ["age" => 10], 3 ["age" => 20], 4 ["age" => 30], 5 ["age" => 40], 6 ["age" => 50], 7 ["age" => 60], 8 ["age" => 70], 9 ["age" => 80], 10 ["age" => 90], 11 ["age" => 100], 12]; 13$b=array_reduce($a,function($x,$y) use(&$key){ 14 $key++; 15 $x[intval($key/5)]["user".$key]=$y["age"]; 16 return $x; 17},[]); 18print_r($b);

foreachでやるなら

PHP

1foreach($a as $key=>$val){ 2 $b[intval($key/5)]["user".($key+1)]=$val["age"]; 3} 4print_r($b);

投稿2022/07/21 08:45

編集2022/07/22 00:10
yambejp

総合スコア114843

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

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

gomiobake666

2022/07/21 10:21

foreachではない方でやるとした場合なんですが、$keyはどこで定義しているのでしょうか?
yambejp

2022/07/22 00:10

すみません、コピペミスです、修正しました
gomiobake666

2022/07/25 13:24

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問