У меня есть вопрос.
Я получил массив, который заполнен внешними ссылками, такими как:
www.google.de
www.google.com/test
и так далее.
Нет, я хотел бы заполнить массив.
Если в массиве есть ссылки вроде этого:
www.google.de
www.google.de/test
www.google.de/fuuuu
Я только хочу получить ссылку www.google.de и отфильтровать все остальное.
Я начал использовать array_diff_key, но это не работает, как должно.
Вот мой фрагмент.
$d_array = array_diff_key($externalArray, array_unique($externalArray));
Спасибо за любую помощь.
Greats,
Traxstar
Наконец то я это сделал:
$arr = [
'www.google.de',
'http://www.google.de/test',
'www.google.de/fufufufu',
'www.google.com/cctvvmb',
'https://www.google.com/',
'google.co.uk/hello',
];// based on http://stackoverflow.com/questions/1201194/php-getting-domain-name-from-subdomain
function get_domain($url)
{
if(preg_match('/(?P<domain>[a-z0-9][a-z0-9\-]{1,63}\.[a-z\.]{2,6})$/i', $url, $regs))
{
return $regs['domain'];
}
return false;
}
function get_duplicated_domains($arr)
{
$domains = [];
// looping the array, processing all of it
foreach($arr as $url)
{
// lower text
$url = strtolower($url);
// removing eventual http & https
$url = str_replace('http://', '', $url);
$url = str_replace('https://', '', $url);
// replacing with the string before the first slash
$url = explode('/', $url);
// extracting top level domain
$url = get_domain($url[0]);
// Registering domain in $domains array or incrementing it
if(array_key_exists($url, $domains))
{
$domains[$url]++;
}
else
{
$domains[$url] = 0;
}
}
// gathering data
return array_keys(array_filter($domains));
}
$res = get_duplicated_domains($arr);
Результат:
Array
(
[0] => google.de
[1] => google.com
)
1 — зацикливание массива
1.1 — Опускание строки URL для предотвращения http
несоответствие с Http
например
1.2 — Удаление http://
& https://
из строк, чтобы все было в одном формате
1.3 — Извлечение доменного имени верхнего уровня
1.4 — Регистрация или увеличение $domains
массив извлеченного доменного имени верхнего уровня
2 — Фильтрация массива (0, нуль, ложь, пустые строки, удалены, поэтому я регистрирую доменное имя с 0, а не с 1), чтобы сохранить только домены «сомнения» (те, которые присутствуют более одного раза в массив)
3 — Затем получить ключи массива (потому что ключи являются доменными именами)
Кстати, я использую PHP 5.6.2
Вы можете просто использовать parse_url лайк:
$externalArray = array_reduce($externalArray, function ($carry, $url) {
if (strpos($url, 'http') !== 0) {
$url = 'http://' . $url;
}
$host = strtolower(parse_url($url, PHP_URL_HOST));
if (!in_array($host, $carry)) {
$carry[] = $host;
}
return $carry;
}, array());
Вы также должны попробовать это
шаг 1: получить все ссылки в одном массиве
$links = array(
www.google.de,
www.google.com/test,
www.google.de/test
www.google.de/fuuuu
)
Шаг 2: затем взорвать все одно из «/» и поместить их в один массив
$strip = array('http://','https://');
foreach($links as $dividelink){
$newone = explode("/",str_ireplace($strip,'',$dividelink));
$newone = $newone[0];
$newlinksDataArr[] = array(
"link" => $newone,
);
$newone=null;
}
Шаг-3: добавить функцию ниже
function unique_multidim_array($array, $key) {
$temp_array = array();
$i = 0;
$key_array = array();
foreach($array as $val) {
if (!in_array($val[$key], $key_array)) {
$key_array[$i] = $val[$key];
$temp_array[$i] = $val;
}
$i++;
}
return $temp_array;
}
Шаг 4: используйте вышеуказанную функцию и получите уникальную ссылку
$d_array = unique_multidim_array($newlinksDataArr, "link");