Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сгрупировать массив 
:(
    Опции темы
armor85
Дата 6.7.2009, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Злой программер
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 6.2.2007
Где: Сочи, блин!

Репутация: нет
Всего: -1



Здравствуйте,

есть массив вида 

Код

$items = array(
   0=>array(
           'id'=>1,
           'x'=>3000,
           'y'=>2000
         ),
   1=>array(
           'id'=>2,
           'x'=>2950,
           'y'=>2005
         ),
   2=>array(
           'id'=>3,
           'x'=>1200,
           'y'=>500
         ),
 // все около 5000 тысяч
)


как можно сгруппировать элементы массива по координатам, т.ё имеем, например, шаг 30.
Начинаем перебор массива находим первый элемент добавляем в $resultArr, 
смотрим следующий элемент, если координата x ИЛИ y меньше 30 то 
добавляем второй элемент к первому, если шаг больше 30 добавляем в $resultArr

В конце должно получится массив вида
Код

array(
0=>array(
 'x'=>3000,
 'y'=>2000,
 'count'=>5 //кол-во элементов, стоящих рядом
),
0=>array(
 'x'=>1980,
 'y'=>300,
 'count'=>16 
),
0=>array(
 'x'=>600,
 'y'=>400,
 'count'=>50 
),
// и т.д
// массив, примерно, 300 элементов
)


Пока я делаю это - перебор в переборе, но получается неприлично долго.

Как сделать операцию максимально быстрой, используя, по возможности, всего один перебор?
PM MAIL   Вверх
bars80080
Дата 6.7.2009, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



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

ещё можно заранее определиться. формируем скажем двумерный массив такого вида $arr[$x][$y] = $count;
т.е. на каждую пару координат своё число. а дальше прогоняем всего один раз в цикле все элементы, усредняем их 


Код

for($i...) {
    $X = round($x/30)*30; $Y = round($y/30)*30;
    if(empty($arr[$X][$Y])) $arr[$X][$Y] = 1;
    else $arr[$X][$Y]++;
}

но в этом случае, если нам в конце не нужен именно такой массив, то придётся прогонять ещё раз для соответствующей обработки.
впрочем, получится значительно экономней по сравнению с другими вариантами
PM MAIL WWW   Вверх
armor85
Дата 7.7.2009, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Злой программер
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 6.2.2007
Где: Сочи, блин!

Репутация: нет
Всего: -1



Попробовал, получилось ещё дольше.

Проблема в том что x и y никогда не совпадают, поэтому получается ещё один большой массив,
который опять надо перебирать.


PM MAIL   Вверх
icewind
Дата 7.7.2009, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 11.4.2009
Где: Ростов-на-Дону

Репутация: 20
Всего: 20



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


--------------------
user posted image
PM MAIL Skype   Вверх
Sentox
Дата 7.7.2009, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


как то так
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 27.1.2009
Где: Зимбабве

Репутация: 7
Всего: 7



usort();?

Это сообщение отредактировал(а) Sentox - 7.7.2009, 16:33
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0476 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.