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

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

ただいまの
回答率

90.53%

  • PHP

    23533questions

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

  • 配列

    600questions

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

  • foreach

    75questions

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

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

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 1,865

igaiga

score 129

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 );

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+2

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

$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 16:48

    ありがとうございます!

    キャンセル

checkベストアンサー

+1

// $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++;

    $lines_array = array_merge($lines_array, line_list($access_val)[0]);
}


実行結果

$access = array(0, 1, 2);

function line_list($access_val) {
    $data = array(
        array('line99301', '9930118'),
        array('line99302', '9930220'),
        array('line99303', '9930221'),
    );
    return array($data[$access_val]);
}

/* ------------------------------------------------------- */

// $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++;

    $lines_array = array_merge($lines_array, line_list($access_val)[0]);
}

print_r($lines_array);
Array
(
    [0] => line99301
    [1] => 9930118
    [2] => line99302
    [3] => 9930220
    [4] => line99303
    [5] => 9930221
)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/23 16:39

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

    キャンセル

  • 2017/02/23 16:50

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

    キャンセル

+1

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

じゃないでしょうか。


改修

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


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/23 14:06

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

    キャンセル

  • 2017/02/23 16:35

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

    キャンセル

-1

こんな感じでしょうか。

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

print_r($lines_array);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/23 15:03

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

    キャンセル

  • 2017/02/23 15:06 編集

    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で回るのはどうかと。

    キャンセル

  • 2017/02/23 15:10

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

    キャンセル

  • 2017/02/23 15: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 ) )


    キャンセル

  • 2017/02/23 15: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] だけを対象にしてはダメだと思うのですが…。

    キャンセル

  • 2017/02/23 15: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
    )
    )

    キャンセル

  • 2017/02/23 15:46

    $line_list_array[$r][0] だけを対象にすると
    こうなります。

    $ php ./ddd.php
    Array
    (
    [0] => line99301
    [1] => 9930118
    [2] => dummy2line99301
    [3] => dummy29930118
    )

    キャンセル

  • 2017/02/23 15:52

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

    キャンセル

  • 2017/02/23 16: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 );

    キャンセル

  • 2017/02/23 16:48

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

    キャンセル

同じタグがついた質問を見る

  • PHP

    23533questions

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

  • 配列

    600questions

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

  • foreach

    75questions

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