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

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

ただいまの
回答率

89.99%

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

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 2,989

igaiga

score 135

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: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.さんありがとうございます。理解できました。

    キャンセル

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

  • ただいまの回答率 89.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる