#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-скрипт, который вы используете (в зависимости от того, что не является текущим).
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 /…