PHP:按域排序电子邮件

时间:2015-03-14 16:26:21

标签: php arrays function sorting explode

此功能可以完美地按字母顺序对列表进行排序并清除所有双打。

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

2 个答案:

答案 0 :(得分:2)

这应该适合你:

我刚刚改变了你的代码。首先,我使用file()抓取您的文件,我将其作为数组中的元素行,我只使用array_unique()获取唯一值。在此之后,我使用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

答案 1 :(得分:0)

$ EM =“mynam @ domain.com,第二@ 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() - 根据键
  • 按降序对关联数组进行排序