У меня есть таблица 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]. ", ";
}
Я бы поставил это прямо в вопросе здесь, это довольно хлопотно прыгать через обручи.






Используя продезинфицированный 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 убедитесь, что вы не создаете столбцы с одинаковыми именами. Сделайте так, чтобы все, что генерирует эти имена столбцов, назначало им индивидуальные описательные имена. что-то вроде: gmail.com — гугл фото — гугл аналитикс. Когда ваши столбцы имеют одно и то же имя, вы не даете значениям правильные описания, они становятся бессмысленными. Если ничего не помогает, переименуйте их в google.com1, google.com2, но это плохая практика.
я не могу этого сделать, я получил этот файл csv при экспорте данных кампании sendinblue .. :(
@user3514052 user3514052 Тогда у вас возникает вопрос, что означает второй google.com? Вам нужно будет создать свой собственный перевод того, что это на самом деле означает. Поэтому, прежде чем вы войдете в цикл for, просмотрите массив key_names и замените соответствующие записи правильными именами, ИЛИ определите свой собственный массив имен ключей вместо того, чтобы принимать имена столбцов, которые были вам даны. Итак, $key_names = ['id', 'name', 'google_1', 'google_2']; но имейте в виду, что вам нужно заранее знать формат, если вы это сделаете.
Вы не можете фильтровать csv напрямую, но вы можете фильтровать его после анализа в массив;
http://sandbox.onlinephpfunctions.com/code/f17969e35fcfc5e2f4b2f25202359f1b4cc4840b
csv задается строкой, потому что песочница не может работать с файлами, кстати, вы можете установить их, как хотите
Ответ Чаллаки более подробный, просто проголосовал за него)
Можете ли вы ответить, что если у меня есть столбцы с одинаковым именем? Таким образом я получаю только первый результат ideone.com/0SjNNU
единственное решение, которое я вижу, это переименовать ваши столбцы в CSV-файле или переименовать его, пока вы конвертируете его в массив. sandbox.onlinephpfunctions.com/code/… Но вам также следует переделать метод фильтрации, если вы хотите искать по всем повторяющимся столбцам одновременно
Я получаю сообщение об ошибке, потому что при чтении только этого количества строк это количество имеет столбцы sandbox.onlinephpfunctions.com/code/…
слава богу, ты здесь. но ваш последний код не дает результата
вы уверены, что csv действителен, кажется, что количество столбцов не равно в заголовке и некоторых строках
да, я уверен, получил ту же ошибку с простейшим csv sandbox.onlinephpfunctions.com/code/…
вы правы, но есть совершенно хороший пример csv sandbox.onlinephpfunctions.com/code/…
я немного изменил ваш код, и теперь он работает sandbox.onlinephpfunctions.com/code/…
спасибо тебе большое, возможно теперь действительно все супер! ты лучший))
Пожалуйста, покажите нам фактический входной файл или, возможно, реальный PHP-скрипт, который вы используете (в зависимости от того, какой из них не является текущим).