首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使TLD数组在gtld下

使TLD数组在gtld下
EN

Stack Overflow用户
提问于 2022-06-14 14:06:36
回答 2查看 36关注 0票数 -1

我有一个包含2200项的大型tLD数组,如下所示:

代码语言:javascript
复制
$TestArray = array(".aero", ".airport.aero", ".cargo.aero", ".charter.aero", ".aetna");

我想将它们转换如下:

代码语言:javascript
复制
Array
(
    [0] => Array
        (
            [tld] => .aero
            [gTLD] => Array ( [0] => .airport.aero [1] => .cargo.aero [2] => .charter.aero )
        )

    [1] => Array
        (
            [tld] => .aetna
            [gTLD] => 
        )

)

您可以在下面看到我的代码:

代码语言:javascript
复制
$TldList = array();

$TestArray = array(".aero", ".airport.aero", ".cargo.aero", ".charter.aero", ".aetna");


foreach ($TestArray as $tld)
{

    $LocalTld = array();
    $TldBreakPoints = explode(".",$tld);

    $gTLD = array();

    $found = false;

    if((count($TldBreakPoints)) > 2)
    {

        foreach ($TestArray as $tld2)
        {

            $TldBreakPoints2 = explode(".",$tld2);

            if((count($TldBreakPoints2)) > 2)
            {
                if($tld == '.'.$TldBreakPoints2[2])
                {
                     echo 'match gtld';
                    $found = true;

                    $gTLD[] = $tld2;

                }else{

                    //Nothing
                }

            }else{
                // Nothing
            }



        }

    }else{

    }
    

    $LocalTld['tld'] = $tld;

    if($found)
    {

        $LocalTld['gTLD'] = $gTLD;

    }else{

        $LocalTld['gTLD'] = '';

    }
    $TldList[] = $LocalTld;

}

echo '<pre>';

print_r($TldList);

请帮帮忙

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-14 17:57:46

代码语言:javascript
复制
$array = [ '.aero', '.airport.aero', '.cargo.aero', '.charter.aero', '.aetna' ];

$result = array_values(
    array_reduce(
        $array,
        function ($carry, $item) {
          if (substr_count($item, '.') === 1) {
            $carry[$item] = [ 'tld' => $item, 'gTLD' => [] ];
          } else {
            $parts = preg_split('/^([.].+)([.].+)/', $item, -1, PREG_SPLIT_DELIM_CAPTURE + PREG_SPLIT_NO_EMPTY);
            $last = end($parts);
            $carry[$last]['gTLD'][] = $item;
          }
          return $carry;
        },
        []
    )
);

print_r($result);

假设:

  • TLD只包含一个点。
  • gTLDs将在分配给它们的TLD之后出现在数组中。
票数 1
EN

Stack Overflow用户

发布于 2022-06-15 03:54:48

如果gTLD总是在遇到tld之后出现,那么任务就可以大大减少。此任务只需对每个字符串进行解析,就可以确定gTLD,然后使用所需的关联元素将数据推入所需的组中。

下面的preg_match()不仅检查字符串值是否包含gTLD值,而且在它包含时隔离tld (如$m[0])。

代码:(演示)

代码语言:javascript
复制
$result = [];
foreach ($array as $value) {
    if (!preg_match('/(?!^)\..+/', $value, $m)) {
        $result[$value] = ['tld' => $value, 'gTLD' => []];
    } else {
        $result[$m[0]]['gTLD'][] = $value;
    }
}
var_export(array_values($result));

如果gTLDs不能保证在初始化tlds之后发生,那么就需要更多的条件检查。

代码:(演示)

代码语言:javascript
复制
$result = [];
foreach ($array as $value) {
    if (!preg_match('/(?!^)\..+/', $value, $m)) {
        if (!isset($result[$value])) {
            $result[$value] = ['tld' => $value, 'gTLD' => []];
        }
    } else {
        if (!isset($result[$m[0]])) {
            $result[$m[0]] = ['tld' => $m[0], 'gTLD' => [$value]];
        } else {
            $result[$m[0]]['gTLD'][] = $value;
        }
    }
}
var_export(array_values($result));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72618434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档