За последние 24 часа нас посетили 21693 программиста и 1060 роботов. Сейчас ищут 714 программистов ...

Не обрабатывается первый столбец CSV в качестве ключа

Тема в разделе "PHP для новичков", создана пользователем lampaman, 16 дек 2018.

Метки:
  1. lampaman

    lampaman Новичок

    С нами с:
    16 дек 2018
    Сообщения:
    3
    Симпатии:
    0
    Добрый день! Я новичок в PHP, это мой первый проект.
    Стоит задача распознать CSV файл в ассоциированный массив с заголовками в качестве ключей.

    В целом, я это сделал, но столкнулся с проблемой: почему-то не определяется значение первого столбца! Точнее определяется, но как-то не нормально.. При попытке использовать первое поле id в качестве ключей - получаются индексы, а не значения Id. Для остальных полей нормально подставляются значения..
    Я уже всю голову сломал - от чего такое может быть и как это победить??

    Ниже привожу код:
    PHP:
    1. $options = array(
    2.     /* Настройки CSV */
    3.     'filename'      => 'file2.csv', // Имя файла CSV.
    4.     'delimiter'     => ';', // Какой разделитель используется
    5.  
    6. );
    7.  
    8. function csv_to_array($filename) {
    9.     if(!file_exists($filename) || !is_readable($filename)){
    10.         return FALSE;
    11.     }
    12.     global $options;
    13.     $header = NULL;
    14.     $data = array();
    15.     if (($handle = fopen($filename, 'r')) !== FALSE) {
    16.         while (($row = fgetcsv($handle, 1000, $options['delimiter'])) !== FALSE) {
    17.             if(!$header) //первая строка идет в заголовки
    18.                 $header = $row;
    19.                 else
    20.                     $data[] = array_combine($header, $row);
    21.         }
    22.         fclose($handle);
    23.     }
    24.     return $data;
    25. }
    26.  
    27. $data=csv_to_array($options['filename']); //запускам распознавание
    28.  
    29. //вот эта конструкция показывает что все читается отлично
    30. foreach ($data as $strd){
    31.     foreach ($strd as $key=>$value){
    32.        echo "{$key} - {$value}<br>";
    33.     }
    34. }
    35.  
    36. //теперь попробуем сформировать выборку по полю:
    37. $dataid=array_column($data, 'price','id'); // -  идут  порядковые номера а не значения!!!! Почему??
    38. //$dataid=array_column($data, 'price','description'); // А вот так работает! И с другими полями в качестве ключей тоже работает! Почему??
    39.  
    40. var_dump($dataid);
    Вывод ECHO:
    id - 121
    name_group - Раз
    name - gjgkfd
    price - 33244
    remainder - #2df;
    description - dasd112
    id - 132
    name_group - два
    name - gjgkfd
    price - 33244
    remainder - #2df;
    description - dasd113
    id - 144
    name_group - Раз
    name - gjgkfd
    price - 33244
    remainder - #2df;
    description - dasd114
    id - 125
    name_group - два
    name - gjgkfd
    price - 33244
    remainder - #2df;
    description - dasd115
    id - 156
    name_group - Раз
    name - gjgkfd
    price - 33244
    remainder - #2df;
    description - dasd116
    id - 176
    name_group - два
    name - gjgkfd
    price - 33244
    remainder - #2df;
    description - dasd117
    id - 148
    name_group - Раз
    name - gjgkfd
    price - 33244
    remainder - #2df;
    description - dasd118
    id - 169
    name_group - два
    name - gjgkfd
    price - 33244
    remainder - #2df;
    description - dasd119
    id - 270
    name_group - Раз
    name - gjgkfd
    price - 33244
    remainder - #2df;
    description - dasd120
    id - 271
    name_group - два
    name - gjgkfd
    price - 33244
    remainder - #2df;
    description - dasd121

    вывод var_dump :
    array(10) { [0]=> string(5) "33244" [1]=> string(5) "33244" [2]=> string(5) "33244" [3]=> string(5) "33244" [4]=> string(5) "33244" [5]=> string(5) "33244" [6]=> string(5) "33244" [7]=> string(5) "33244" [8]=> string(5) "33244" [9]=> string(5) "33244" }


    array(10) { ["dasd112"]=> string(5) "33244" ["dasd113"]=> string(5) "33244" ["dasd114"]=> string(5) "33244" ["dasd115"]=> string(5) "33244" ["dasd116"]=> string(5) "33244" ["dasd117"]=> string(5) "33244" ["dasd118"]=> string(5) "33244" ["dasd119"]=> string(5) "33244" ["dasd120"]=> string(5) "33244" ["dasd121"]=> string(5) "33244" }

    Если использовать id не как ключ, а как значения, то вообще получается пустой массив.., т.е. id почему-то присваиваются NULL - но ведь в выводе через echo - все нормально!

    CSV тут прикрепить нельзя, содержимое под спойлером:
    Код (Text):
    1. id;name_group;name;price;remainder;description
    2. 121;Раз;gjgkfd;33244;"#2df;";dasd112
    3. 132;два;gjgkfd;33244;"#2df;";dasd113
    4. 144;Раз;gjgkfd;33244;"#2df;";dasd114
    5. 125;два;gjgkfd;33244;"#2df;";dasd115
    6. 156;Раз;gjgkfd;33244;"#2df;";dasd116
    7. 176;два;gjgkfd;33244;"#2df;";dasd117
    8. 148;Раз;gjgkfd;33244;"#2df;";dasd118
    9. 169;два;gjgkfd;33244;"#2df;";dasd119
    10. 270;Раз;gjgkfd;33244;"#2df;";dasd120
    11. 271;два;gjgkfd;33244;"#2df;";dasd121

    Помогите разобраться, что ему надо ((
     
    #1 lampaman, 16 дек 2018
    Последнее редактирование: 16 дек 2018
  2. lampaman

    lampaman Новичок

    С нами с:
    16 дек 2018
    Сообщения:
    3
    Симпатии:
    0
    Попробовал на другом файле - все тоже самое, первый столбец при обращении к массиву читается как NULL.
    Т.е. если в примере из первого сообщения выполнить в конце строчку:
    $dataid=array_column($data,'id','price');
    var_dump($dataid);

    - будет выведен пустой массив - и так с любым содержимом CSV для первого столбца - почему? как это обойти?
    Блин, я уже не знаю что делать, уперся в это - подскажите пожалуйста.
     
  3. lampaman

    lampaman Новичок

    С нами с:
    16 дек 2018
    Сообщения:
    3
    Симпатии:
    0
    Всем спасибо за ответы, разобрался сам.

    Дело в кодировке CSV - нужно чтобы кодировка была utf8 - без BOM
    Вроде есть способы убрать этот BOM в коде, но мне было проще поменять кодировку файла.