Получение записи из csv по имени столбца

#php #csv

#php #csv

Вопрос:

У меня есть таблица csv (мой файл csv http://jpst.it/1GCd9 )

 | id | email | name | google.com | yahoo.com |
| 1  | email1@email.com | jack |   |   |
| 2  | email2@email.com | jack |   |   |
| 3  | email3@email.com | jack |   |   |
  

Возможно ли получать электронные письма с » » по имени столбца?

Например, я хочу указать google.com и получить электронную почту email2@email.com

Я просто знаю, как получить данные по идентификатору столбца: (

   while (($row = fgetcsv($fileHandle, 0, ",")) !== FALSE) {
      if($flag) { $flag = false; continue; }

      $explode = explode(";",$row[4]);
      echo $explode[4]. ", ";
  }
  

Комментарии:

1. Пожалуйста, покажите нам фактический входной файл или, возможно, фактический PHP-скрипт, который вы используете (в зависимости от того, что не является текущим).

2. jpst.it/1GCd9

3. Я бы поставил это прямо в вопрос здесь, прыгать через обручи довольно сложно.

Ответ №1:

Используя очищенный CSV (удалив все лишние пробелы и фильтр массива, вы можете получить то, что хотите.

Раньше я array_map('trim', array_filter(explode($delimeter, $lines[0]), function($entry){return !empty($entry);})); очищал весь ввод от пробелов и отбрасывал «пустой» заголовок, который у вас есть в конце, по последнему символу канала.

Смотрите следующие функции: array_map, trim, array_filter.

Затем, когда все «нормализуется», у нас есть массив ассоциативных массивов с правильными полями, поэтому мы можем снова выполнить поиск с помощью array_filter . Тогда переменная $only_with_plus будет содержать только ассоциативные массивы, соответствующие параметрам поиска.

 $only_with_plus = array_filter($entries, function($entry) {
   return $entry['google.com'] == ' ' amp;amp; $entry['email'] = 'email2@email.com';    
});
  

Смотрите онлайн: https://ideone.com/ZDn2dv

 <?php
$CSV = <<<EOF
| id | email | name | google.com | yahoo.com |
| 1  | email1@email.com | jack |   |   |
| 2  | email2@email.com | jack |   |   |
| 3  | email3@email.com | jack |   |   |
EOF;
$delimeter = '|';
$lines = explode("n", $CSV);
$key_names = array_map('trim', array_filter(explode($delimeter, $lines[0]), function($entry){return !empty($entry);}));
$entries = [];
$len = count($lines);
for($c = 1; $c < $len; $c  ) {
    $line = array_map('trim', array_filter(explode($delimeter, $lines[$c]), function($entry){return !empty($entry);}));
    $entry = [];
    foreach($line as $key => $value) {
        $entry[$key_names[$key]] = $value;

    }
    $entries[] = $entry;
}

$only_with_plus = array_filter($entries, function($entry) {
   return $entry['google.com'] == ' ' amp;amp; $entry['email'] = 'email2@email.com';  
});
var_dump($only_with_plus);

// your code goes here
  

Комментарии:

1. Еще одна проблема, как насчет того, есть ли у меня столбцы с одинаковыми именами? Я получаю только один результат ideone.com/0SjNNU

2. @user3514052 убедитесь, что вы не создаете столбцы с одинаковыми именами. Сделайте так, чтобы все, что генерирует эти имена столбцов, присваивало им отдельные описательные имена. что-то вроде: gmail.com — google фото — google analytics. Когда ваши столбцы имеют одинаковое имя, вы не даете значениям правильные описания, они становятся бессмысленными. Когда все не удается, переименуйте их в google.com1, google.com2, но это плохая практика.

3. я не могу этого сделать, я получил этот csv-файл при экспорте данных кампании sendinblue .. 🙁

4. @user3514052 Тогда возникает вопрос, что делает второй google.com имею в виду? Вам нужно будет создать свой собственный перевод того, что это на самом деле означает. Поэтому, прежде чем вводить цикл for, пройдитесь по массиву key_names и замените соответствующие записи правильными именами ИЛИ определите свой собственный массив key names вместо того, чтобы принимать имена столбцов, которые были вам даны. итак, $key_names = ['id', 'name', 'google_1', 'google_2']; но поймите, что вам нужно заранее знать формат, если вы это сделаете.

Ответ №2:

Вы не можете фильтровать csv напрямую, но вы можете фильтровать его после разбора в массив;

http://sandbox.onlinephpfunctions.com/code/f17969e35fcfc5e2f4b2f25202359f1b4cc4840b

Комментарии:

1. csv задается строкой, поскольку песочница не может работать с файлами, кстати, вы можете установить ih, как хотите

2. Ответ Чаллаки более подробный, просто проголосовал за него)

3. Можете ли вы ответить, что, если у меня есть столбцы с одинаковыми именами? Таким образом, я получаю только первый результат ideone.com/0SjNNU

4. единственное решение, которое я вижу, это переименовать ваши столбцы в файле csv или переименовать его, пока вы преобразуете его в массив. sandbox.onlinephpfunctions.com/code/… Но вам также следует переделать метод фильтрации, если вы хотите выполнять поиск по всем дублирующимся столбцам одновременно

5. Я получаю сообщение об ошибке, потому что при чтении только этого количества строк в этом количестве есть столбцы sandbox.onlinephpfunctions.com/code /…