Intereting Posts
Обозначение phpDoc для указания типа возврата, идентичного типу параметра Обновление вывода командной строки, то есть для прогресса Преобразование сокращений чисел (5.2k, 1.7m и т. Д.) В действительные целые числа с PHP PHP IDE – хотите синхронизировать локальное хранилище с FTP html не распечатывает способ, которым я его ожидаю в источнике веб-страницы Страница выполнения php Curl дает результат сбой Использование href onclick для обновления div без перезагрузки страницы? Как продлить класс Аура-гвардии Ларавеля? Оператор сравнения «==» в путанице PHP Триггер не распознает таблицу (Trigger для разбиения содержимого NEW.values ​​на несколько строк для вставки в другую таблицу) Как перенести список жанров в SQL в отдельную базу данных как я могу вывести rowName на основе таблицы ссылок? PHP unserialize продолжает бросать одну и ту же ошибку более 100 раз Извлечение релевантных тегов / ключевых слов из текстового блока

CSV для ассоциативного массива

Я видел множество примеров того, как взять CSV-файл, а затем создать ассоциативный массив с заголовками в качестве ключей.

Например:

Brand,Model,Part,Test Honda,Civic,123,244 Honda,Civic,135,434 Toyota,Supra,511,664 

Где бы он создал массив, такой как Array[$num][$key] где $key был бы Brand, Model, Part, Test.

Поэтому, если бы я хотел получить доступ к тестовому значению «434», мне пришлось бы зацикливать каждый индекс в массиве, а затем игнорировать любые бренды, которые не были honda, и любые модели, которые не были Civic


То, что мне нужно сделать, – это получить доступ к самому большему числу напрямую, вместо того, чтобы проходить через цикл for, проходящий через каждый индекс $ num. Я хочу иметь возможность получить доступ к тесту значений «434» с помощью:

Array['Honda']['Civic']['135']

или контроль за заявлением с циклом через каждую модель Honda имеет … что-то вроде

foreach $model in Array['Honda']

По крайней мере, мне нужно иметь возможность пройти через каждую модель с известной торговой маркой и получить доступ ко всей относительной информации для каждого.

Редактировать:

Просто чтобы подтвердить, что я приводил пример. Мои фактические данные имеют такие заголовки, как:

brand model part price shipping description footnote

Из чего мне нужно получить доступ ко всей информации, связанной с частью (цена, доставка, по убыванию, сноска)

запускать файл csv по строкам и вставлять в массив как:

 $array = $fields = array(); $i = 0; $handle = @fopen("file.csv", "r"); if ($handle) { while (($row = fgetcsv($handle, 4096)) !== false) { if (empty($fields)) { $fields = $row; continue; } foreach ($row as $k=>$value) { $array[$i][$fields[$k]] = $value; } $i++; } if (!feof($handle)) { echo "Error: unexpected fgets() fail\n"; } fclose($handle); } 

Слишком много длинных решений. Я всегда считал это самым простым:

 <?php /* Map Rows and Loop Through Them */ $rows = array_map('str_getcsv', file('file.csv')); $header = array_shift($rows); $csv = array(); foreach($rows as $row) { $csv[] = array_combine($header, $row); } ?> 

Чтобы создать ассоциативный массив массивов, используйте что-то вроде:

 $keys = fgetcsv($f); while (!feof($f)) { $array[] = array_combine($keys, fgetcsv($f)); } 

И для прохождения и фильтрации по определенным атрибутам пишите функцию типа:

 function find($find) { foreach ($array as $row) { if (array_intersect_assoc($row, $find) == $find) { $result[] = $row; } } } 

Если вы хотите вызвать его с помощью $find = array(Brand=>Honda, Model=>Civic, Part=>135) чтобы отфильтровать найденные модели. Другая структура позиционного массива кажется не очень работоспособной, если только вы не хотите получить доступ к атрибуту «Тест».

Попробуйте этот простой алгоритм:

  $assocData = array(); if( ($handle = fopen( $importedCSVFile, "r")) !== FALSE) { $rowCounter = 0; while (($rowData = fgetcsv($handle, 0, ",")) !== FALSE) { if( 0 === $rowCounter) { $headerRecord = $rowData; } else { foreach( $rowData as $key => $value) { $assocData[ $rowCounter - 1][ $headerRecord[ $key] ] = $value; } } $rowCounter++; } fclose($handle); } var_dump( $assocData); 

Вот решения, которые будут работать, указав локальный файл или URL-адрес. Вы также можете включить и отключить связь. Надеюсь, это поможет.

 class CSVData{ public $file; public $data; public $fp; public $caption=true; public function CSVData($file=''){ if ($file!='') getData($file); } function getData($file){ if (strpos($file, 'tp://')!==false){ copy ($file, '/tmp/csvdata.csv'); if ($this->fp=fopen('/tmp/csvdata.csv', 'r')!==FALSE){ $this->readCSV(); unlink('tmp/csvdata.csv'); } } else { $this->fp=fopen($file, 'r'); $this->readCSV(); } fclose($this->fp); } private function readCSV(){ if ($this->caption==true){ if (($captions=fgetcsv($this->fp, 1000, ","))==false) return false; } $row=0; while (($data = fgetcsv($this->fp, 1000, ",")) !== FALSE) { for ($c=0; $c < count($data); $c++) { $this->data[$row][$c]=$data[$c]; if ($this->caption==true){ $this->data[$row][$captions[$c]]=$data[$c]; } } $row++; } } } 

Попробуйте воспользоваться этим:

 $o=new CSVData(); $o->getData('/home/site/datafile.csv'); $data=$o->data; print_r($data);