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

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

| id | email | name | google.com | yahoo.com |
| 1  | [email protected] | jack |   | + |
| 2  | [email protected] | jack | + |   |
| 3  | [email protected] | jack |   |   |

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

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

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

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

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

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

Tim Biegeleisen 15.04.2019 12:40
jpst.it/1GCd9
user3514052 15.04.2019 12:46

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

Jake 15.04.2019 12:59
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
3
65
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

См. следующие функции: массив_карта, подрезать, фильтр_массива.

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

$only_with_plus = array_filter($entries, function($entry) {
   return $entry['google.com'] == '+' && $entry['email'] = '[email protected]';    
});

Посмотреть онлайн: https://ideone.com/ZDn2dv

<?php
$CSV = <<<EOF
| id | email | name | google.com | yahoo.com |
| 1  | [email protected] | jack |   | + |
| 2  | [email protected] | jack | + |   |
| 3  | [email protected] | 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'] == '+' && $entry['email'] = '[email protected]';  
});
var_dump($only_with_plus);

// your code goes here

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

user3514052 15.04.2019 14:47

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

Tschallacka 15.04.2019 15:24

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

user3514052 15.04.2019 15:28

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

Tschallacka 15.04.2019 15:36

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

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

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

xottabych007 15.04.2019 13:59

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

xottabych007 15.04.2019 14:14

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

user3514052 15.04.2019 14:50

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

xottabych007 15.04.2019 16:02

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

user3514052 16.04.2019 10:44

слава богу, ты здесь. но ваш последний код не дает результата

user3514052 16.04.2019 11:29

вы уверены, что csv действителен, кажется, что количество столбцов не равно в заголовке и некоторых строках

xottabych007 16.04.2019 11:32

да, я уверен, получил ту же ошибку с простейшим csv sandbox.onlinephpfunctions.com/code/…

user3514052 16.04.2019 11:35

вы правы, но есть совершенно хороший пример csv sandbox.onlinephpfunctions.com/code/…

user3514052 16.04.2019 11:38

я немного изменил ваш код, и теперь он работает sandbox.onlinephpfunctions.com/code/…

xottabych007 16.04.2019 11:40

спасибо тебе большое, возможно теперь действительно все супер! ты лучший))

user3514052 16.04.2019 11:45

Другие вопросы по теме