पीएचपी आप SplFileObject
भीतर की आवश्यकता है उसका पहले से ही 99,9% प्रदान करता है, आप इसे से बढ़ा कर लापता 0,1% जोड़ें। निम्न उदाहरण में CSVFile
यह तक फैली हुई है:
$csv = new CSVFile('../data/test.csv');
foreach ($csv as $line)
{
var_dump($line);
}
अपने उदाहरण डेटा के साथ
:
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;
}
}
आप इसे इस तरह करते हैं,:
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
के रूप में परिभाषित किया गया है निम्नलिखित विवरण अच्छी तरह से encapsulated दूर हैं। इसके अतिरिक्त current()
फ़ंक्शन के अंदर त्रुटियों (जैसे गिनती मेल नहीं) के साथ सौदा करना अधिक आसान है, इसलिए डेटा का उपयोग करने वाले कोड को इससे निपटने की आवश्यकता नहीं है।
संपादित करें:
हालांकि उदाहरण दिया फिर से 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:
class CSVFile extends KeyedArrayIterator
{
/**
* @param string $file
*/
public function __construct($file)
{
parent::__construct(new SplFileObject($file));
$this->setFlags(SplFileObject::READ_CSV);
}
}
के लिए धन्यवाद:
$file = new SplFileObject('../data/test.csv');
$file->setFlags($file::READ_CSV);
$csv = new KeyedArrayIterator($file);
foreach ($csv as $line) {
var_dump($line);
}
है कि अब भी अत्यधिक शब्द लगता है, इसे फिर से इसे फिर से एक अच्छे मुखौटा देने के लिए लपेटा जा सकता है मानक सजावट-क्षमता ट्रैवर्सबल इटरेटर, के पहले उदाहरण से मूल कन्स्ट्रक्टर कोड CSVFile को केवल 100% कॉपी किया जा सकता है।
$csv = new CSVFile('../data/test.csv');
foreach ($csv as $line) {
var_dump($line);
}
तो बस एक त्वरित रिफैक्टरिंग अधिक कोड-पुन: उपयोग की अनुमति के लिए:
यह पिछले इसके अलावा यह भी कहा कि का उपयोग करताCSVFile इटरेटर बरकरार मूल कोड रखने के लिए अनुमति देता है। आपको KeyedArrayIterator मुफ्त में मिलता है। इस कोड के साथ
आप शायद मतलब 2500 दूसरी सरणी उदाहरण में – user1899415