В первую очередь, немного полезных ссылок:
- 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 в случае ошибки.
Если файл в качестве первой строки таблицы содержит имена столбцов, то тогда эти имена будут ключами к соответствующим значениям в массивах.