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

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

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

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

0回答

1305閲覧

多次元配列の取得方法

tarao

総合スコア28

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2017/08/29 16:08

編集2017/08/29 16:40

製品項目とスペック項目が一つになっているcsvファイルをインポートし、製品項目とスペック項目の値をそれぞれ、dbに登録したいと思っているのですが、スペック項目をnewEntitiesでsaveできる配列の形にすることができません。

db構造は
・製品テーブル(products)
・カテゴリーテーブル(categories)
・スペックテーブル(specs)

--- 中間テーブル ---
・categoriesproducts(カテゴリー/製品)
・specscategories(カテゴリー/スペック)
・specsproducts(製品/スペック)

csvは下記のような形で入ってきます。
![イメージ説明

製品項目は固定でスペック項目はカテゴリーによって項目が変わるので、製品とスペックの登録を分けてすることにしました。
↓製品登録時の処理です

php

1$save_product=[]; 2foreach($result as $key => $record){//csvファイルの配列 3 4 $csv_names=$this->config['product']; 5 if($key!=0){//ヘッダー以外を登録 6 foreach($csv_names as $csvkey => $record_names){//defineで定義した製品項目名 7 $save_products[$csvkey]=$record[$record_names];//項目名が一致したレコードを配列に入れる 8 } 9 $save_products['categories']['_ids'][0]=$scv_file['categories_id'];//カテゴリーidを変更する 10 11 $save_product[]=$save_products; 12 13 $save_data = $this->products->newEntities($save_product); 14 $product = $this->products->patchEntities($save_data, $save_product, [ 15 'associated' => [ 16 'Categories' 17 ] 18 ]); 19 }//if($key!=0) 20}//foreach($result as $key => $record)

この後、スペック項目の登録処理をします。
インポートしたスペック項目の配列($specresult)を登録分(ヘッダー以外
)foreachします。
スペックの数分配列を作ります。

php

1if($this->products->saveMany($product)){//製品が更新できたら 2 3 foreach($product as $p_id){//saveした製品id取得 4 $id[]=$p_id->id; 5 } 6 $import_spec=[]; 7 8 foreach($specresult as $speckey => $specsvalue ){//インポートしたスペックファイル 9 if($speckey!=0){//ヘッダー部分除く 10 $produtc_spec=[]; 11 12 foreach($specsvalue as $spec_values){//項目ごとに配列に入れる 13 if($spec_values!=""){ 14 $deleteflg=0; 15 }else{ 16 $deleteflg=1; 17 } 18 $lists=[]; 19 foreach($id as $ids){//登録した製品id 20 $list=[]; 21 //カテゴリーテーブルに紐付いたスペックのid($specid) 22 foreach($specid as $skey=> $spec_ids){ 23 $speccolum['spec_value']=$spec_values; 24 $speccolum['delete_flg']=$deleteflg; 25 $speccolum['category_id']=$scv_file['categories_id']; 26 $speccolum['product_id']=$ids;//製品id 27 $speccolum['spec_id']=$spec_ids;//スペックid 28 $list[]=$speccolum; 29 } 30 $lists[]=$list; 31 } 32 }//foreach($specsvalue as $spec_values) 33 $specs_product =$this->specs_products->newEntities($lists); 34 $product = $this->specs_products->saveMany($specs_product); 35 }//if($speckey!=0) 36 37 }// foreach($specresult as $speckey => $specsvalue ) 38}//if($this->products->saveMany($product)

newEntitiesする$produtc_specは下のような形で入って欲しのですが、
spec_valueの値が一つの製品で全部スペック1のtest1が、2つ目の製品では全部スペック2の値が入ってしまいます。

[
0=>[
'spec_value'=>'test1',
'delete_flg'=>'0',
'category_id'=>2,
'product_id'=>1,
'spec_id'=>1,
],
1->[
'spec_value'=>'',
'delete_flg'=>'0',
'category_id'=>2,
'product_id'=>1,
'spec_id'=>2,
]、
2->[
'spec_value'=>'test3',
'delete_flg'=>'0',
'category_id'=>2,
'product_id'=>1,
'spec_id'=>3,
]
]
配列が多すぎて、わかり辛くなってしまいました。
上のように$produtc_specに入れたいのですが、どうすればよいでしょうか...

かなり説明不足かもしれませんが、ご教示お願いします。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問