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

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

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

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

Q&A

解決済

2回答

5466閲覧

phpエクセルで配列に格納

shinoda

総合スコア75

PHP

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

0グッド

0クリップ

投稿2015/08/21 08:11

お世話になります。

現在、phpExcelを少し勉強しており、わからないことがあるのでご質問させてください。
あるエクセルファイルに店舗情報などが入っており、その中の項目に表示、非表示の「0」「1」の項目があり表示になっていれば、そのデータをグーグルマップに表示するという機能を実装したいと考えております。
まず、前半の部分で引っかかっておりどうすればよいのかわからず困っています。

以下にコードを記載します。

<?php // ファイル名の指定 $readFile = "sample.xlsx"; // 連想配列でデータ受け取り $data = readXlsx($readFile); // 出力確認 /*print '<pre>'; var_dump($data); print '</pre>'; */ // ファイル名渡したら配列返すラッパー関数 function readXlsx($readFile) { // ライブラリファイルの読み込み (パス指定し直す) require_once dirname(__FILE__) . './../Classes/PHPExcel/IOFactory.php'; // ファイルの存在チェック if (!file_exists($readFile)) { exit($readFile. "が見つかりません。" . EOL); } // xlsxをPHPExcelに食わせる $objPExcel = PHPExcel_IOFactory::load($readFile); // 配列形式で返す return $objPExcel->getActiveSheet()->toArray(null,true,true,true); } foreach((array)$data["$i"] as $value) { echo "<p>" . $value . "<p>"; } ---------------------------------------------- 【質問事項】 1)foreachの部分なのですが、$dataの中全てを取り出そうとして、 foreach((array)$data as $value) { echo "<p>" . $value . "<p>"; } と書いてもエラーを吐いてしまいます。なぜでしょうか? 2)foreachで回し、Excelの縦列のAに[0][1]で表示、非表示の項目があり、それを判定するにはどうすればよいのか? 以上、わからない内の一部ですが、ご教授いただければ幸いです。 宜しくお願い致します。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2015/08/22 11:24

> と書いてもエラーを吐いてしまいます。 エラーメッセージをそのまま転記してください。エスパー回答はできません。
shinoda

2015/08/24 01:24

エラーメッセージを追記致します Notice: Array to string conversion 上記のエラーが出てしまいます 以上、宜しくお願い致します。
guest

回答2

0

php

1<?php 2 3// ファイル名の指定 4$readFile = "sample.xlsx"; 5 6// 連想配列でデータ受け取り 7$data = readXlsx($readFile); 8 9// 出力確認 10/*print '<pre>'; 11var_dump($data); 12print '</pre>'; 13*/ 14// ファイル名渡したら配列返すラッパー関数 15function readXlsx($readFile) 16{ 17 // ライブラリファイルの読み込み (パス指定し直す) 18 require_once dirname(FILE) . './../Classes/PHPExcel/IOFactory.php'; 19 20 // ファイルの存在チェック 21 if (!file_exists($readFile)) { 22 exit($readFile. "が見つかりません。" . EOL); 23 } 24 25 // xlsxをPHPExcelに食わせる 26 $objPExcel = PHPExcel_IOFactory::load($readFile); 27 28 // 配列形式で返す 29 return $objPExcel->getActiveSheet()->toArray(null,true,true,true); 30} 31 32var_dump($data); 33//出力された値を転記してください 34 35// foreach((array)$data["$i"] as $value) { 36// echo "<p>" . $value . "<p>"; 37//}

こちらの手元の環境の設定になっているので、適当に変更してください。

php

1<?php 2 3define('PHPEXCEL_DIR', '/usr/share/php/phpexcel/Classes/'); 4 5// ファイル名の指定 6$readFile = "sample.xlsx"; 7 8// 連想配列でデータ受け取り 9$data = readXlsx($readFile); 10 11// ファイル名渡したら配列返すラッパー関数 12function readXlsx($readFile) 13{ 14 // ライブラリファイルの読み込み (パス指定し直す) 15 require_once(PHPEXCEL_DIR . "/PHPExcel.php"); 16 17 // ファイルの存在チェック 18 if (!file_exists($readFile)) { 19 exit($readFile . "が見つかりません。" . EOL); 20 } 21 22 // xlsxをPHPExcelに食わせる 23 $objPExcel = PHPExcel_IOFactory::load($readFile); 24 25 // 配列形式で返す 26 $data = $objPExcel->getActiveSheet()->toArray(null, true, true, true); 27 28 $arr = array(); 29 foreach ($data as $row => $arrCol) { 30 foreach ($arrCol as $col => $val) { 31 $arr[$col][$row] = $val; 32 } 33 } 34 return $arr; 35} 36 37var_dump($data);

出力結果

array (size=3)
'A' =>
array (size=10)
1 => string 'A1' (length=2)
2 => string 'A2' (length=2)
3 => string 'A3' (length=2)
4 => string 'A4' (length=2)
5 => string 'A5' (length=2)
6 => string 'A6' (length=2)
7 => string 'A7' (length=2)
8 => string 'A8' (length=2)
9 => string 'A9' (length=2)
10 => string 'A10' (length=3)
'B' =>
array (size=10)
1 => string 'B1' (length=2)
2 => string 'B2' (length=2)
3 => string 'B3' (length=2)
4 => string 'B4' (length=2)
5 => string 'B5' (length=2)
6 => string 'B6' (length=2)
7 => string 'B7' (length=2)
8 => string 'B8' (length=2)
9 => string 'B9' (length=2)
10 => string 'B10' (length=3)
'C' =>
array (size=10)
1 => string 'C1' (length=2)
2 => string 'C2' (length=2)
3 => string 'C3' (length=2)
4 => string 'C4' (length=2)
5 => string 'C5' (length=2)
6 => string 'C6' (length=2)
7 => string 'C7' (length=2)
8 => string 'C8' (length=2)
9 => string 'C9' (length=2)
10 => string 'C10' (length=3)

投稿2015/08/24 02:11

編集2015/08/24 03:30
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

shinoda

2015/08/24 02:57

早速のご回答有難うございます。 質問が説明不足で申し訳ありません。 var_dumpやprint_rで配列の中身を見たいというわけではなく、取り込んだExcelが多次元配列なので、指定したキーの部分を取り出したいということなんです。 多次元なのでforeachをネストしてから、キーを指定すればよろしいでしょうか? またExcelの縦列のA,B...などを指定して、ある数字だったら等の条件分岐はどのようにしたら良いでしょうか? うまく説明できてないかもしれませんがご教授いただければ幸いです。 以上宜しくお願い致します
退会済みユーザー

退会済みユーザー

2015/08/24 03:06

> 取り込んだExcelが多次元配列なので、指定したキーの部分を取り出したいということなんです。 どんな値が返ってきているのかがわからないと回答の仕様がありません。 私の手元にsample.xlsxは存在しませんから。
shinoda

2015/08/24 10:37

ご教授いただいたコードで配列にしたsample.xlsxの中身を記載します -------------------------------- array(3) { [1]=> array(17) { ["A"]=> string(12) "管理番号" ["B"]=> string(6) "種別" ["C"]=> string(12) "公開有無" ["D"]=> string(9) "物件名" ["E"]=> string(6) "住所" ["F"]=> string(9) "全戸数" ["G"]=> string(12) "入居戸数" ["H"]=> string(27) "イベント開催開始日" ["I"]=> string(27) "イベント開催終了日" ["J"]=> string(15) "メッセージ" ["K"]=> string(27) "外観画像ファイル名" ["L"]=> string(30) "イベントPDFファイル名" ["M"]=> string(6) "緯度" ["N"]=> string(6) "経度" ["O"]=> string(27) "外観画像ファイル名" ["P"]=> string(30) "イベントPDFファイル名" ["Q"]=> NULL } [2]=> array(17) { ["A"]=> NULL ["B"]=> string(95) "10:イベント 20:モデルルーム 30:実績(満室) 31:実績(空室あり)" ["C"]=> string(24) "0:非公開 1:公開" ["D"]=> NULL ["E"]=> string(6) "必須" ["F"]=> string(49) "「種別」が30もしくは31の場合に必須" ["G"]=> string(35) "「種別」が31の場合に必須" ["H"]=> string(35) "「種別」が10の場合に必須" ["I"]=> string(80) "「種別」が10、かつイベント開催開始日と異なる場合に必須" ["J"]=> string(35) "「種別」が10の場合に必須" ["K"]=> NULL ["L"]=> NULL ["M"]=> NULL ["N"]=> NULL ["O"]=> string(24) "システムでの利用" ["P"]=> string(24) "システムでの利用" ["Q"]=> NULL } [3]=> array(17) { ["A"]=> float(1) ["B"]=> float(10) ["C"]=> float(1) ["D"]=> string(27) "●● 102号室" ["E"]=> string(40) ["F"]=> NULL ["G"]=> NULL ["H"]=> NULL ["I"]=> NULL ["J"]=> NULL ["K"]=> NULL ["L"]=> NULL ["M"]=> float(36.036802) ["N"]=> float(140.063076) ["O"]=> NULL ["P"]=> NULL ["Q"]=> NULL } } ------------------------------------------ すごく長くて申し訳ありません 上記の配列で言うとD列が公開の有無となっていて、0 or 1になっていて、1になっているものをすべて表示するといった感じにしたいのです。 宜しくお願い致します。
退会済みユーザー

退会済みユーザー

2015/08/24 11:52 編集

これは追記で記述したコードではなさそうですね… それにしたって、 $data[3]['A'] のようにアクセスできるはずですけど…
shinoda

2015/08/24 12:02

ご教授いただいた $arr = array(); foreach ($data as $row => $arrCol) { foreach ($arrCol as $col => $val) { $arr[$col][$row] = $val; } } return $arr; で取り出したものですが違う動きをしていますでしょうか? おっしゃるように$data[3]['A'] でできたとしても、[3]=Excelファイルの3行目しか見れないので、すべての行のD列の0 or 1を判定したいのです
退会済みユーザー

退会済みユーザー

2015/08/24 12:44

完全に初歩でつまづいているんですね… PHPExcel とか使う以前の基本文法です。 そもそも、取り出した値を何のために使いたいのです?
shinoda

2015/08/26 09:23

返信遅くなり申し訳ありません。 仰るとおりに foreach ($data as $col => $arrRows) { echo $col; echo $arrRows['A']; echo $arrRows['B']; echo $arrRows['C']; } と記載して取り出すことが出来ました。 >そもそも、取り出した値を何のために使いたいのです? 上記についてですがExcelのC列の0.1が1になっていた場合、その座標を取りだしグーグルマップに表示するという仕組みを作りたかったのです。 Kosuke_Shibuya様が懸念されているif文についてはおそらく大丈夫かと思います。 何から何までご丁寧に解説、ご教授頂き本当にありがとうございました。 もっと勉強をしていきたいと思います。 またわからないことがありましたら質問させていただくことがあるかと思いますが、どうぞ宜しくお願い致します。
guest

0

ベストアンサー

長くなるので、回答分けます。

php

1<?php 2 3define('PHPEXCEL_DIR', '/usr/share/php/phpexcel/Classes/'); 4 5// ファイル名の指定 6$readFile = "sample.xlsx"; 7 8// 連想配列でデータ受け取り 9$data = readXlsx($readFile); 10 11// ファイル名渡したら配列返すラッパー関数 12function readXlsx($readFile) 13{ 14 // ライブラリファイルの読み込み (パス指定し直す) 15 require_once(PHPEXCEL_DIR . "/PHPExcel.php"); 16 17 // ファイルの存在チェック 18 if (!file_exists($readFile)) { 19 exit($readFile . "が見つかりません。" . EOL); 20 } 21 22 // xlsxをPHPExcelに食わせる 23 $objPExcel = PHPExcel_IOFactory::load($readFile); 24 25 // 配列形式で返す 26 $data = $objPExcel->getActiveSheet()->toArray(null, true, true, true); 27 28 $arr = array(); 29 foreach ($data as $row => $arrCol) { 30 foreach ($arrCol as $col => $val) { 31 $arr[$col][$row] = $val; 32 } 33 } 34 return $arr; 35} 36 37foreach ($data as $col => $arrRows) { 38 echo $col; 39 echo $arrRows['1']; 40 echo $arrRows['2']; 41 echo $arrRows['3']; 42}

さすがに if 文までは質問対象じゃありませんよね…

投稿2015/08/24 12:47

編集2015/08/24 12:59
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問