В PHP у меня есть массив, который показывает, сколько раз пользователь нажимал на каждый отдельный домен, например:
$counts = [
"900,google.com",
"60,mail.yahoo.com",
"10,mobile.sports.yahoo.com",
"40,sports.yahoo.com",
"300,yahoo.com",
"10,stackoverflow.com",
"20,overflow.com",
"5,com.com",
"2,en.wikipedia.org",
"1,m.wikipedia.org",
"1,mobile.sports",
"1,google.co.uk"
];
Как я могу использовать этот ввод в качестве параметра функции и вернуть структуру данных, содержащую количество кликов, которые были записаны в каждом домене И каждом поддомене под ним. Например, клик по ссылке «mail.yahoo.com» учитывается при подсчете итогов для «mail.yahoo.com», «yahoo.com» и «com». (Субдомены добавляются слева от их родительского домена. Таким образом, «mail» и «mail.yahoo» не являются допустимыми доменами. Обратите внимание, что «mobile.sports» отображается как отдельный домен внизу ввода.)
Пример вывода (в любом порядке/формате):
calculateClicksByDomain($counts) =>
com: 1345
google.com: 900
stackoverflow.com: 10
overflow.com: 20
yahoo.com: 410
mail.yahoo.com: 60
mobile.sports.yahoo.com: 10
sports.yahoo.com: 50
com.com: 5
org: 3
wikipedia.org: 3
en.wikipedia.org: 2
m.wikipedia.org: 1
mobile.sports: 1
sports: 1
uk: 1
co.uk: 1
google.co.uk: 1
Первый шаг, на котором я застрял, это как получить субдомены, например
"mobile.sports.yahoo.com"
такой, что результат
[com, yahoo.com, sports.yahoo.com, mobile.sports.yahoo.com]
Этот код будет работать:
$counts = [
"900,google.com",
"60,mail.yahoo.com",
"10,mobile.sports.yahoo.com",
"40,sports.yahoo.com",
"300,yahoo.com",
"10,stackoverflow.com",
"20,overflow.com",
"5,com.com",
"2,en.wikipedia.org",
"1,m.wikipedia.org",
"1,mobile.sports",
"1,google.co.uk"
];
function calculateClicksByDomain($dataLines)
{
$output = [];
foreach ($dataLines as $dataLine) {
[$count, $domain] = explode(',', $dataLine);
$nameParts = [];
foreach (array_reverse(explode('.', $domain)) as $namePart) {
array_unshift($nameParts, $namePart);
$domain = implode('.', $nameParts);
$output[$domain] = ($output[$domain] ?? 0) + $count;
}
}
return $output;
}
print_r(calculateClicksByDomain($counts));
См.: https://3v4l.org/o5VgJ#v8.0.26
Эта функция просматривает каждую строку данных и разбивает их на счетчик и домен. После этого домен разбивается по точкам, переворачивается и проходится по этим частям имени. В этом цикле он реконструирует различные поддомены и подсчитывает их в выводе.
Спасибо @KIKO Software, это прекрасно решает проблему.