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
此函数非常适合按字母顺序对列表进行排序并清除所有双打。
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