[2020/12/21] PHP PhpSpreadsheet\Chart ワークシート上のチャート位置の調整について (No.251)
[2020/12/18] PHP PHPExcel_Chart ワークシート上のチャート位置の調整について (No.250)
[2020/12/18] PHP PHPExcel エクセルのワークシートのセルの罫線はスタイルオブジェクトの applyFromArray で確実に行える (No.249)
[2020/12/12] PHP 標準関数その3・変数の整数型への変換を行う関数(intval)について (No.247)
[2020/12/11] PHP 標準関数その2・変数の存在チェック及び解除を行う関数(isset, unset)について (No.246)
-
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
-
今回は生成する「チャート」の位置の調整について説明したいと思います。
PhpSpreadsheet の説明の初回の記事で用いたプログラムをそのまま利用します。(以下のリンク)
⇒PHP PhpSpreadsheet ワークシート上にチャート(グラフ)を作成する方法について(PhpSpreadsheet\Chart)
<?php // ライブラリ読込 require '../vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Chart\Chart; use PhpOffice\PhpSpreadsheet\Chart\DataSeries; use PhpOffice\PhpSpreadsheet\Chart\DataSeriesValues; use PhpOffice\PhpSpreadsheet\Chart\PlotArea; use PhpOffice\PhpSpreadsheet\Chart\Title; use PhpOffice\PhpSpreadsheet\IOFactory; // Spreadsheetオブジェクト生成 $objSpreadsheet = new Spreadsheet(); // ワークシートオブジェクト取得 $objWorksheet = $objSpreadsheet->getActiveSheet(); // チャート用テストデータ生成 $objWorksheet->fromArray( array( array('売上' , 2016, 2017, 2018, 2019, 2020), array('商品1', 12, 15, 21, 18, 20), ) ); // X軸ラベルの指定 $arrCategorysDataSeries = array( new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$B$1:$F$1', NULL, 5), // 2016 to 2020 ); // 描画データの指定 $arrDataSeriesValues = array( new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, 'Worksheet!$B$2:$F$2', NULL, 5), ); // チャート・データシリーズの生成 $objSeries = new DataSeries( DataSeries::TYPE_LINECHART, // plotType NULL, // plotGrouping(DataSeries::GROUPING_STANDARD) range(0, count($arrDataSeriesValues) - 1), // plotOrder array(), // plotLabel $arrCategorysDataSeries, // plotCategory $arrDataSeriesValues // plotValues ); // プロットエリアにチャート・データシリーズに設定 $objPlotArea = new PlotArea(NULL, array($objSeries)); // チャート・タイトル生成 $objTitle = new Title('売上データ'); // チャート生成 $objChart = new Chart( 'chart1', // name $objTitle, // title NULL, // legend $objPlotArea, // plotArea TRUE, // plotVisibleOnly 0, // displayBlanksAs NULL, // xAxisLabel NULL // yAxisLabel ); // ワークシート内のチャート位置設定 $objChart->setTopLeftPosition('A6'); // 左上 $objChart->setBottomRightPosition('G18'); // 右下 // ワークシートにチャート追加 $objWorksheet->addChart($objChart); // [test-g-1.xlsx]:Excel2007形式で保存する $objWriter = IOFactory::createWriter($objSpreadsheet, 'Xlsx'); $objWriter->setIncludeCharts(TRUE); $objWriter->save('test-g-1.xlsx'); exit(); ?>
出力されたエクセルファイルを見てみると以下の様になります。
このプログラムの59,60行目でチャート位置設定を行っていますが、 チャートオブジェクトの setTopLeftPosition、setBottomRightPosition メソッドの引数にはセル位置の後に X方向、Y方向 の引数があります。
メソッドの引数は以下の様に定義されています。public function setTopLeftPosition($cell, $xOffset = null, $yOffset = null) public function setBottomRightPosition($cell, $xOffset = null, $yOffset = null) $cell :セルアドレス $xOffset:X方向のオフセット(相対値:ピクセル値?) $yOffset:Y方向のオフセット(相対値:ピクセル値?)
X方向、Y方向のオフセットを設定してプログラムを直してみます。<?php // ライブラリ読込 require '../vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Chart\Chart; use PhpOffice\PhpSpreadsheet\Chart\DataSeries; use PhpOffice\PhpSpreadsheet\Chart\DataSeriesValues; use PhpOffice\PhpSpreadsheet\Chart\PlotArea; use PhpOffice\PhpSpreadsheet\Chart\Title; use PhpOffice\PhpSpreadsheet\IOFactory; // Spreadsheetオブジェクト生成 $objSpreadsheet = new Spreadsheet(); // ワークシートオブジェクト取得 $objWorksheet = $objSpreadsheet->getActiveSheet(); // チャート用テストデータ生成 $objWorksheet->fromArray( array( array('売上' , 2016, 2017, 2018, 2019, 2020), array('商品1', 12, 15, 21, 18, 20), ) ); // X軸ラベルの指定 $arrCategorysDataSeries = array( new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$B$1:$F$1', NULL, 5), // 2016 to 2020 ); // 描画データの指定 $arrDataSeriesValues = array( new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, 'Worksheet!$B$2:$F$2', NULL, 5), ); // チャート・データシリーズの生成 $objSeries = new DataSeries( DataSeries::TYPE_LINECHART, // plotType NULL, // plotGrouping(DataSeries::GROUPING_STANDARD) range(0, count($arrDataSeriesValues) - 1), // plotOrder array(), // plotLabel $arrCategorysDataSeries, // plotCategory $arrDataSeriesValues // plotValues ); // プロットエリアにチャート・データシリーズに設定 $objPlotArea = new PlotArea(NULL, array($objSeries)); // チャート・タイトル生成 $objTitle = new Title('売上データ'); // チャート生成 $objChart = new Chart( 'chart1', // name $objTitle, // title NULL, // legend $objPlotArea, // plotArea TRUE, // plotVisibleOnly 0, // displayBlanksAs NULL, // xAxisLabel NULL // yAxisLabel ); // ワークシート内のチャート位置設定 $objChart->setTopLeftPosition('A6', 32, 10); // 左上 $objChart->setBottomRightPosition('G18', 32, 10); // 右下 // ワークシートにチャート追加 $objWorksheet->addChart($objChart); // [test-g-9-2.xlsx]:Excel2007形式で保存する $objWriter = IOFactory::createWriter($objSpreadsheet, 'Xlsx'); $objWriter->setIncludeCharts(TRUE); $objWriter->save('test-g-9-2.xlsx'); exit(); ?>
オフセットはピクセルの値の様なので、左上、右下共にX方向は32ピクセルで、Y方向は10ピクセルにしました。
32ピクセル及び10ピクセルはセルの幅が64ピクセルで、高さが20ピクセルなので半分の値です。
出力されたエクセルファイルを見てみると以下の様になります。
指定された値の位置に行っている様な感じですが、右下が少し怪しいです。 ここは出力されたチャートの位置をみて微調整が必要かもしれません。
PR -
今回は生成する「チャート」の位置の調整について説明したいと思います。
PHPExcel_Chart の説明の初回の記事で用いたプログラムをそのまま利用します。(以下のリンク)
⇒PHP PHPExcel ワークシート上にチャート(グラフ)を作成する方法について(PHPExcel_Chart)
<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // PHPExcelオブジェクト作成 $objPHPExcel = new PHPExcel(); // ワークシートオブジェクト取得 $objWorksheet = $objPHPExcel->getActiveSheet(); // チャート用テストデータ生成 $objWorksheet->fromArray( array( array('売上' , 2016, 2017, 2018, 2019, 2020), array('商品1', 12, 15, 21, 18, 20), ) ); // X軸ラベルの指定 $arrCategorysDataSeries = array( new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$B$1:$F$1', NULL, 5), // 2016 to 2020 ); // 描画データの指定 $arrDataSeriesValues = array( new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$B$2:$F$2', NULL, 5), ); // チャート・データシリーズの生成 $objSeries = new PHPExcel_Chart_DataSeries( PHPExcel_Chart_DataSeries::TYPE_LINECHART, // plotType NULL, // plotGrouping range(0, count($arrDataSeriesValues) - 1), // plotOrder NULL, // plotLabel $arrCategorysDataSeries, // plotCategory $arrDataSeriesValues // plotValues ); // プロットエリアにチャート・データシリーズに設定 $objPlotArea = new PHPExcel_Chart_PlotArea(NULL, array($objSeries)); // チャート・タイトル生成 $objTitle = new PHPExcel_Chart_Title('売上データ'); // チャート生成 $objChart = new PHPExcel_Chart( 'chart1', // name $objTitle, // title NULL, // legend $objPlotArea, // plotArea TRUE, // plotVisibleOnly 0, // displayBlanksAs NULL, // xAxisLabel NULL // yAxisLabel ); // ワークシート内のチャート位置設定 $objChart->setTopLeftPosition('A6'); // 左上 $objChart->setBottomRightPosition('G18'); // 右下 // ワークシートにチャート追加 $objWorksheet->addChart($objChart); // [test-g-1.xlsx]:Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007"); $objWriter->setIncludeCharts(TRUE); $objWriter->save('test-g-1.xlsx'); exit(); ?>
出力されたエクセルファイルを見てみると以下の様になります。
このプログラムの51,52行目でチャート位置設定を行っていますが、 チャートオブジェクトの setTopLeftPosition、setBottomRightPosition メソッドの引数にはセル位置の後に X方向、Y方向 の引数があります。
メソッドの引数は以下の様に定義されています。public function setTopLeftPosition($cell, $xOffset = null, $yOffset = null) public function setBottomRightPosition($cell, $xOffset = null, $yOffset = null) $cell :セルアドレス $xOffset:X方向のオフセット(相対値:ピクセル値?) $yOffset:Y方向のオフセット(相対値:ピクセル値?)
X方向、Y方向のオフセットを設定してプログラムを直してみます。<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // PHPExcelオブジェクト作成 $objPHPExcel = new PHPExcel(); // ワークシートオブジェクト取得 $objWorksheet = $objPHPExcel->getActiveSheet(); // チャート用テストデータ生成 $objWorksheet->fromArray( array( array('売上' , 2016, 2017, 2018, 2019, 2020), array('商品1', 12, 15, 21, 18, 20), ) ); // X軸ラベルの指定 $arrCategorysDataSeries = array( new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$B$1:$F$1', NULL, 5), // 2016 to 2020 ); // 描画データの指定 $arrDataSeriesValues = array( new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$B$2:$F$2', NULL, 5), ); // チャート・データシリーズの生成 $objSeries = new PHPExcel_Chart_DataSeries( PHPExcel_Chart_DataSeries::TYPE_LINECHART, // plotType NULL, // plotGrouping range(0, count($arrDataSeriesValues) - 1), // plotOrder NULL, // plotLabel $arrCategorysDataSeries, // plotCategory $arrDataSeriesValues // plotValues ); // プロットエリアにチャート・データシリーズに設定 $objPlotArea = new PHPExcel_Chart_PlotArea(NULL, array($objSeries)); // チャート・タイトル生成 $objTitle = new PHPExcel_Chart_Title('売上データ'); // チャート生成 $objChart = new PHPExcel_Chart( 'chart1', // name $objTitle, // title NULL, // legend $objPlotArea, // plotArea TRUE, // plotVisibleOnly 0, // displayBlanksAs NULL, // xAxisLabel NULL // yAxisLabel ); // ワークシート内のチャート位置設定 $objChart->setTopLeftPosition('A6', 32, 10); // 左上 $objChart->setBottomRightPosition('G18', 32, 10); // 右下 // ワークシートにチャート追加 $objWorksheet->addChart($objChart); // [test-g-9-2.xlsx]:Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007"); $objWriter->setIncludeCharts(TRUE); $objWriter->save('test-g-9-2.xlsx'); exit(); ?>
オフセットはピクセルの値の様なので、左上、右下共にX方向は32ピクセルで、Y方向は10ピクセルにしました。
32ピクセル及び10ピクセルはセルの幅が64ピクセルで、高さが20ピクセルなので半分の値です。
出力されたエクセルファイルを見てみると以下の様になります。
指定された値の位置に行っている様な感じですが、右下が少し怪しいです。 ここは出力されたチャートの位置をみて微調整が必要かもしれません。
-
以前、セルの罫線を設定する処理で以下の様なスクリプトで行っていましたが、どうも罫線が出力されない様です。<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // PHPExcelオブジェクト作成 $objBook = new PHPExcel(); // ワークシートオブジェクト $objSheet = $objBook->getActiveSheet(); // スタイルオブジェクト取得([B2]セル) $objStyle = $objSheet->getStyle('B2'); // ボーダーオブジェクト取得([B2]セル) $objBorders = $objStyle->getBorders(); // ボーダー全て(Top, Bottom, Left, Right)を「細い線:BORDER_THICK」に設定 $objBorders->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THICK); $objBorders->getBottom()->setBorderStyle(PHPExcel_Style_Border::BORDER_THICK); $objBorders->getLeft()->setBorderStyle(PHPExcel_Style_Border::BORDER_THICK); $objBorders->getRight()->setBorderStyle(PHPExcel_Style_Border::BORDER_THICK); // [test12-1.xlsx]:Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objBook, "Excel2007"); $objWriter->save('test12-1.xlsx'); exit(); ?>
この処理では罫線が出力されないので、スタイルオブジェクトの applyFromArray() メソッドを使用することで 確実に処理できる様です。
このメソッドの引数は配列データですが、以下の様な指定をします。array( 'borders' => array( 'top' => array( 'style' => PHPExcel_Style_Border::BORDER_THIN // ボーダーの定数 ,['color' => array( 'rgb' => 'xxxxxx' ) ] // 色は未指定はデフォルト(黒) ), 'bottom' => array( 'style' => PHPExcel_Style_Border::BORDER_THIN ,['color' => array( 'rgb' => 'xxxxxx' ) ] ), 'left' => array( 'style' => PHPExcel_Style_Border::BORDER_THIN ,['color' => array( 'rgb' => 'xxxxxx' ) ] ), 'right' => array( 'style' => PHPExcel_Style_Border::BORDER_THIN ,['color' => array( 'rgb' => 'xxxxxx' ) ] ), ) )
それではこのメソッドを使って罫線を出力してみます。
<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // PHPExcelオブジェクト作成 $objBook = new PHPExcel(); // ワークシートオブジェクト $objSheet = $objBook->getActiveSheet(); // スタイルオブジェクト取得([B2]セル) $objStyle = $objSheet->getStyle('B2'); // 引き数 $arrStyle = array( 'borders' => array( 'top' => array( 'style' => PHPExcel_Style_Border::BORDER_THICK, 'color' => array( 'rgb' => 'ff0000' ) ), 'right' => array( 'style' => PHPExcel_Style_Border::BORDER_THICK, 'color' => array( 'rgb' => '00ff00' ) ), 'left' => array( 'style' => PHPExcel_Style_Border::BORDER_THICK, 'color' => array( 'rgb' => '0000ff' ) ), 'bottom' => array( 'style' => PHPExcel_Style_Border::BORDER_THICK, 'color' => array( 'rgb' => 'ff00ff' ) ) ) ); // セルの罫線スタイル設定 $objStyle->applyFromArray($arrStyle); // スタイルオブジェクト取得([B4:F4]セル) $objStyle = $objSheet->getStyle('B4:F4'); // セルの罫線スタイル設定 $objStyle->applyFromArray($arrStyle); // [test12-1.xlsx]:Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objBook, "Excel2007"); $objWriter->save('test12-1.xlsx'); exit(); ?>
出力されたエクセルファイルを見てみると以下の様になります。
尚 applyFromArray() の配列引数の中で、'top' 'right' 'left' 'bottom' が同一の指定であれば 'allborders' と指定することもできます。<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // PHPExcelオブジェクト作成 $objBook = new PHPExcel(); // ワークシートオブジェクト $objSheet = $objBook->getActiveSheet(); // スタイルオブジェクト取得([B2]セル) $objStyle = $objSheet->getStyle('B2'); // 引き数 $arrStyle = array( 'borders' => array( 'allborders' => array( 'style' => PHPExcel_Style_Border::BORDER_THICK, 'color' => array( 'rgb' => 'ff0000' ) ) ) ); // セルの罫線スタイル設定 $objStyle->applyFromArray($arrStyle); // スタイルオブジェクト取得([B4:F4]セル) $objStyle = $objSheet->getStyle('B4:F4'); // セルの罫線スタイル設定 $objStyle->applyFromArray($arrStyle); // [test12-1.xlsx]:Excel2007形式で保存する $objWriter = PHPExcel_IOFactory::createWriter($objBook, "Excel2007"); $objWriter->save('test12-2.xlsx'); exit(); ?>
出力されたエクセルファイルを見てみると以下の様になります。指定セルが全て同じ罫線の状態になります。
-
変数の整数型への変換を行う関数である intval について説明します。
■intval関数
先ずは intval 関数ですが以下の様な定義になっています。(PHP の正式な説明サイトより)
intval ( mixed $var [, int $base = 10 ] ) : int [説明] 変数の整数としての値を取得する。 指定された値 base を基数(デフォルトは 10)とする、var の int としての値を返します。 オブジェクトに intval() を使用することはできません。その場合は E_NOTICE レベルのエラーを発して 1 を返します。 [パラメータ ] $var :整数に変換する値(変数)。 $base :変換のための基数。 [返り値] 成功時は var の整数値、失敗時は 0。 空の配列の場合は 0、空でない配列の場合は 1 を返します。
それでは、簡単な例のスクリプトを以下に示します。<?php /* f3-intval-1.php */ // 文字列で数値として成り立つデータを設定 $data = "100"; // 整数変換 $intData = intval($data); // 結果を表示 var_dump($intData); </html>
これをWindowsコマンドプロンプトで実行すると以下の表示になります。
C:\xampp\htdocs\_test>php f3-intval-1.php int(100)
■intval関数を使った各種の例
isset関数を使った、いろんな場合に付いて調べてみます。
<?php /* f3-intval-2.php */ var_dump(intval(100)); // 整数 var_dump(intval(100.5)); // 浮動小数点数 var_dump(intval("100")); // 文字列の整数形式 var_dump(intval("100.5")); // 文字列の浮動小数点数形式 var_dump(intval("")); // 空文字列 echo "\n"; var_dump(intval(true)); // boolean:true var_dump(intval(false)); // boolean:false var_dump(intval(null)); // null echo "\n"; var_dump(intval(array())); // 空の配列 var_dump(intval(array("a", "b"))); // 中身のある配列 echo "\n"; var_dump(intval("abcd")); // 数値を表現しない文字列(半角) var_dump(intval("あいう")); // 数値を表現しない文字列(全角) </html>
これをWindowsコマンドプロンプトで実行すると以下の表示になります。 (... 以降は説明で付けただけです。)
C:\xampp\htdocs\_test>php f3-intval-2.php int(100) ... 整数 int(100) ... 浮動小数点数 int(100) ... 文字列の整数形式 int(100) ... 文字列の浮動小数点数形式 int(0) ... 空文字列 int(1) ... boolean:true int(0) ... boolean:false int(0) ... null int(0) ... 空の配列 int(1) ... 中身のある配列 int(0) ... 数値を表現しない文字列(半角) int(0) ... 数値を表現しない文字列(全角)
null が「0」に変換され、配列の中身の有り無しで「1」「0」が変換されるのが分かります。
また、一番注意が必要なのは数値を表現できない文字列は「0」変換されることです。 この性質を暗黙の了解的に使って「0」だからと処理をするのはあまり良くないと思われます。
(処理の結果か、もしくはバグでそうなることがありますが、なるべく避けるべきは。)
■intval関数とデータ型の注意点
intval 関数で返される値は int型 であり、文字列型のデータと比較する場合は注意が必要です。
以下に 比較演算子 による違いをスクリプトで示します。<?php /* f3-intval-3.php */ // Windowsコマンドプロンプトで[XAMPP]のPHPで表示を Shift-JIS にする為の設定 ob_start(function($buf){ return mb_convert_encoding($buf, 'SJIS', 'UTF-8'); }); // 数字で数値を宣言 $strData = "100"; // int型数値に変換 $intData = intval($strData); // 単なる比較 echo "単なる比較 : "; if ($strData == $intData) { echo "データは一致する。\n"; } else { echo "データは一致しない。\n"; } // データ型も含めた比較 echo "データ型も含めた比較 : "; if ($strData === $intData) { echo "データは一致する。\n"; } else { echo "データは一致しない。\n"; } ?>
これをWindowsコマンドプロンプトで実行すると以下の表示になります。
C:\xampp\htdocs\_test>php f3-intval-3.php 単なる比較 : データは一致する。 データ型も含めた比較 : データは一致しない。
ここで 比較演算子 の動きについて注意が必要で、 比較演算子 の 前 と 後 が共に数値形式の文字列の場合、 または、どちらか一方が数値形式の文字列の場合に、数値に変換して比較が行われます。 このため、上記の例で「$strData」は文字列の "100" ですが、数値の 100 として扱われ、比較が行われた結果、等しいものと判断されます。
但し、「===」「!==」の 比較演算子 はデータ型を含めての比較になるため、上記では等しくないと判断されます。
以下に 比較演算子 「==」の例を示します。<?php /* f3-intval-4.php */ var_dump( 100 == "100" ); var_dump( 100 == "00100" ); var_dump( 100 == " 100" ); var_dump( 100 == "100.5" ); var_dump( 0 == "aaa" ); ?>
これをWindowsコマンドプロンプトで実行すると以下の表示になります。
C:\xampp\htdocs\_test>php f3-intval-4.php bool(true) bool(true) bool(true) bool(false) bool(true)
文字列の部分が数値に変換されて判定されているのが分かります。最後の "aaa" は「0」に変換されるので等しくなります。
ところで、この数値への変換は 比較演算子 の他に switch でも行われるので更に注意が必要です。 以下のスクリプトを見て下さい。<?php /* f3-intval-5.php */ // Windowsコマンドプロンプトで[XAMPP]のPHPで表示を Shift-JIS にする為の設定 ob_start(function($buf){ return mb_convert_encoding($buf, 'SJIS', 'UTF-8'); }); // 仮の swicth の判定値の宣言 $strSwicth = "a"; // 文字列のみの判断 switch ($strSwicth) { case "a": echo 'swicth で「"a"」の判断'."\n"; break; case "b": echo 'swicth で「"b"」の判断'."\n"; break; } // 最初に数値[0]の判断後、文字列の判断 switch ($strSwicth) { case 0: echo 'swicth で「0」の判断'."\n"; break; case "a": echo 'swicth で「"a"」の判断'."\n"; break; case "b": echo 'swicth で「"b"」の判断'."\n"; break; } ?>
これをWindowsコマンドプロンプトで実行すると以下の表示になります。
C:\xampp\htdocs\_test>php f3-intval-5.php swicth で「"a"」の判断 swicth で「0」の判断
最初の switch 文では 「case "a":」の所でヒットしますが、 2番目の switch 文では 「case 0:」のところで判定する値が数値なので「$strSwicth」を数値変換し "a" は数値ではないので「0」に変換され そのためそこでヒットする様になります。
-
変数の存在チェックを行う関数である isset 及び、変数の割り当てを解除する unset について説明します。
■isset関数
先ずは isset 関数ですが以下の様な定義になっています。(PHP の正式な説明サイトより)
isset ( mixed $var , mixed ...$vars ) : bool [説明] 変数が宣言されていること、そして null とは異なることを検査します。 [パラメータ ] $var :チェック対象変数。 $vars :その他のチェック対象変数。 [返り値] 変数が存在し null でなければ true、それ以外は false を返す。 変数が複数指定された場合は、全ての変数が存在し null でなければ true、それ以外は false を返す。
それでは、簡単な例のスクリプトを以下に示します。 (尚、3行目の設定はWindowsコマンドプロンプトでの実行時に、コンソールへの出力を Shift-JIS にする為のものです)<?php /* f1-isset-1.php */ // Windowsコマンドプロンプトで[XAMPP]のPHPで表示を Shift-JIS にする為の設定 ob_start(function($buf){ return mb_convert_encoding($buf, 'SJIS', 'UTF-8'); }); // 変数が宣言されていない状況でチェック if (isset($data) == true) { echo "\$data は宣言されています。\n"; } else { echo "\$data は宣言されていないか null です。\n"; } // 変数を宣言した状況でチェック $data = "test"; if (isset($data) == true) { echo "\$data は宣言されています。\n"; } else { echo "\$data は宣言されていないか null です。\n"; } // 変数を null 設定した状況でチェック $data = null; if (isset($data) == true) { echo "\$data は宣言されています。\n"; } else { echo "\$data は宣言されていないか null です。\n"; } </html>
これをWindowsコマンドプロンプトで実行すると以下の表示になります。
C:\xampp\htdocs\_test>php f2-isset-1.php $data は宣言されていないか null です。 $data は宣言されています。 $data は宣言されていないか null です。
さらに、関数パラメータには配列も指定することで、配列にキー値で指定された要素の存在チェックが確認できます。 以下のその例を示します。
<?php /* f2-isset-2.php */ // Windowsコマンドプロンプトで[XAMPP]のPHPで表示を Shift-JIS にする為の設定 ob_start(function($buf){ return mb_convert_encoding($buf, 'SJIS', 'UTF-8'); }); // 配列を宣言 $arr = array(0 => "11111", // KEY:数値 "key1" => "22222", // KEY:文字列 "key2" => array("test" => "abcdef")); // KEY:文字列で入れ子で配列 // 存在する数値KEYのチェック if (isset($arr[0]) == true) { echo '$arr[0] は宣言されています。'."\n"; } else { echo '$arr[0] は宣言されていないか null です。'."\n"; } // 存在しない数値KEYのチェック if (isset($arr[1]) == true) { echo '$arr[1] は宣言されています。'."\n"; } else { echo '$arr[1] は宣言されていないか null です。'."\n"; } // 存在する文字列KEYのチェック if (isset($arr["key1"]) == true) { echo '$arr["key1"] は宣言されています。'."\n"; } else { echo '$arr["key1"] は宣言されていないか null です。'."\n"; } // 存在しない文字列KEYのチェック if (isset($arr["key0"]) == true) { echo '$arr["key0"] は宣言されています。'."\n"; } else { echo '$arr["key0"] は宣言されていないか null です。'."\n"; } // 入れ子で配列の存在する文字列KEYのチェック if (isset($arr["key2"]["test"]) == true) { echo '$arr["key2"]["test"] は宣言されています。'."\n"; } else { echo '$arr["key2"]["test"] は宣言されていないか null です。'."\n"; } // 入れ子で配列の存在しない文字列KEYのチェック if (isset($arr["key2"]["test1"]) == true) { echo '$arr["key2"]["test1"] は宣言されています。'."\n"; } else { echo '$arr["key2"]["test1"] は宣言されていないか null です。'."\n"; } // 変数を null 設定した状況でチェック $arr["key2"]["test"] = null; if (isset($arr["key2"]["test"]) == true) { echo '$arr["key2"]["test"] は宣言されています。'."\n"; } else { echo '$arr["key2"]["test"] は宣言されていないか null です。'."\n"; } </html>
これをWindowsコマンドプロンプトで実行すると以下の表示になります。
C:\xampp\htdocs\_test>php f2-isset-2.php $arr[0] は宣言されています。 $arr[1] は宣言されていないか null です。 $arr["key1"] は宣言されています。 $arr["key0"] は宣言されていないか null です。 $arr["key2"]["test"] は宣言されています。 $arr["key2"]["test1"] は宣言されていないか null です。 $arr["key2"]["test"] は宣言されていないか null です。
■isset関数を使った例(HTMLのFORMタグでのPOST送信)
isset 関数を使用する例ですが以下の様な、 HTMLページの中に TEXTBOX を設置し SUBMIT ボタンで POST送信する時のデータ取得があります。 POST送信で PHP 側での受け取りは $_POST 変数から行います。
isset で $_POST をチェックするのは、最初にこのスクリプトが呼ばれた場合と、 SUBMIT ボタンを押下することで自分自身を呼出した場合の仕訳を行うためです。
最初にこのスクリプトが呼ばれた場合 $_POST にはデータが存在しませんが、 SUBMIT ボタンを押下した場合に from タグの中身が自分自身にPOSTされてきます。 それで isset でチェックしてデータを取得しています。<?php /* f2-isset-3.php */ // 受信データ変数初期化 $strName = ""; $strZipno = ""; $strAddr = ""; // $POSTから取得 if((isset($_POST['pname']) == true) && ($_POST['pname'] != "")){ $strName = trim($_POST['pname']); } if((isset($_POST['zipno']) == true) && ($_POST['zipno'] != "")){ $strZipno = trim($_POST['zipno']); } if((isset($_POST['addr']) == true) && ($_POST['addr'] != "")){ $strAddr = trim($_POST['addr']); } ?> <html> <head> <meta charset="utf-8"> <title>問合せ・個人情報</title> </head> <body> <h1>問合せ・個人情報</h1> <form name="enqform" action="enq1.php" method="post"> 名前 :<input type="text" name="pname" maxlength="20" value="<?php echo $strName; ?>" /><br /> 郵便番号:<input type="text" name="zipno" maxlength="8" value="<?php echo $strZipno; ?>" /><br /> 住所 :<input type="text" name="addr" maxlength="30" value="<?php echo $strAddr; ?>" /><br /> <input type="submit" value="送信" /> </form> </body> </html>
■unset関数
unset 関数ですが以下の様な定義になっています。
unset ( mixed $var , mixed ...$vars ) : void [説明] unset() は指定した変数を破棄します。 [パラメータ ] $var :破棄する変数。 $vars :その他のチェック対象変数。
以下にunset 関数を使用した例のスクリプトを示します。
<?php /* f2-unset-1.php */ // Windowsコマンドプロンプトで[XAMPP]のPHPで表示を Shift-JIS にする為の設定 ob_start(function($buf){ return mb_convert_encoding($buf, 'SJIS', 'UTF-8'); }); // 変数宣言 $data = "111"; // 変数チェック if (isset($data) == true) { echo '$data は宣言されています。'."\n"; } else { echo '$data は宣言されていないか null です。'."\n"; } // 変数廃棄 unset($data); // 変数チェック if (isset($data) == true) { echo '$data は宣言されています。'."\n"; } else { echo '$data は宣言されていないか null です。'."\n"; } ?>
これをWindowsコマンドプロンプトで実行すると以下の表示になります。
C:\xampp\htdocs\_test>php f2-unset-1.php $data は宣言されています。 $data は宣言されていないか null です。
尚、unset 関数は配列の要素に対しても廃棄処理ができますので、その例としてのスクリプトを示します。
<?php /* f2-unset-2.php */ // 配列を宣言 $arr = array(0 => "11111", // KEY:数値 1 => "aaaaa", // KEY:数値 "key1" => "22222", // KEY:文字列 "key2" => array("test1" => "abcdef", // KEY:文字列で入れ子で複数配列 "test2" => "wwwwww"), "key3" => array("test" => "abcdef")); // KEY:文字列で入れ子で配列 // 最初に変数内部表示 print_r($arr); // 数値キーの廃棄 unset($arr[1]); // 文字列キーの廃棄 unset($arr["key1"]); // 子配列の廃棄1 unset($arr["key2"]["test1"]); // 子配列の廃棄2 unset($arr["key3"]["test"]); // 変数内部表示 print_r($arr); ?>
これをWindowsコマンドプロンプトで実行すると以下の表示になります。
C:\xampp\htdocs\_test>php f2-unset-2.php Array ( [0] => 11111 [1] => aaaaa [key1] => 22222 [key2] => Array ( [test1] => abcdef [test2] => wwwwww ) [key3] => Array ( [test] => abcdef ) ) Array ( [0] => 11111 [key2] => Array ( [test2] => wwwwww ) [key3] => Array ( ) )
配列の中の対応するキー値が削除されているのが分かると思います。