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

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

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

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

PHP

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

配列

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

Q&A

解決済

4回答

8612閲覧

foreachの中で生成した配列を結合させたい。

igaiga

総合スコア144

foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

PHP

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

配列

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

0グッド

0クリップ

投稿2017/02/23 04:55

foreachの中で生成した配列を結合させたいのですが、
以下のようにすると上書きされてしまい、最後の配列のみが残ります。

###試したソースコード

$r=0; $lines_array = array(); foreach ($access as $access_val) { $line_list_array[$r] = line_list($access_val); //line_listはユーザー定義関数で配列を作っています。 $lines_array += $line_list_array[$r][0]; $r++; } print_r($lines_array);// Array ( [0] => line99303 [1] => 9930221 );

下記のような配列が入っているとした場合、
(実際には$access_valの値や数によって変動します。)
$line_list_array[0][0] = Array ( [0] => line99301 [1] => 9930118 );
$line_list_array[1][0] = Array ( [0] => line99302 [1] => 9930220 );
$line_list_array[2][0] = Array ( [0] => line99303 [1] => 9930221 );

下記のような結果を期待しているのですが思ったようになりませんでした。
$line_list_array = Array ( [0] => line99301 [1] => 9930118 [2] => line99302 [3] => 9930220 [4] => line99303 [5] => 9930221 );

恐れ入りますが、アドバイス頂ければ幸いです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答4

0

素直に書くならこうですかね。

$r=0; $lines_array = array(); foreach ($access as $access_val) { $line_list_array[$r] = line_list($access_val); foreach ($line_list_array[$r][0] as $line) { $lines_array[] = $line; } $r++; }

投稿2017/02/23 05:33

編集2017/02/23 05:35
Y.H.

総合スコア7914

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

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

igaiga

2017/02/23 07:48

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

0

ベストアンサー

php

1// $r=0; 2$lines_array = array(); 3foreach ($access as $access_val) { 4 // $line_list_array[$r] = line_list($access_val); //line_listはユーザー定義関数で配列を作っています。 5 // $lines_array += $line_list_array[$r][0]; 6 // $r++; 7 8 $lines_array = array_merge($lines_array, line_list($access_val)[0]); 9}

実行結果

php

1$access = array(0, 1, 2); 2 3function line_list($access_val) { 4 $data = array( 5 array('line99301', '9930118'), 6 array('line99302', '9930220'), 7 array('line99303', '9930221'), 8 ); 9 return array($data[$access_val]); 10} 11 12/* ------------------------------------------------------- */ 13 14// $r=0; 15$lines_array = array(); 16foreach ($access as $access_val) { 17 // $line_list_array[$r] = line_list($access_val); //line_listはユーザー定義関数で配列を作っています。 18 // $lines_array += $line_list_array[$r][0]; 19 // $r++; 20 21 $lines_array = array_merge($lines_array, line_list($access_val)[0]); 22} 23 24print_r($lines_array);
Array ( [0] => line99301 [1] => 9930118 [2] => line99302 [3] => 9930220 [4] => line99303 [5] => 9930221 )

投稿2017/02/23 06:01

KiyoshiMotoki

総合スコア4791

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

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

igaiga

2017/02/23 07:39

ありがとうございます!この方法でもイメージ通りできました。
igaiga

2017/02/23 07:50

1行で済むのでベストアンサーにさせていただきました。
guest

0

PHP

1 foreach ($access as $access_val) { 2 $line_list_array[$r] = line_list($access_val); //line_listはユーザー定義関数で配列を作っています。 3 $lines_array[] = $line_list_array[$r][0]; 4 $r++;

じゃないでしょうか。


改修

PHP

1 foreach ($access as $access_val) { 2 $line_list_array[$r] = line_list($access_val); //line_listはユーザー定義関数で配列を作っています。 3 foreach($line_list_array[$r][0] as $data) { 4 $lines_array[] = $data; 5 } 6 $r++;

ですかね、もとの意図に沿うならば。

投稿2017/02/23 05:03

編集2017/02/23 05:37
tacsheaven

総合スコア13703

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

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

igaiga

2017/02/23 05:06

ありがとうございます。試してみたところ、こんな感じになりました;; Array ( [0] => Array ( [0] => line99301 [1] => 9930118 ) [1] => Array ( [0] => line28006 [1] => 2800621 ) [2] => Array ( [0] => line28003 [1] => 2800312 ) )
igaiga

2017/02/23 07:35

ありがとうございます! 理解が追いつきませんが、とりあえずイメージ通りにできました!
guest

0

こんな感じでしょうか。

PHP

1$r=0; 2$lines_array = array(); 3foreach ($access as $access_val) { 4 $line_list_array[$r] = line_list($access_val); 5 foreach(array_values($line_list_array[$r]) as $v){ 6 $lines_array[] = $v; 7 } 8 $r++; 9} 10 11print_r($lines_array);

投稿2017/02/23 05:39

ttyp03

総合スコア16998

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

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

ttyp03

2017/02/23 06:03

マイナス評価を付けた方、どこがマイナス点なのか教えてください。
Y.H.

2017/02/23 06:16 編集

array_values($line_list_array[$r][0])かと。 $line_list_array[$r] は大外にもう一段arrayがあるようです。 あと $line_list_array[$r][0] は$lines_listにmargeしたいとの事ですが $line_list_array[$r][1]以降を考慮すると全てforeachで回るのはどうかと。
ttyp03

2017/02/23 06:10

$line_list_array[$r] = line_list($access_val); これで代入しているので、一次元配列なんじゃないでしょうか? 二次元であるなら、こう書かれているべきですし。 $line_list_array[$r][0] = line_list($access_val);
Y.H.

2017/02/23 06:15

line_list(){ return array(array('foo','bar'),array('hoge,'fuga')); } な感じで。 tacsheavenさんの回答のコメントで $lines_array[] = $line_list_array[$r][0]; とすると print_r($lines_array)でこうなるとのことなので Array ( [0] => Array ( [0] => line99301 [1] => 9930118 ) [1] => Array ( [0] => line28006 [1] => 2800621 ) [2] => Array ( [0] => line28003 [1] => 2800312 ) )
ttyp03

2017/02/23 06:32

line_list()の戻りがArray ( [0] => line99301 [1] => 9930118 )なのだから、全体を考慮して回す必要があると思うのですが。 これで代入したら、 $line_list_array[$r] = line_list($access_val); こうなりますよね。 $line_list_array[$r][0] = line99301 $line_list_array[$r][1] = 9930118 なので$line_list_array[$r][0] だけを対象にしてはダメだと思うのですが…。
Y.H.

2017/02/23 06:44

こうなりませんか? $ cat -n ddd.php 1 <?php 5 function line_list($foo){ 6 if ($foo == "dummy1") { 7 return array(array('line99301', '9930118'), array('foo', 'bar')); 8 } 9 return array(array($foo.'line99301', $foo.'9930118'), array($foo.'foo', $foo.'bar')); 10 } 11 12 $line_list_array = array(); 13 14 $r=0; 15 $lines_array = array(); 16 $access=array('dummy1', 'dummy2'); 17 foreach ($access as $access_val) { 18 $line_list_array[$r] = line_list($access_val); 19 foreach(array_values($line_list_array[$r]) as $v){ 20 $lines_array[] = $v; 21 } 22 $r++; 23 } 24 print_r($lines_array);// Array ( [0] => line99303 [1] => 9930221 ); 25 $ php ./ddd.php Array ( [0] => Array ( [0] => line99301 [1] => 9930118 ) [1] => Array ( [0] => foo [1] => bar ) [2] => Array ( [0] => dummy2line99301 [1] => dummy29930118 ) [3] => Array ( [0] => dummy2foo [1] => dummy2bar ) )
Y.H.

2017/02/23 06:46

$line_list_array[$r][0] だけを対象にすると こうなります。 $ php ./ddd.php Array ( [0] => line99301 [1] => 9930118 [2] => dummy2line99301 [3] => dummy29930118 )
ttyp03

2017/02/23 06:52

line_listの戻りが違くないですか? こうですよね? return array('line99301', '9930118'); ここの考え方が違っているので、お互いずれているんですよ。 tacsheavenさんのコードおよびコメント欄から推測すると、line_listの一回の戻り値はこれですよね。 Array ( [0] => line99301 [1] => 9930118 ) であるなら、 return array(array('line99301', '9930118'), array('foo', 'bar')); これは違いますよね。 元々曖昧なコードを基に回答しているので、もし私の勘違いでしたらマイナス評価は受け入れるしかありません。仕方なし。
Y.H.

2017/02/23 07:04

質問では $r=0; foreach ($access as $access_val) { $line_list_array[$r] = line_list($access_val); $r++; } の結果以下になるとの事なので $line_list_array[0][0] = Array ( [0] => line99301 [1] => 9930118 ); $line_list_array[1][0] = Array ( [0] => line99302 [1] => 9930220 ); $line_list_array[2][0] = Array ( [0] => line99303 [1] => 9930221 ); 以下になるならおっしゃるとおりだと思います。 $line_list_array[0] = Array ( [0] => line99301 [1] => 9930118 ); $line_list_array[1] = Array ( [0] => line99302 [1] => 9930220 ); $line_list_array[2] = Array ( [0] => line99303 [1] => 9930221 );
igaiga

2017/02/23 07:48

ttyp03さん、Y.H.さんありがとうございます。理解できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問