[PHP] PHPでExcel処理

PHPSpreadSheet

PHPからExcelファイルの読み書きをするには、PHPExcelの後継となっているPHPSpreadSheetを使うのが一般的だろうか。

https://phpspreadsheet.readthedocs.io/en/develop/

PHPSpreadSheetを使って、Excelファイルを読み込んで、CSVファイルに書き出す簡単な例は以下のようになる。

excel_test.php
<?php

require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Reader\Xlsx as Reader;
use PhpOffice\PhpSpreadsheet\Shared\Date;

$reader = new Reader();
$spreadsheet = $reader->load('test.xlsx');

$sheet = $spreadsheet->getSheetByName('Sheet1');

$highest =  $sheet->getHighestRow();
for ($i = 1; $i <= $highest; $i++) {
  echo $sheet->getCellByColumnAndRow(1, $i)->getValue() . ",";
  echo $sheet->getCellByColumnAndRow(2, $i)->getValue() . ",";
  echo $sheet->getCellByColumnAndRow(3, $i)->getValue() . ",";
  echo (Date::excelToDateTimeObject($sheet->getCellByColumnAndRow(4, $i)->getValue())->format('Y-m-d H:i:s')) . PHP_EOL;
}

[PHP] Embed SAPIでCからPHPを呼び出してみる その3

[PHP] Embed SAPIでCからPHPを呼び出してみる その2では、zend_eval_stringlを使って、文字列をPHPスクリプトとして解釈、実行してみた。
今度は定義済みのPHP関数をCから呼び出してみよう。

※今回も同様に、Linux上で、PHP 7.1.1を使った例。

全体

CからPHPの定義済み関数を呼び出すにはcall_user_functionを使う。

[PHP] Embed SAPIでCからPHPを呼び出してみる その2

[PHP] Embed SAPIでCからPHPを呼び出してみる その1では、PHPのファイルパスをSAPIに渡すことによって、PHPスクリプトをCから実行してみた。
今度はPHPファイルを介さずに直接、文字列をPHPスクリプトとして実行してみよう。

※今回も同様に、Linux上で、PHP 7.1.1を使った例。

eval

PHPの関数に文字列をそのままPHPスクリプトとして解釈するevalという関数があるけど、それと同じようにCから文字列をevalするにはzend_eval_stringlを使う。

例えば、"2 + 3;"をPHPスクリプトとして解釈、実行させるには以下のようにする。

[PHP] Embed SAPIでCからPHPを呼び出してみる その1

[Java,JNI]JNIでクラス検索するときのパッケージ名 では、CからJVMを起動してみたけど、今度はCからPHPを呼び出してみよう。

Linux上で、PHP 7.1.1を使った例。

Embed SAPI

Cから直接PHPを呼び出すためにはEmbed SAPIを使う。
SAPIというのはServer APIと呼ばれるもので、実際にPHPのスクリプトを解釈する部分と実行環境の橋渡しをする。
PHPスクリプトがWebサーバから呼び出されたり、コマンドラインから呼び出されたりすると、SAPIが異なる状態で、呼び出されることになる。

http://php.net/manual/ja/function.php-sapi-name.php

[PHP] 遅延静的束縛

Pythonでは

[Python] classメソッドとstaticメソッドでは、Pythonでのclassメソッドとstaticメソッドを見た。

同じようなことがPHPでもできないだろうか。

PHPでは

PHPでは、遅延静的束縛なんていう仰々しい名前の機能で、これに近いことができる。

http://php.net/manual/ja/language.oop5.late-static-bindings.php

Pythonの場合はメソッド自体をclassメソッドにしたり、staticメソッドにしたりしたけど、PHPでは静的コンテキストでクラスを参照する時にself::とstatic::を使い分ける。

[PHP] PHPでの日付文字列パースと要素取り出し

PHPで日付文字列をパースして、そこから曜日を算出する必要があった。
こんなの簡単だろと思ってたんだけど、いくつか気をつける点があったので、メモ。

strptime

まずはstrptimeを使って、こんな感じにした。
$d = (strptime("20180507", "%Y%m%d"));
var_dump($d);

[Java] SQLExceptionのgetNextExceptionとiteratorの違い

SQLExceptionを補足した時にチェーンされた例外

SQLExceptionを補足した時にチェーンされた例外をすべて見たかったんだけど、getNextExceptionで戻り値がnullになるまでループするのと、iteratorでループするのでは取得される例外が異なるみたい。

https://docs.oracle.com/javase/jp/8/docs/api/java/sql/SQLException.html
        ...
    } catch (SQLException e) {
        for (Throwable t : e) {
            ...
        }
    }
        ...
    } catch (SQLException e) {
        for (SQLException sqle = e; sqle != null; sqle = sqle.getNextException()) {
            ...
        }
    }