В первую очередь, немного полезных ссылок:
- https://htmlweb.ru/php/function/fgetcsv.php – Описание функции разбора строки из CSV файла в массив.
- http://www.php.su/articles/?cat=fs&page=005 – Работа с файлами в php
- https://php.net/manual/ru/ref.array.php – Описание основных базовых функций работы с массивами в PHP. Очень важная страничка.
- http://dev.1c-bitrix.ru/api_help/ – Документация по большей части классов, методов и всего остального в Битриксе. В данном случае указано потому,
что вся эта конитель с CSV требуется для кастомной интеграции с 1С. Короче чтобы не забыть, где и что лежит.
И так, у нас имеется .csv файл с некоторым заведомо корректным содержимым (корретный csv файл). Задача следующая - написать такую функцию (а может быть и класс), который бы приобразовывал входной csv файл в многомерный массив, эелементами которого были бы массивы, каждый из которых в свою очередь содержал бы n-ое количество записей в соответствии с кол-вом столбцов в файле, а в качестве ключей этих записей должны находиться заголовки столбцов, если первоя строка содержит заголовки, или просто порядковый номер столбца, если заголовки отсутсвутют. И так, поехали.
Перво-наперво нам нужно открыть наш файл на чтение. Давайте условимся, что требованием нашего скрипта является нахождение файла в папке import, которая находится в той же папке, что и скрипт.
function getArrayFromCSV($filename = null, $has_names = true, $determiner = ";"){
$fp = fopen('import/' . $filename, 'r');
if(!$filename){
echo 'Не задано имя файла';
return null;
}
if(!$determiner){
$determiner = ';';
}
if($fp){
$arrResult = Array(); //результирующий массив
$arrTemplate = Array(); // массив с именами столбцов
$row = 0; //счетчик строк
while (($data = fgetcsv($fp, 1000, $determiner)) !== FALSE) {
$num = count($data); //количество элементов в строке
if($has_names) {
if($row == 0){
$arrTemplate = $data;
} else {
$arr = array();
for($i=0; $i<count($data); $i++){
$arr[$arrTemplate[$i]] = $data[$i];
}
$arrResult[] = $arr;
}
} else {
$arr = array();
for($i=0; $i<count($data); $i++){
$arr[] = $data[$i];
}
$arrResult[] = $arr;
}
$row++;
}
return $arrResult;
} else {
echo 'Не найден файл';
return null;
}
}
Собтсвенно у функции getArrayFromCSV есть три параметра:
$filename — имя csv файла для разбора. Обязательный параметр.
$has_names — необязательный параметр. Указывает, содержит ли первая строка имена столбцов или нет. true - содержит. false - нет. По умолчанию true
$determiner — необязательный параметр. Разделитель текста для распаршивания файла. Поумолчанию точка с запятой
Результатом работы функции будет ассоциативный массив массивов либо null в случае ошибки.
Если файл в качестве первой строки таблицы содержит имена столбцов, то тогда эти имена будут ключами к соответствующим значениям в массивах.