PHP oferuje już 99,9%, co jest potrzebne w ciągu SplFileObject
, dodać brakujące 0,1% rozciągający się od niego. W poniższym przykładzie CSVFile
rozciąga się z niego:
$csv = new CSVFile('../data/test.csv');
foreach ($csv as $line)
{
var_dump($line);
}
Z Twojego przykład danych:
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
jest zdefiniowana jako następujące:
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;
}
}
Jeśli zrobisz to w ten sposób, tym szczegóły są ładnie zamknięte. Ponadto łatwiej jest radzić sobie z błędami (np. Z niezgodnością liczników) wewnątrz funkcji current()
, więc kod, który wykorzystuje dane, nie musi się z nimi obchodzić.
Edit:
Jednak Przykład podany jest krótki w zakresie ponownego użyteczność swoich. Zamiast rozciągający się od SplFileObject to o wiele lepiej, aby je zsumować:
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;
}
}
Kod jest identyczne ale szczegóły, które zostały zamknięte w konstruktorze są opuszczone. Ta redukcja pozwala na szersze wykorzystanie tego typu, np.z (ale nie tylko) wspomniany SplFileObject:
$file = new SplFileObject('../data/test.csv');
$file->setFlags($file::READ_CSV);
$csv = new KeyedArrayIterator($file);
foreach ($csv as $line) {
var_dump($line);
}
Jeśli to teraz brzmi zbyt rozwlekły, że znowu może być owinięty dać go ponownie ładniejszy elewacji:
class CSVFile extends KeyedArrayIterator
{
/**
* @param string $file
*/
public function __construct($file)
{
parent::__construct(new SplFileObject($file));
$this->setFlags(SplFileObject::READ_CSV);
}
}
Dzięki Standardowa zdolność do dekorowania: TraversableIterator, oryginalny kod konstruktora z pierwszego przykładu CSVFile może być skopiowany w 100%.
Ten ostatni dodatek pozwala również zachować oryginalny kod wykorzystuje się CSVFile Iterator nienaruszone:
$csv = new CSVFile('../data/test.csv');
foreach ($csv as $line) {
var_dump($line);
}
więc tylko szybkie refaktoryzacji w celu umożliwienia więcej kodu-ponownego użycia. Dostajesz KeyedArrayIterator za darmo.
zapewne na myśli 2500 w drugim przykładzie tablicy – user1899415