У меня есть таблица 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
user3514052 15 Апр 2019 в 13:33

2 ответа

Лучший ответ

Используя санированный 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'] == '+' && $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'] == '+' && $entry['email'] = 'email2@email.com';  
});
var_dump($only_with_plus);

// your code goes here
2
Tschallacka 15 Апр 2019 в 11:25

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

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

1
xottabych007 15 Апр 2019 в 11:56