PHP csv_to_array и array_combine
Я не могу вспомнить, где я нашел эту функцию csv_to_array, но до недавнего времени я без проблем использовал ее.
function csv_to_array($filename, $delimiter=',', $enclosure='"', $escape = '\\') {
if(!file_exists($filename) AND !is_readable($filename)) {echo "File does not exist or is not readable."; return false;}
$header = null;
$values = array();
$data = array();
$lines = file($filename);
foreach($lines as $line) {
$values = str_getcsv($line, $delimiter, $enclosure, $escape);
$values = array_map('trim', $values);
if(!$header) {$header = $values;
var_dump($header);
echo "<br><br>";
var_dump($values);
echo "<br><br>";
}
else $data[] = array_combine($header, $values);
}
return $data;
}
Теперь я получаю ошибку "array_combine(): оба параметра должны иметь равное количество элементов", но я не могу понять, как строки одного и того же CSV появляются с разным количеством столбцов. Несколько столбцов содержат изрядное количество текста, включая запятые, и я отформатировал эти столбцы как ТЕКСТ, чтобы вокруг них были кавычки, я взял CSV, переименовал его в файл TXT и импортировал обратно в Excel, и все строки кажутся чтобы иметь правильное количество столбцов. Если бы они этого не сделали, это было бы очевидно, поскольку данные в столбцах колеблются.
Я заметил в файле, что двойные кавычки в столбцах TEXT экранированы другой двойной кавычкой. В функции написано, что escape - это \, поэтому я выполнил поиск и заменил "" > \", но это не повлияло.
Раздел var_dump выводит две строки массива. Я перешел к строке 45 в CSV и не увидел ничего необычного.
array(46) { [0]=> string(6) "PartNo" [1]=> string(7) "Company" [2]=> string(6) "Status" [3]=> string(10) "DateEdited" [4]=> string(8) "Comments" [5]=> string(6) "Photos" [6]=> string(11) "VehicleType" [7]=> string(4) "Make" [8]=> string(5) "Model" [9]=> string(9) "BodyStyle" [10]=> string(9) "Driveline" [11]=> string(10) "LiftHeight" [12]=> string(7) "MaxTire" [13]=> string(9) "YearStart" [14]=> string(7) "YearEnd" [15]=> string(9) "Trademark" [16]=> string(6) "Series" [17]=> string(8) "Category" [18]=> string(11) "SubCategory" [19]=> string(12) "3SubCategory" [20]=> string(18) "AssociatedComments" [21]=> string(8) "Max 2000" [22]=> string(11) "Application" [23]=> string(8) "Max 2000" [24]=> string(11) "Daystar App" [25]=> string(12) "ExtendedDesc" [26]=> string(7) "Max 240" [27]=> string(13) "MarketingDesc" [28]=> string(8) "Max 2000" [29]=> string(16) "FeaturesBenefits" [30]=> string(3) "MAP" [31]=> string(4) "MSRP" [32]=> string(14) "PriceEffective" [33]=> string(11) "DateUpdated" [34]=> string(3) "UPC" [35]=> string(9) "BoxLength" [36]=> string(8) "BoxWidth" [37]=> string(9) "BoxHeight" [38]=> string(9) "BoxWeight" [39]=> string(5) "Color" [40]=> string(7) "Country" [41]=> string(6) "Carded" [42]=> string(9) "ScheduleB" [43]=> string(0) "" [44]=> string(14) "In Development" [45]=> string(12) "Discontinued" }
array(46) { [0]=> string(6) "PartNo" [1]=> string(7) "Company" [2]=> string(6) "Status" [3]=> string(10) "DateEdited" [4]=> string(8) "Comments" [5]=> string(6) "Photos" [6]=> string(11) "VehicleType" [7]=> string(4) "Make" [8]=> string(5) "Model" [9]=> string(9) "BodyStyle" [10]=> string(9) "Driveline" [11]=> string(10) "LiftHeight" [12]=> string(7) "MaxTire" [13]=> string(9) "YearStart" [14]=> string(7) "YearEnd" [15]=> string(9) "Trademark" [16]=> string(6) "Series" [17]=> string(8) "Category" [18]=> string(11) "SubCategory" [19]=> string(12) "3SubCategory" [20]=> string(18) "AssociatedComments" [21]=> string(8) "Max 2000" [22]=> string(11) "Application" [23]=> string(8) "Max 2000" [24]=> string(11) "Daystar App" [25]=> string(12) "ExtendedDesc" [26]=> string(7) "Max 240" [27]=> string(13) "MarketingDesc" [28]=> string(8) "Max 2000" [29]=> string(16) "FeaturesBenefits" [30]=> string(3) "MAP" [31]=> string(4) "MSRP" [32]=> string(14) "PriceEffective" [33]=> string(11) "DateUpdated" [34]=> string(3) "UPC" [35]=> string(9) "BoxLength" [36]=> string(8) "BoxWidth" [37]=> string(9) "BoxHeight" [38]=> string(9) "BoxWeight" [39]=> string(5) "Color" [40]=> string(7) "Country" [41]=> string(6) "Carded" [42]=> string(9) "ScheduleB" [43]=> string(0) "" [44]=> string(14) "In Development" [45]=> string(12) "Discontinued" }
Когда я заменяю CSV, над которым я работаю, на CSV, который я использовал последним, я не получаю ошибку array_combine. CSV похожи, но содержат много разных данных.
Я не понимаю, как я могу это понять.
Какие-нибудь мысли?
Спасибо Майк