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()
, поэтому код, который использует данные, не нуждается в том, чтобы справляться с этим.
Edit:
Однако приведенный пример короток с точкой зрения повторного usablity. Вместо того, простирающейся от 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 итератора нетронутым:
$csv = new CSVFile('../data/test.csv');
foreach ($csv as $line) {
var_dump($line);
}
Так просто быстрый рефакторинга, чтобы больше кодовую повторного использования. Вы получаете бесплатно KeyedArrayIterator.
вы, вероятно, означает, 2500 во втором примере массива – user1899415