PHP:按域对电子邮件进行排序

PHP: Sort emails by domain

此函数非常适合按字母顺序对列表进行排序并清除所有双打。

function cleanMyList($myFile)
{
    $myTextFile=file_get_contents($myFile);
    $myArray=explode("\r\n",$myTextFile);
    $myArray=array_unique($myArray);
    sort($myArray);
    $myTextFile=implode("\r\n",$myArray);
    return $myTextFile;
}   
echo '<pre>'.cleanMyList('emails.txt').'</pre>';
exit;

这个脚本工作得很好,但现在我想做的是再次按电子邮件提供商排序(换句话说:按域),这样列表将被排序两次,首先按字母顺序排序,然后按电子邮件提供商排序。

这是一个例子:

emails.txt(之前):

hezi-gangina@gmail.com
z-mkd@z-mkd.com
ein-leha-sikuy@yahoo.com
metrixheshbon@yahoo.com
metrixheshbon@yahoo.com
metrixheshbon@yahoo.com
stus-ve-thsiko@yandex.ua
tshiko-ve-diko@mail.ru
einlehasikuy@mertrix.com
hezi-gangina@gmail.com
einlehasikuy@mertrix.com
einlehasikuy@mertrix.com
einlehasikuy@mertrix.com
another-duplicate@email.com
another-duplicate@email.com
another-duplicate@email.com
another-duplicate@email.com
another-duplicate@email.com

email.txt 之后:

another-duplicate@email.com
ein-leha-sikuy@yahoo.com
einlehasikuy@mertrix.com
hezi-gangina@gmail.com
metrixheshbon@yahoo.com
stus-ve-thsiko@yandex.ua
tshiko-ve-diko@mail.ru
z-mkd@z-mkd.com

但我希望更进一步得到这个(按域排序):

another-duplicate@email.com
hezi-gangina@gmail.com
tshiko-ve-diko@mail.ru
einlehasikuy@mertrix.com
ein-leha-sikuy@yahoo.com
metrixheshbon@yahoo.com
stus-ve-thsiko@yandex.ua
z-mkd@z-mkd.com

$em="mynam@domain.com,second@second.com, 第三@third.com,第四@fourth.com"; 将电子邮件分成两部分

$ar=split(",",$em);
while (list ($key, $val) = each ($ar)) {
$ar2=split("@",$val);
echo $ar2[0];
echo "<br>";
echo $ar2[1];
echo "<br><br>";
} 

根据值对数组进行排序(升序)- asort()

 <?php
   asort($ar2);
?> 
  • asort() - 根据值对关联数组进行升序排序
  • ksort() - 根据键对关联数组进行升序排序
  • arsort() - 根据值降序排列关联数组
  • krsort() - 根据键对关联数组进行降序排序

这应该适合你:

我只是稍微更改了您的代码。首先,我用 file() where I get ever line as an element in an array where I only take unique values with array_unique(). After this I sort your array with usort() 抓取你的文件,我检查域是否相同,如果是,则按字母排序。

<?php

    function cleanMyList($myFile) {
        $myArray = array_unique(file($myFile, FILE_IGNORE_NEW_LINES));

        usort($myArray, function($a, $b){
            preg_match_all("/(.*)@(.*)\./", $a, $m1);
            preg_match_all("/(.*)@(.*)\./", $b, $m2);

            if(($cmp = strcmp($m1[2][0], $m2[2][0])) == 0) {
                return strcmp($m1[1][0], $m2[1][0]);
            } else {
                return ($cmp < 0 ? -1 : 1);
            }

        });

        return $myTextFile = implode(PHP_EOL, $myArray);
    }

    echo "<pre>" . cleanMyList('emails.txt') . "</pre>";

?>

输出:

another-duplicate@email.com
hezi-gangina@gmail.com
tshiko-ve-diko@mail.ru
einlehasikuy@mertrix.com
ein-leha-sikuy@yahoo.com
metrixheshbon@yahoo.com
stus-ve-thsiko@yandex.ua
z-mkd@z-mkd.com