|
|
|
| Здравствуйте!
Подскажите пожалуйста как можно создать из определённого массива список сортированный по своему усмотрению. Например нужно из упорядоченного по доменам масива email-адресов создать свой список чтоб все элементы с одинаковыми доменами были равноудалены друг от друга! тоесть создать список с равномерным распределением адресов по доменам | |
|
|
|
|
|
|
|
для: _deniska_
(16.09.2008 в 15:57)
| | Используйте функции, с использованием для сравнения значений функции обратного вызова (пользовательской функции). Почитайте о функциях работы с массивами, их там не одна, выберите ту, что вам подходит. Создайте свою функцию условия сравнений, получите нужную вам сортировку. | |
|
|
|
|
|
|
|
для: sim5
(16.09.2008 в 16:12)
| | так вот и проблема в том что составить функцию условия сравнения. | |
|
|
|
|
|
|
|
для: _deniska_
(16.09.2008 в 16:20)
| | Ну а вы думаете из вашей просьбы понятно чего вы хотите? | |
|
|
|
|
|
|
|
для: sim5
(16.09.2008 в 16:26)
| | сейчас приведу пример
есть массив
[0] => asd@mail.ru
[1] => qae@mail.ru
[2] => neo@mail.ru
[3] => eeu@mail.ru
[4] => xen@mail.ru
[5] => zec@mail.ru
[6] => cnn@yandex.ru
[7] => jkm@yandex.ru
а нужно получить
[0] => asd@mail.ru
[1] => qae@mail.ru
[2] => cnn@yandex.ru
[3] => neo@mail.ru
[4] => eeu@mail.ru
[5] => jkm@yandex.ru
[6] => xen@mail.ru
[7] => zec@mail.ru
то есть нужно равномерно распределить все адреса с одинаковыми доменами | |
|
|
|
|
|
|
|
для: _deniska_
(16.09.2008 в 16:49)
| | Да. Ну тогда надо сперва узнать сколько и каких доменов у вас в массиве, а уже потом распределить их равновмерно. А для чего это нужно? | |
|
|
|
|
|
|
|
для: sim5
(16.09.2008 в 17:33)
| | Посчитал количество доменов, посчитал даже как часто должен встречаться каждый домен в списке(то есть сколько элементов между одинаковыми доменами должно быть), и на этом остановился | |
|
|
|
|
|
|
|
для: _deniska_
(16.09.2008 в 17:41)
| | А зачем Вам это требуется?
2 sim5: вообще-то догадаться несложно, охота была давать коментарии на явную провокацию? | |
|
|
|
|
|
|
|
для: Trianon
(16.09.2008 в 18:10)
| | Любитель спама? :) | |
|
|
|
|
|
|
|
для: sim5
(16.09.2008 в 18:31)
| | Наверняка. | |
|
|
|
|
|
|
|
для: Trianon
(16.09.2008 в 18:49)
| | Ну тогда одно условие к автору: ФИО, адрес, отпечатки пальцев, сетчатку глаза, все заверенное нотариусом - прикрепить. ;-) | |
|
|
|
|
|
|
|
для: sim5
(16.09.2008 в 19:03)
| | Если вы подозреваете меня что я спамер, Ребят я вам скажу честно у меня мозгов не хватит чтоб это делать!!! да и разве то что мне надо может как то пригодиться при спам-рассылке | |
|
|
|
|
|
|
|
для: _deniska_
(16.09.2008 в 19:06)
| | Еще раз. Зачем Вам это надо? | |
|
|
|
|
|
|
|
для: Trianon
(16.09.2008 в 18:49)
| | >Наверняка.
И какой смысл такого распределения?
Да еще и не особо понятный порядок.
0] => asd@mail.ru
[1] => qae@mail.ru
[2] => cnn@yandex.ru
[3] => neo@mail.ru
[4] => eeu@mail.ru
[5] => jkm@yandex.ru
[6] => xen@mail.ru
[7] => zec@mail.ru
Если уж рассылать спам по базе, то какая разница какой порядок? | |
|
|
|
|
|
|
|
для: AcidTrash
(16.09.2008 в 21:49)
| | Так я и говорю что это далеко не для спама!!! | |
|
|
|
|
|
|
|
для: Trianon
(16.09.2008 в 18:10)
| | Требуеться для тестового задания.
не совсем понял где провокация? | |
|
|
|
|
|
|
|
для: _deniska_
(16.09.2008 в 18:38)
| | И что это задание тестирует? | |
|
|
|
|
|
|
|
для: Trianon
(16.09.2008 в 18:51)
| | тестирует возможность выполнения поставленной задачи! | |
|
|
|
|
|
|
|
для: _deniska_
(16.09.2008 в 18:55)
| | и какая задача требует работать с произвольным массивом e-mail адресов? | |
|
|
|
|
|
|
|
для: Trianon
(16.09.2008 в 19:25)
| | Вы наверно меня не совсем поняли, вобщем прихожу я на фирму, хочу туда устроиться, а мне говорят вот тебе тестовое задание, иди домой и сделай то то, когда сделаешь приходи! так вот задание они мне дали такое: имееться массив строк (взяты адреса только потому что у них у всех разделитель есть(@),можно использовать если вам так угодно и другой массив строк с общим разделителем в каждом элементе) и его надо упорядочить с равномерным появлением этих элементов(в моем случае доменов). | |
|
|
|
|
|
|
|
для: _deniska_
(16.09.2008 в 19:35)
| | вот и замечательно.
Теперь можете переформулировать задание так, чтобы к емэйлам оно не имело никакого отношения.
А лучше - и к доменным адресам вообще. | |
|
|
|
|
|
|
|
для: Trianon
(16.09.2008 в 19:43)
| | Хорошо, есть массив строк, в каждой строке имееться общий символ или подстрока который делит строку на две, в первой части например содержиться название магазина в каком нибудь городе, а во второй части название города в котором находиться сам магазин. Так вот, надо равномерно распределить строки по этому массиву по второй части строки(в данном примере по городам). | |
|
|
|
|
|
|
|
для: _deniska_
(16.09.2008 в 19:56)
| | применительно к и-майлам легко (да и с остальным проблем недолжно быть).... можт вместо вас устроится на работу сколько там обещают-то?
Задачу можно было решить там на месте.
Считываете всю эту лабуду в ассоц. массив, где ключём является домен... сортируете и собирате итоговый массив как душе угодно. | |
|
|
|
|
|
|
|
для: Valick
(16.09.2008 в 20:08)
| | Да это даже не совсем на работу, я бы сказал на стажеровку, поэтому много не обещают. Если можно подскажите как формировать результирующий массив, я вот подсчитал сколько элементов должно быть между одинаковыми доменами(городами), и застопорился. | |
|
|
|
|
|
|
|
для: _deniska_
(16.09.2008 в 20:17)
| | доменов(городов) может быть сколь угодно много или только два как в примере ? | |
|
|
|
|
|
|
|
для: Valick
(16.09.2008 в 23:26)
| | Сколько угодно много | |
|
|
|
|
|
|
|
для: _deniska_
(16.09.2008 в 23:55)
| | Ну тогда надо определится, как будут распологаться элементы.
вот например
/ будем назвать вещи своими именами /
есть 100 элементов mail.ru
если элементов yandex.ru 1 то порядковый номер его (100+1)/2 будет 50
если элементов yandex.ru 2 то порядковые номера (100+2)/3 будут 34 и 68 и т д.
а вот теперь расскажите как должны располагаться mail.ru, yandex.ru и rambler.ru если yandex.ru и rambler.ru одинааковые по числу элементов? | |
|
|
|
|
|
|
|
для: Valick
(17.09.2008 в 00:48)
| | В этой ситуации наверно лучше всего распологать элементы yandex.ru и rambler.ru рядом | |
|
|
|
|
|
|
|
для: Trianon
(16.09.2008 в 19:43)
| | Trianon Зачем было просить переформулировать задание если помощи от вас я так и не увидел? | |
|
|
|
|
|
|
|
для: _deniska_
(17.09.2008 в 17:06)
| | попытался такое сделать , и споткнулся на своей логике рассуждений )
примерно похоже работает
<pre><?php
$keys = array();
$outarray = array();
$array = array(
/* массив адресов */
);
$arrcount = count($array);
function keysel($val, $k){
global $keys;
$keys[ strrchr($val, '@') ][] = $k;
}
function cmp($a, $b) {
if (($a = count($a)) == ($b = count($b))) return 0;
return ($a < $b) ? 1 : -1;
}
array_walk($array,'keysel');
usort($keys, "cmp");
$coks[]= count($keys);
for($i=0; $i < $coks[0]; $i++) $coks[]= count($keys[$i])/$arrcount;
while (($arrcount - count($outarray)) > 0) {
for($i=0; $i<$coks[0]; $i++) {
while($coks[($i +1)] <= (count($keys[$i])/($arrcount - count($outarray)))
&& ($pop = array_pop($keys[$i])) !== false)
$outarray[] = $array[ $pop ];
}
}
print_r($outarray);
print_r($array);
?>
|
но в том месте где while($coks[($i +1)] <= (count($keys[$i])/($arrcount - count($outarray)))
слегка неправильная логика
и если кто-то-бы сделал вот такой-же кривоватый скрипт, то эти спамеры-работодатели возьми да и спросили-бы как ещё и перемешать эти адреса )) и наверное и понять-бы было затруднительно ) | |
|
|
|
|
|
|
|
для: _deniska_
(17.09.2008 в 17:06)
| | Чтобы Ваши последователи не наталкивались на ответы здесь.
Valick и xx77 решили войти, так это на их совести.
А мне лично равноценно, сами Вы спам рассылаете, или работодателю помогаете это делать.
А насчет помощи, так за помощь от Вас я тоже еще ничего не получил, не так ли? Какие претензии? | |
|
|
|
|
|
|
|
для: Trianon
(17.09.2008 в 23:38)
| | Какой может быть спам, вы сами подумайте, если уж и рассылать спам то какая разница в какой последовательности!!!! Я вас уверяю (вот честно говорю, ни я , ни фирма на которую я хочу пойти спам-рассылкой не занимаеться)!!!!!!! по поводу переформулировки задания: просто на примере на емейлах гораздо легче обьяснить суть задания(само задание не совсем понятное и доходит не с первого раза), ну если вы уж хотите так, то тогда помогите мне составить это задание в другой формулировке и я обещаю что все исправлю
Valick и xx77 спасибо огромное за помощь!!!! | |
|
|
|
|
|
|
|
для: _deniska_
(18.09.2008 в 00:32)
| | >Какой может быть спам, вы сами подумайте, если уж и рассылать спам то какая разница в какой последовательности!!!!
Разница очень простая. равномерное раскидывание доменов позволяет если не избежать пиковых нагрузок на почтовые ретрансляторы сооветствующих доменов, то хотя бы сгладить такие пики.
Полезно это может быть только спаммеру. (Вру. Еще программисту, который пишет софт для легальных почтовых рассылок. Но по мне - лучше я обделю помощью одного такого программиста, чем подскажу что-то потенциальному спаммеру. Заметьте, Вы свой вопрос закроете, а тема на форуме останется, и будет кормить информацией других)
>Я вас уверяю (вот честно говорю, ни я , ни фирма на которую я хочу пойти спам-рассылкой не занимаеться)!!!!!!!
Рад за вас обоих.
>Valick и xx77 спасибо огромное за помощь!!!!
На самом деле, достаточно интересная алгоритмическая задача.
И мне стоило серьезных усилий, чтобы не вписаться в процесс. | |
|
|
|
|
|
|
|
для: Trianon
(18.09.2008 в 00:42)
| | >Разница очень простая. равномерное раскидывание доменов позволяет если не избежать пиковых нагрузок на почтовые ретрансляторы сооветствующих доменов, то хотя бы сгладить такие пики.
Полезно это может быть только спаммеру.
а помоему было бы гораздо легче просто рассылать по циклу через один, зачем заморачиваться?
>Рад за вас обоих.
спасибо
>На самом деле, достаточно интересная алгоритмическая задача.
И мне стоило серьезных усилий, чтобы не вписаться в процесс.
помоему вы сами согласились что тут действительно хотели проверить мои знания!
и по поводу переформулировки, я повторюсь, помогите составить задание и я переделаю!! | |
|
|
|
|
|
|
|
для: _deniska_
(18.09.2008 в 00:54)
| | Соврал, наверно не переделаю, потому что редактировать можно только последнее сообщение | |
|
|
|
|
|
|
|
для: _deniska_
(18.09.2008 в 01:12)
| | Вот что у меня получилось:
<PRE>
<?php
$array[] = "asd@mail.ru";
$array[] = "qae@mail.ru";
$array[] = "neo@mail.ru";
$array[] = "eeu@mail.ru";
$array[] = "xen@mail.ru";
$array[] = "zec@mail.ru";
$array[] = "cnn@yandex.ru";
$array[] = "jkm@yandex.ru";
$arrcount = count($array)*count($array);
foreach ($array as $key => $value)
{
$sep=explode("@",$value);
$out[$sep[1]][]=$sep[0];
}
print_r($out);
foreach ($out as $key1 => $value1)
{
$razmer=count($value1);
$smes=round($arrcount/($razmer+1));
$s=0;
foreach ($value1 as $key2 =>$value2)
{
$s=$s+$smes;
$res[$s]=$value2."@".$key1;
}
}
print_r($res);
ksort($res);
print_r($res);
$resout=array_values($res);
print_r($resout);
?>
</PRE>
|
Осталось написать функцию которая вставляет значения в массив и если значение с определённым ключём существует, то пытается вставить в следующую по порядку ячейку.
Вобщем код надо проверить на реальной базе хотябы тыс 5 значений. | |
|
|
|
|
|
|
|
для: Valick
(18.09.2008 в 21:12)
| | > хотябы тыс 5 значений
А почему не 100000? :) | |
|
|
|
|
|
|
|
для: BinLaden
(18.09.2008 в 21:41)
| | Патамушо я скромный :) | |
|
|
|
|
|
|
|
для: Valick
(18.09.2008 в 21:45)
| | Ваш алгоритм будет перезатирать электронные адреса для всех доменов, кроме одного из них, если для каждого из доменов адресов равное количество. | |
|
|
|
|
|
|
|
для: BinLaden
(19.09.2008 в 00:54)
| | позвольте процитировать самого себя)))
Осталось написать функцию которая вставляет значения в массив и если значение с определённым ключём существует, то пытается вставить в следующую по порядку ячейку.
| |
|
|
|
|
|
|
|
для: BinLaden
(19.09.2008 в 00:54)
| | А можно $s++ сделать, в смысле ввести ещё одну переменную, что бы смещение с каждым внешним циклом сдвигалось на удиничку. Идея родилась вместе с моим пробуждением ото сна, надо её обмозговать)) | |
|
|
|
|
|
|
|
для: Valick
(19.09.2008 в 07:25)
| | Просто так не получится. Надо инкрементить начало смещения для каждых совпадающих размеров домена по отдельности. Делаем массив ключь - размер домена, значение - количество повторений, оно же и смещение. | |
|
|
|
|
|
|
|
для: Valick
(19.09.2008 в 08:32)
| | Очень хорошая задачка для начинающих, на ней можно хорошо научиться пользоваться массивами и циклами!!!!! Лично я для себя сделал очень много выводов когда решал эту задачу!!!
Всем огромное спасибо за помощь!!! | |
|
|
|
|
|
|
|
для: _deniska_
(19.09.2008 в 13:14)
| | И что у вас получилось в итоге? Покажите код. | |
|
|
|
|
|
|
|
для: Valick
(19.09.2008 в 14:16)
| | Пока ещё до конца не получилось, делаю потихоньку на основе ваших листингов.
Делаю медленно потому что я в пхп новичок!!! | |
|
|
|
|
|
|
|
для: _deniska_
(19.09.2008 в 17:15)
| | Новички начинают с:
;) | |
|
|
|
|
|
|
|
для: Valick
(19.09.2008 в 17:30)
| | Ну не настолько я новичок!! Занимаюсь примерно пол года, чуть больше. Начитался умных книжек а толку без практики нет. | |
|
|
|
|
|
|
|
для: _deniska_
(19.09.2008 в 19:24)
| | Вот "пред"окончательный алгоритм решения вашей задачи:
<PRE>
<?php
$array[] = "asd@mail.ru";
$array[] = "qae@mail.ru";
$array[] = "neo@mail.ru";
$array[] = "eeu@mail.ru";
$array[] = "xen@mail.ru";
$array[] = "zec@mail.ru";
$array[] = "cnn@yandex.ru";
$array[] = "jkm@yandex.ru";
$array[] = "jkt@rambler.ru";
$array[] = "jxo@rambler.ru";
$array[] = "kur@list.ru";
$array[] = "fre@list.ru";
$array[] = "kjg@list.ru";
$array[] = "vbr@list.ru";
$array[] = "axn@list.ru";
$array[] = "mnu@list.ru";
$array[] = "vbr@spb.ru";
$array[] = "axn@spb.ru";
$array[] = "mnu@spb.ru";
print_r($array);
$arrcount = count($array)*count($array);
foreach ($array as $key => $value)
{
$sep=explode("@",$value);
$out[$sep[1]][]=$sep[0];
}
print_r($out);
$s=0;
$smass=array();
foreach ($out as $key1 => $value1)
{
$razmer=count($value1);
$smes=round($arrcount/($razmer+1));
if(isset($smass[$smes]))
{
$smass[$smes]=$smass[$smes]+1;
}
else
{
$smass[$smes]=0;
}
print_r($smass);
$s=$smass[$smes];
foreach ($value1 as $key2 =>$value2)
{
$s=$s+$smes;
$res[$s]=$value2."@".$key1;
}
}
print_r($res);
ksort($res);
print_r($res);
$resout=array_values($res);
print_r($resout);
?>
</PRE>
|
Проверку на совпадающие элементы сознательно не делал, потому как интересно могут ли они иметь место быть? | |
|
|
|
|
|
|
|
для: Valick
(20.09.2008 в 16:11)
| | Совпадающие элементы в смысле одинаковые И-мейл адреса? Если да, то тогда имеют место быть. | |
|
|
|
|
|
|
|
для: _deniska_
(20.09.2008 в 17:38)
| | array_unique() | |
|
|
|
|
|
|
|
для: _deniska_
(20.09.2008 в 17:38)
| | Да нет, не одинаковые и-майл адреса... это уже не мои проблеммы. А претенденты на одно место в собираемом массиве. Если они будут, то окончательный массив недосчитается нескольких и-майлов. (можт мой войдёт в их число))) ) | |
|
|
|
|
|
|
|
для: _deniska_
(19.09.2008 в 13:14)
| | > Очень хорошая задачка для начинающих, на ней можно хорошо научиться пользоваться массивами и циклами!!!!!
М-О-Л-О-Д-Е-Ц, Дениска! Действительно потрясающая задачка для того, чтобы научиться пользоваться массивами и циклами!!! | |
|
|
|