php array_intersect не получить первое значение - PullRequest
0 голосов
/ 07 марта 2019

По сути, я пытаюсь импортировать данные CSV в мою базу данных. Прежде чем вставить данные в базу данных, я хочу проверить, есть ли в базе данных этот столбец (из заголовков CSV) или нет.

        // read csv from file ex: data.csv
        $reader = \League\Csv\Reader::createFromPath($file);            

        // get first row from csv as headers (email, first_name, last_name etc.)
        $headers = array_filter(array_map(function($value) { return strtolower(trim($value)); }, $reader->fetchOne()));

        // get fields from database (email, first_name, last_name, birthdate etc.)
        $fields = collect($this->fields)->map(function ($field) {
            return strtolower($field->tag);
        })->toArray();


        // want to check which fields has csv
        $availableFields = array_intersect($headers, $fields);

Однако, когда я запускаю приведенный выше код, array_intersect не работает должным образом.

Вывод:

 $headers : Array ([0] => email [1] => first_name [2] => last_name ) 

 $fields : Array ( [0] => email [1] => first_name [2] => last_name     [3] => telephone     [4] => gender     [5] => birthdate     [6] => country  ) 

 $availableFields :Array ([1] => first_name [2] => last_name ) 

var_dump и результат:

$headers : array(3) {
  [0]=>
  string(8) "email"
  [1]=>
  string(10) "first_name"
  [2]=>
  string(9) "last_name"
}
$fields : array(9) {
  [0]=>
  string(5) "email"
  [1]=>
  string(10) "first_name"
  [2]=>
  string(9) "last_name"
  [3]=>
  string(9) "telephone"
  [4]=>
  string(6) "gender"
  [5]=>
  string(9) "birthdate"
  [6]=>
  string(7) "country"
}

1 Ответ

0 голосов
/ 08 марта 2019

Функция trim() в php обрезает только 6 непечатаемых символов по умолчанию.Я думаю, что это ваша проблема, потому что есть больше непечатаемых символов ( список символов ).

Например:

<?php

var_dump([trim("EMAIL\x1C")]);

trim () позволяет вам указатьмаска символов во втором параметре:

<?php 

trim($binary, "\x00..\x1F");

Вместо использования trim () регулярное выражение дает больше гарантии:

<?php

// preg_replace('/[\x00-\x1F\x7F]/u', '', $value)
$headers = array_filter(array_map(function($value) { return strtolower(preg_replace('/[\x00-\x1F\x7F]/u', '', $value)); }, $reader->fetchOne()));
...