Вот мой взгляд на это:
- Использование
file
для чтения файла данных, создавая массив, где каждый элемент соответствует линии на входе.
- Используйте
array_filter
с trim
как функцию фильтра, чтобы удалить пустые строки из этого массива. Это дает преимущество в том, что trim
возвращает строку, удалив пробел с обоих концов ее аргумента, оставив пустую строку, если для начала был аргумент всех пробелов. The empty string converts to boolean false
- таким образом, array_filter
проигнорируйте строки, все пробелы.
- Используйте
array_map
с обратным вызовом, который включает вызов explode
, чтобы разделить каждый элемент массива (строку текста) на три части и вернуть второй из них. Это создаст массив, в котором каждый элемент будет просто именем.
- Используйте
array_map
с strtoupper
как обратный вызов для преобразования всех имен в верхний регистр, чтобы «jim» и «JIM» считались одинаковыми на следующем шаге.
- Наконец, используйте
array_count_values
, чтобы получить количество вхождений для каждого имени.
код, принимая вещи медленно:
function extract_name($line) {
// The -1 parameter (available as of PHP 5.1.0) makes explode return all elements
// but the last one. We want to do this so that the element we are interested in
// (the second) is actually the last in the returned array, enabling us to pull it
// out with end(). This might seem strange here, but see below.
$parts = explode('||', $line, -1);
return end($parts);
}
$lines = file('data.txt'); // #1
$lines = array_filter($lines, 'trim'); // #2
$names = array_map('extract_name', $lines); // #3
$names = array_map('strtoupper', $names); // #4
$counts = array_count_values($names); // #5
print_r($counts); // to see the results
Там причина, я решил сделать это в шагах, где каждый шаги включает в себя вызов функции на результат предыдущего шага - что это на самом деле возможно сделать это только в одной строке:
$counts = array_count_values(
array_map(function($line){return strtoupper(end(explode('||', $line, -1)));},
array_filter(file('data.txt'), 'trim')));
print_r($counts);
See it in action.
Следует отметить, что это может быть не «лучший» способ решить проблему в том смысле, что если ваш входной файл огромный (на стадионе нескольких миллионов линий), этот подход будет потреблять много потому что он сразу считывает все данные в памяти. Тем не менее, это, безусловно, удобно и, если вы не знаете, что вход будет таким большим, нет смысла делать жизнь сложнее.
Примечание. Разработчики PHP на высшем уровне, возможно, заметили, что я нарушаю строгие стандарты здесь, подавая результат explode
на функцию, которая принимает свой аргумент по ссылке. Это действительная критика, но в моей защите я стараюсь, чтобы код был как можно короче. В производстве было бы лучше использовать $a = explode(...); return $a[1];
, хотя не будет никакой разницы в отношении результата.
Покажите код, который вы попытались до сих пор, и мы постараемся его исправить. Но вам нужно показать НЕКОТОРЫЕ усилия - мы не будем писать это для вас. Это не то, как работает этот сайт. –