PHP: сортировка писем по доменам


Эта функция отлично работает для сортировки списка по алфавиту и очистки всех двойников.

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

Этот скрипт работает просто отлично, но теперь я хочу снова отсортировать его по поставщику электронной почты (другими словами: по домену), чтобы список был отсортирован дважды, сначала по алфавиту, а затем по поставщику электронной почты.

Вот пример:

Электронные письма.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

Электронная почта.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 2

2 ответа:

Это должно сработать для вас:

Я просто немного изменил ваш код. Сначала я беру твое досье с собой.file() где я получаю ever line как элемент в массиве, где я беру только уникальные значения с 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

$em="mynam@domain.com,second@second.com, third@third.com,fourth@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 () - сортировка ассоциативные массивы в порядке убывания, согласно ключу