Виняток із вказаного вами повідомлення про помилку спрацьовує саме в одному місці (код злегка урізаний для читабельності):
final public function __construct($source)
{
$this->_source = $source;
$this->_init();
// validate column names consistency
if (is_array($this->_colNames) && !empty($this->_colNames)) {
$this->_colQuantity = count($this->_colNames);
if (count(array_unique($this->_colNames)) != $this->_colQuantity) {
Mage::throwException(Mage::helper('importexport')->__('Column names have duplicates'));
}
}
}
Це означає, що count(array_unique($this->_colNames))
має бути неоднаковим$this->_colQuantity
$_colNames
Масиву встановлюються в Mage_ImportExport_Model_Import_Adapter_Csv::rewind()
(який викликається в процесі _init()
.
Ще раз, код трохи обрізаний для зручності читання:
public function rewind()
{
// rewind resource, reset column names, read first row as current
rewind($this->_fileHandler);
$this->_colNames = fgetcsv($this->_fileHandler, null, $this->_delimiter, $this->_enclosure);
}
Встановлено $_delimiter
значення ,
, $_enclosure
встановлено значення "
.
Щоб спробувати відтворити проблему, якщо я скопіюю CSV-витяг із вашого запитання у файл під назвою test.csv та запустіть такий код:
$f = fopen('test.csv', 'r');
$names = fgetcsv($f, null, ',', '"');
$qty = count($names);
$uniqueQty = count(array_unique($names));
printf("%d records, %d unique records\n", $qty, $uniqueQty);
він дає такий вихід:
29 records, 29 unique records
Це означає, що ваш файл CSV в принципі добре. Різниця повинна бути десь в іншому місці.
Дивлячись на те, як array_unique
працює, є примітка про те, як обробка типів елементів масиву змінилася в PHP 5.2.9: http://php.net/manual/en/function.array-unique.php#refsect1-function.array-unique -changelog
Щоб відтворити проблему, я повторно запустив свій тестовий скрипт із SORT_REGULAR
набором параметрів, але це все одно дає такий же результат (що логічно, оскільки читання файлу може дати лише рядкові значення).
На даний момент я вважаю, що різниця повинна бути у файлі CSV, який ви використовуєте. У команді розпізнаються символи ( \n
і \r\n
) для Unix та Windows Newline ( та ) fgetcsv()
, але старий символ нового рядка стилю MacOS ( \r
) фактично призведе до поведінки, яку ви відчуваєте.
Я не можу знати, чи з цієї причини у вас виникають проблеми, але я пропоную вам переглянути файл CSV (ще раз). Це також може допомогти, якщо ви надаєте посилання для завантаження десь до немодифікованого файлу (без пастіна), тому будь-які символи, що не друкуються, зберігаються.
Це також може допомогти, якщо ви опублікуєте використовувану версію PHP.