Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Упорядочивания массива
 
 автор: _deniska_   (16.09.2008 в 15:57)   письмо автору
 
 

Здравствуйте!
Подскажите пожалуйста как можно создать из определённого массива список сортированный по своему усмотрению. Например нужно из упорядоченного по доменам масива email-адресов создать свой список чтоб все элементы с одинаковыми доменами были равноудалены друг от друга! тоесть создать список с равномерным распределением адресов по доменам

  Ответить  
 
 автор: sim5   (16.09.2008 в 16:12)   письмо автору
 
   для: _deniska_   (16.09.2008 в 15:57)
 

Используйте функции, с использованием для сравнения значений функции обратного вызова (пользовательской функции). Почитайте о функциях работы с массивами, их там не одна, выберите ту, что вам подходит. Создайте свою функцию условия сравнений, получите нужную вам сортировку.

  Ответить  
 
 автор: _deniska_   (16.09.2008 в 16:20)   письмо автору
 
   для: sim5   (16.09.2008 в 16:12)
 

так вот и проблема в том что составить функцию условия сравнения.

  Ответить  
 
 автор: sim5   (16.09.2008 в 16:26)   письмо автору
 
   для: _deniska_   (16.09.2008 в 16:20)
 

Ну а вы думаете из вашей просьбы понятно чего вы хотите?

  Ответить  
 
 автор: _deniska_   (16.09.2008 в 16:49)   письмо автору
 
   для: 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

то есть нужно равномерно распределить все адреса с одинаковыми доменами

  Ответить  
 
 автор: sim5   (16.09.2008 в 17:33)   письмо автору
 
   для: _deniska_   (16.09.2008 в 16:49)
 

Да. Ну тогда надо сперва узнать сколько и каких доменов у вас в массиве, а уже потом распределить их равновмерно. А для чего это нужно?

  Ответить  
 
 автор: _deniska_   (16.09.2008 в 17:41)   письмо автору
 
   для: sim5   (16.09.2008 в 17:33)
 

Посчитал количество доменов, посчитал даже как часто должен встречаться каждый домен в списке(то есть сколько элементов между одинаковыми доменами должно быть), и на этом остановился

  Ответить  
 
 автор: Trianon   (16.09.2008 в 18:10)   письмо автору
 
   для: _deniska_   (16.09.2008 в 17:41)
 

А зачем Вам это требуется?

2 sim5: вообще-то догадаться несложно, охота была давать коментарии на явную провокацию?

  Ответить  
 
 автор: sim5   (16.09.2008 в 18:31)   письмо автору
 
   для: Trianon   (16.09.2008 в 18:10)
 

Любитель спама? :)

  Ответить  
 
 автор: Trianon   (16.09.2008 в 18:49)   письмо автору
 
   для: sim5   (16.09.2008 в 18:31)
 

Наверняка.

  Ответить  
 
 автор: sim5   (16.09.2008 в 19:03)   письмо автору
 
   для: Trianon   (16.09.2008 в 18:49)
 

Ну тогда одно условие к автору: ФИО, адрес, отпечатки пальцев, сетчатку глаза, все заверенное нотариусом - прикрепить. ;-)

  Ответить  
 
 автор: _deniska_   (16.09.2008 в 19:06)   письмо автору
 
   для: sim5   (16.09.2008 в 19:03)
 

Если вы подозреваете меня что я спамер, Ребят я вам скажу честно у меня мозгов не хватит чтоб это делать!!! да и разве то что мне надо может как то пригодиться при спам-рассылке

  Ответить  
 
 автор: Trianon   (16.09.2008 в 19:32)   письмо автору
 
   для: _deniska_   (16.09.2008 в 19:06)
 

Еще раз. Зачем Вам это надо?

  Ответить  
 
 автор: AcidTrash   (16.09.2008 в 21:49)   письмо автору
 
   для: 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

Если уж рассылать спам по базе, то какая разница какой порядок?

  Ответить  
 
 автор: _deniska_   (16.09.2008 в 22:03)   письмо автору
 
   для: AcidTrash   (16.09.2008 в 21:49)
 

Так я и говорю что это далеко не для спама!!!

  Ответить  
 
 автор: _deniska_   (16.09.2008 в 18:38)   письмо автору
 
   для: Trianon   (16.09.2008 в 18:10)
 

Требуеться для тестового задания.

не совсем понял где провокация?

  Ответить  
 
 автор: Trianon   (16.09.2008 в 18:51)   письмо автору
 
   для: _deniska_   (16.09.2008 в 18:38)
 

И что это задание тестирует?

  Ответить  
 
 автор: _deniska_   (16.09.2008 в 18:55)   письмо автору
 
   для: Trianon   (16.09.2008 в 18:51)
 

тестирует возможность выполнения поставленной задачи!

  Ответить  
 
 автор: Trianon   (16.09.2008 в 19:25)   письмо автору
 
   для: _deniska_   (16.09.2008 в 18:55)
 

и какая задача требует работать с произвольным массивом e-mail адресов?

  Ответить  
 
 автор: _deniska_   (16.09.2008 в 19:35)   письмо автору
 
   для: Trianon   (16.09.2008 в 19:25)
 

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

  Ответить  
 
 автор: Trianon   (16.09.2008 в 19:43)   письмо автору
 
   для: _deniska_   (16.09.2008 в 19:35)
 

вот и замечательно.
Теперь можете переформулировать задание так, чтобы к емэйлам оно не имело никакого отношения.
А лучше - и к доменным адресам вообще.

  Ответить  
 
 автор: _deniska_   (16.09.2008 в 19:56)   письмо автору
 
   для: Trianon   (16.09.2008 в 19:43)
 

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

  Ответить  
 
 автор: Valick   (16.09.2008 в 20:08)   письмо автору
 
   для: _deniska_   (16.09.2008 в 19:56)
 

применительно к и-майлам легко (да и с остальным проблем недолжно быть).... можт вместо вас устроится на работу сколько там обещают-то?
Задачу можно было решить там на месте.
Считываете всю эту лабуду в ассоц. массив, где ключём является домен... сортируете и собирате итоговый массив как душе угодно.

  Ответить  
 
 автор: _deniska_   (16.09.2008 в 20:17)   письмо автору
 
   для: Valick   (16.09.2008 в 20:08)
 

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

  Ответить  
 
 автор: Valick   (16.09.2008 в 23:26)   письмо автору
 
   для: _deniska_   (16.09.2008 в 20:17)
 

доменов(городов) может быть сколь угодно много или только два как в примере ?

  Ответить  
 
 автор: _deniska_   (16.09.2008 в 23:55)   письмо автору
 
   для: Valick   (16.09.2008 в 23:26)
 

Сколько угодно много

  Ответить  
 
 автор: Valick   (17.09.2008 в 00:48)   письмо автору
 
   для: _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 одинааковые по числу элементов?

  Ответить  
 
 автор: _deniska_   (17.09.2008 в 01:07)   письмо автору
 
   для: Valick   (17.09.2008 в 00:48)
 

В этой ситуации наверно лучше всего распологать элементы yandex.ru и rambler.ru рядом

  Ответить  
 
 автор: _deniska_   (17.09.2008 в 17:06)   письмо автору
 
   для: Trianon   (16.09.2008 в 19:43)
 

Trianon Зачем было просить переформулировать задание если помощи от вас я так и не увидел?

  Ответить  
 
 автор: xx77   (17.09.2008 в 21:57)   письмо автору
 
   для: _deniska_   (17.09.2008 в 17:06)
 

попытался такое сделать , и споткнулся на своей логике рассуждений )
примерно похоже работает
<pre><?php
$keys 
= array();
$outarray = array();
$array = array(
/* массив адресов */
);
$arrcount count($array);
function 
keysel($val$k){
    global 
$keys;
    
$keysstrrchr($val'@') ][] = $k;
}
function 
cmp($a$b) {
    if ((
$a count($a)) == ($b count($b))) return 0;
    return (
$a  $b) ? : -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)))
слегка неправильная логика
и если кто-то-бы сделал вот такой-же кривоватый скрипт, то эти спамеры-работодатели возьми да и спросили-бы как ещё и перемешать эти адреса )) и наверное и понять-бы было затруднительно )

  Ответить  
 
 автор: Trianon   (17.09.2008 в 23:38)   письмо автору
 
   для: _deniska_   (17.09.2008 в 17:06)
 

Чтобы Ваши последователи не наталкивались на ответы здесь.
Valick и xx77 решили войти, так это на их совести.
А мне лично равноценно, сами Вы спам рассылаете, или работодателю помогаете это делать.

А насчет помощи, так за помощь от Вас я тоже еще ничего не получил, не так ли? Какие претензии?

  Ответить  
 
 автор: _deniska_   (18.09.2008 в 00:32)   письмо автору
 
   для: Trianon   (17.09.2008 в 23:38)
 

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

Valick и xx77 спасибо огромное за помощь!!!!

  Ответить  
 
 автор: Trianon   (18.09.2008 в 00:42)   письмо автору
 
   для: _deniska_   (18.09.2008 в 00:32)
 

>Какой может быть спам, вы сами подумайте, если уж и рассылать спам то какая разница в какой последовательности!!!!

Разница очень простая. равномерное раскидывание доменов позволяет если не избежать пиковых нагрузок на почтовые ретрансляторы сооветствующих доменов, то хотя бы сгладить такие пики.
Полезно это может быть только спаммеру. (Вру. Еще программисту, который пишет софт для легальных почтовых рассылок. Но по мне - лучше я обделю помощью одного такого программиста, чем подскажу что-то потенциальному спаммеру. Заметьте, Вы свой вопрос закроете, а тема на форуме останется, и будет кормить информацией других)

>Я вас уверяю (вот честно говорю, ни я , ни фирма на которую я хочу пойти спам-рассылкой не занимаеться)!!!!!!!
Рад за вас обоих.

>Valick и xx77 спасибо огромное за помощь!!!!

На самом деле, достаточно интересная алгоритмическая задача.
И мне стоило серьезных усилий, чтобы не вписаться в процесс.

  Ответить  
 
 автор: _deniska_   (18.09.2008 в 00:54)   письмо автору
 
   для: Trianon   (18.09.2008 в 00:42)
 

>Разница очень простая. равномерное раскидывание доменов позволяет если не избежать пиковых нагрузок на почтовые ретрансляторы сооветствующих доменов, то хотя бы сгладить такие пики.
Полезно это может быть только спаммеру.

а помоему было бы гораздо легче просто рассылать по циклу через один, зачем заморачиваться?


>Рад за вас обоих.

спасибо


>На самом деле, достаточно интересная алгоритмическая задача.
И мне стоило серьезных усилий, чтобы не вписаться в процесс.

помоему вы сами согласились что тут действительно хотели проверить мои знания!

и по поводу переформулировки, я повторюсь, помогите составить задание и я переделаю!!

  Ответить  
 
 автор: _deniska_   (18.09.2008 в 01:12)   письмо автору
 
   для: _deniska_   (18.09.2008 в 00:54)
 

Соврал, наверно не переделаю, потому что редактировать можно только последнее сообщение

  Ответить  
 
 автор: Valick   (18.09.2008 в 21:12)   письмо автору
 
   для: _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 значений.

  Ответить  
 
 автор: BinLaden   (18.09.2008 в 21:41)   письмо автору
 
   для: Valick   (18.09.2008 в 21:12)
 

> хотябы тыс 5 значений

А почему не 100000? :)

  Ответить  
 
 автор: Valick   (18.09.2008 в 21:45)   письмо автору
 
   для: BinLaden   (18.09.2008 в 21:41)
 

Патамушо я скромный :)

  Ответить  
 
 автор: BinLaden   (19.09.2008 в 00:54)   письмо автору
 
   для: Valick   (18.09.2008 в 21:45)
 

Ваш алгоритм будет перезатирать электронные адреса для всех доменов, кроме одного из них, если для каждого из доменов адресов равное количество.

  Ответить  
 
 автор: Valick   (19.09.2008 в 01:04)   письмо автору
 
   для: BinLaden   (19.09.2008 в 00:54)
 

позвольте процитировать самого себя)))
Осталось написать функцию которая вставляет значения в массив и если значение с определённым ключём существует, то пытается вставить в следующую по порядку ячейку.

  Ответить  
 
 автор: Valick   (19.09.2008 в 07:25)   письмо автору
 
   для: BinLaden   (19.09.2008 в 00:54)
 

А можно $s++ сделать, в смысле ввести ещё одну переменную, что бы смещение с каждым внешним циклом сдвигалось на удиничку. Идея родилась вместе с моим пробуждением ото сна, надо её обмозговать))

  Ответить  
 
 автор: Valick   (19.09.2008 в 08:32)   письмо автору
 
   для: Valick   (19.09.2008 в 07:25)
 

Просто так не получится. Надо инкрементить начало смещения для каждых совпадающих размеров домена по отдельности. Делаем массив ключь - размер домена, значение - количество повторений, оно же и смещение.

  Ответить  
 
 автор: _deniska_   (19.09.2008 в 13:14)   письмо автору
 
   для: Valick   (19.09.2008 в 08:32)
 

Очень хорошая задачка для начинающих, на ней можно хорошо научиться пользоваться массивами и циклами!!!!! Лично я для себя сделал очень много выводов когда решал эту задачу!!!

Всем огромное спасибо за помощь!!!

  Ответить  
 
 автор: Valick   (19.09.2008 в 14:16)   письмо автору
 
   для: _deniska_   (19.09.2008 в 13:14)
 

И что у вас получилось в итоге? Покажите код.

  Ответить  
 
 автор: _deniska_   (19.09.2008 в 17:15)   письмо автору
 
   для: Valick   (19.09.2008 в 14:16)
 

Пока ещё до конца не получилось, делаю потихоньку на основе ваших листингов.
Делаю медленно потому что я в пхп новичок!!!

  Ответить  
 
 автор: Valick   (19.09.2008 в 17:30)   письмо автору
 
   для: _deniska_   (19.09.2008 в 17:15)
 

Новички начинают с:
echo "Привет, МИР!";

;)

  Ответить  
 
 автор: _deniska_   (19.09.2008 в 19:24)   письмо автору
 
   для: Valick   (19.09.2008 в 17:30)
 

Ну не настолько я новичок!! Занимаюсь примерно пол года, чуть больше. Начитался умных книжек а толку без практики нет.

  Ответить  
 
 автор: Valick   (20.09.2008 в 16:11)   письмо автору
 
   для: _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>

Проверку на совпадающие элементы сознательно не делал, потому как интересно могут ли они иметь место быть?

  Ответить  
 
 автор: _deniska_   (20.09.2008 в 17:38)   письмо автору
 
   для: Valick   (20.09.2008 в 16:11)
 

Совпадающие элементы в смысле одинаковые И-мейл адреса? Если да, то тогда имеют место быть.

  Ответить  
 
 автор: mihdan   (20.09.2008 в 17:47)   письмо автору
 
   для: _deniska_   (20.09.2008 в 17:38)
 

array_unique()

  Ответить  
 
 автор: Valick   (20.09.2008 в 17:56)   письмо автору
 
   для: _deniska_   (20.09.2008 в 17:38)
 

Да нет, не одинаковые и-майл адреса... это уже не мои проблеммы. А претенденты на одно место в собираемом массиве. Если они будут, то окончательный массив недосчитается нескольких и-майлов. (можт мой войдёт в их число))) )

  Ответить  
 
 автор: BinLaden   (20.09.2008 в 22:50)   письмо автору
 
   для: _deniska_   (19.09.2008 в 13:14)
 

> Очень хорошая задачка для начинающих, на ней можно хорошо научиться пользоваться массивами и циклами!!!!!

М-О-Л-О-Д-Е-Ц, Дениска! Действительно потрясающая задачка для того, чтобы научиться пользоваться массивами и циклами!!!

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования