Создать отсортированный массив из списка доменных имен [PHP] - PullRequest
1 голос
/ 04 августа 2020

Я пытаюсь превратить список доменов во вложенный массив на основе их поддоменов. Поначалу это кажется тривиальным, но мой маленький мозг борется.

Вход:

example.com
www.example.com
email.example.com
1.email.example.com
example.net

Ожидаемый результат.

$array = array(
    "com" => array(
        "example",
        "example" => array("www","email"=> "1")),
    "net" => "example",
);

Я могу немного приблизиться с помощью следующего кода :

<code>$a = 'a.google.com';
$b = 'b.google.com';
$c = 'c.google.com';
$a1 = '1.a.google.com';
$a2 = '5.2.a.google.com';
$a3 = '3.a.google.com';
$d = [$a,$b,$c,$a1,$a2,$a3];
$result = [];

foreach ($d as $domain){
    
    $fragments = array_reverse( explode( '.', $domain ));
    
    for ($x = 0; $x <= count($fragments)-1; $x++) {         
        if (!is_array($result[$x])){ $result[$x] = [];}
        array_push($result[$x], $fragments[$x]);
    }
}
echo '<pre>';
    var_dump($result);
echo '
';

Хотя это не вкладывает массивы, и я не вижу, как я могу получить доступ к правильным массивам для pu sh данных без какой-либо конструкции массива переменных. Halp! : P

1 Ответ

0 голосов
/ 04 августа 2020

Здесь я проверяю, больше ли разнесенный массив, чем 2 элемента, и если да, беру последний в качестве значения, добавляемого к результату:

foreach($d as $domain) {
    $path  = array_reverse(explode('.', $domain));
    
    if(count($path) > 2) {
        $value = array_pop($path);
    } else {
        $value = false;
    }
    $temp =& $result;
    
    foreach($path as $key) {
        $temp =& $temp[$key];
    }
    if($value) {
        $temp[] = $value;
    }
}
...