PHP は 内で必要なものの 99.9% をすでに提供していますSplFileObject
。不足している 0.1% を拡張して追加します。次の例CSVFile
では、それを拡張しています。
$csv = new CSVFile('../data/test.csv');
foreach ($csv as $line)
{
var_dump($line);
}
あなたのサンプルデータで:
array(3) {
["Make"]=> string(5) "Chevy"
["Model"]=> string(4) "1500"
["Note"]=> string(6) "loaded"
}
array(3) {
["Make"]=> string(5) "Chevy"
["Model"]=> string(4) "2500"
["Note"]=> string(0) ""
}
array(3) {
["Make"]=> string(5) "Chevy"
["Model"]=> string(0) ""
["Note"]=> string(6) "loaded"
}
CSVFile
は次のように定義されます。
class CSVFile extends SplFileObject
{
private $keys;
public function __construct($file)
{
parent::__construct($file);
$this->setFlags(SplFileObject::READ_CSV);
}
public function rewind()
{
parent::rewind();
$this->keys = parent::current();
parent::next();
}
public function current()
{
return array_combine($this->keys, parent::current());
}
public function getKeys()
{
return $this->keys;
}
}
このようにすると、詳細がうまくカプセル化されます。さらに、関数内でエラー (カウントの不一致など) を処理するのがより簡単にcurrent()
なるため、データを使用するコードはそれを処理する必要がありません。
編集:
ただし、与えられた例は、再利用性の点で短いものです。SplFileObjectから拡張する代わりに、それを集約する方がはるかに優れています。
class KeyedArrayIterator extends IteratorIterator
{
private $keys;
public function rewind()
{
parent::rewind();
$this->keys = parent::current();
parent::next();
}
public function current()
{
return array_combine($this->keys, parent::current());
}
public function getKeys()
{
return $this->keys;
}
}
コードは同じですが、コンストラクターにカプセル化された詳細は省略されています。この縮小により、型をより広く使用することができます。たとえば、前述のSplFileObjectと一緒に (ただし、それだけでなく) :
$file = new SplFileObject('../data/test.csv');
$file->setFlags($file::READ_CSV);
$csv = new KeyedArrayIterator($file);
foreach ($csv as $line) {
var_dump($line);
}
これが冗長すぎるように聞こえる場合は、もう一度ラップして、より良いファサードを与えることができます。
class CSVFile extends KeyedArrayIterator
{
/**
* @param string $file
*/
public function __construct($file)
{
parent::__construct(new SplFileObject($file));
$this->setFlags(SplFileObject::READ_CSV);
}
}
TraversableIteratorの標準的な装飾機能のおかげで、 CSVFileの最初の例の元のコンストラクター コードを100% コピーすることができました。
この最後の追加により、CSVFile Iteratorを使用する元のコードをそのまま維持することもできます。
$csv = new CSVFile('../data/test.csv');
foreach ($csv as $line) {
var_dump($line);
}
したがって、より多くのコードを再利用できるようにするための簡単なリファクタリングです。無料でKeyedArrayIteratorを取得できます。