[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Оптимизация пробежки по массивам
Воитель
Есть 2 массива двумерных.
Для всех элементов первого массива надо найти, из ходя из некоторых условий, соответствующий элемент во втором массиве.


for ($i=0; $i<count($vse_el); $i++) { //Перебираем все элементы которые надо сделать
$vse_el[$i]['yacheyka_sklada'] = "";

if($vse_el[$i]['uchastok'] !== 'spec') { //Спецификации физически не могут лежать на складе
for ($j=0; $j<count($ves_sklad); $j++) { //Перебираем весь склад

if($vse_el[$i]['kod_1c'] === $ves_sklad[$j]['kod_elementa_v_1s']) { //Если сейчас нужный нам элемент

if($ves_sklad[$j]['kod_v_1s'] == $kod_sklada_v_1s[$vse_el[$i]['uchastok']]) { //Если сейчас нужный нам склад

$vse_el[$i]['yacheyka_sklada'] = $j;
break;
}
}
}
}
}



Задача два в двумерном массиве найти одинаковые элементы


for ($i=0; $i<count($vse_el); $i++) { //Перебираем все элементы которые надо сделать

$element_nayden = false;

if($vse_el[$i]['tip_elementa'] !== 'komplekt_m') {//Комплекты метизов суммировать не нужно, так как у них могут быть разные спецификации

//------------------Поиск элемента в сумарном массиве---------------------{

for($k=0; $k<count($itogoviy_mas_vse_el); $k++) { //Пробегаем через весь итоговый массив

//Если элемент с таким номером продукции уже есть в сумарном массиве, $level скорее всего используется для получения отгрузочных элементов

if ($itogoviy_mas_vse_el[$k]['nomer_prod'] == $vse_el[$i]['nomer_prod']) { //Если это нужный нам элемент

//Если одного приоритета, по сути не обязательно что это из одного и того же заказа, может это график отгруки и пополнение резерва

if($itogoviy_mas_vse_el[$k]['prioritet'] == $vse_el[$i]['prioritet']) {

if($itogoviy_mas_vse_el[$k]['uchastok'] == $vse_el[$i]['uchastok']) { //Если элемент этого же тех процесса

$itogoviy_mas_vse_el[$k]['kolichestvo'] += $vse_el[$i]['kolichestvo']; //Суммируем количество

$element_nayden = true;
break; //Закрываем for($k=0; $k<count($itogoviy_mas_vse_el); $k++)
}
}
}
}

//------------------Конец Поиск элемента в сумарном массиве---------------}
}

if(!$element_nayden) { //Если такого элемента в суммарном массиве ещё не было

$itogoviy_mas_vse_el[] = $vse_el[$i]; //Добавляем элемент в суммарный массив
}
}


$vse_el = $itogoviy_mas_vse_el; //На выходе выпускаем привычный нам массив
unset($itogoviy_mas_vse_el); //Этот массив наверняка большой, надо за собой почистить




Сейчас на практике, на локальной машине - весьма мощной, первая задача выполняется порядка 4 минут. Вторая примерно 5 минут.
Как можно этот процесс ускорить? Считаю что мой вариант перебора весьма тут не подходит, ну или по крайней мере наверно надо перебирать родными функция php - они явно должны работать шустрее, но для двумерных массивом таковых не нашёл.



Спустя 2 часа, 55 минут, 54 секунды (29.06.2012 - 10:35) T1grOK написал(а):
Боюсь даже спросить, насколько большой массив, если обработка идет на минуты?

Спустя 2 часа, 54 минуты, 34 секунды (29.06.2012 - 13:30) I++ написал(а):
Пример массива в студию, код выше не очень эффективен.

Нужно как минимум менять логику построения начального массива используя некоторое подобие hash-таблиц

Спустя 3 часа, 36 минут, 6 секунд (29.06.2012 - 17:06) Воитель написал(а):
Постараюсь поподробнее объяснить что это за массивы.
Первый массив $vse_el - содержит информацию о продуктах, которые надо произвести производству.
Второй массив $ves_sklad - содержит информацию о товарах на складах.

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

Алгоритм подсчёта там весьма сложный из-за особенностей тех процесса.

По этому сначала, я хочу для каждого элемента массива $vse_el найти индекс элемента из массива $ves_sklad. Типа найти номер ячейки в которой храниться информация о количестве этого товара на складе. Для каждого элемента существует только одна ячейка склада.
Оба эти массива вытаскиваются из Mysql.
Про hash таблицы хотелось бы поподробнее, информация в инете есть, но нет конкретных примеров их применения.

Спустя 1 час, 22 минуты, 6 секунд (29.06.2012 - 18:28) I++ написал(а):
Цитата
Постараюсь поподробнее объяснить что это за массивы.


1. Пример массива для обработки.
2. Работающий код который возвращает нужный результат из примера массива.


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


Вот поэтому смотрим пункт 1.

Действуем по схеме: причина следствие

Спустя 5 минут, 31 секунда (29.06.2012 - 18:33) FatCat написал(а):
Для первого задания:
1. Сортировать оба массива по 'nomer_prod'
2. Использовать foreach()
3. Найденное собирать в новый массив.
4. Отработанное в unset(), чтобы при каждом последующем поиске зона поиска сужалась.

Я думаю, раз в 10 как минимум ускорит.

Спустя 17 минут, 12 секунд (29.06.2012 - 18:51) I++ написал(а):
do while + key + unset круче чит для больших массивов чем foreach smile.gif

Грамотно-сделанный входной массив, уже большой прирост.

Спустя 5 часов, 28 минут, 20 секунд (30.06.2012 - 00:19) sergeiss написал(а):
Цитата (Воитель @ 29.06.2012 - 18:06)
Оба эти массива вытаскиваются из Mysql.

Цитата (Воитель @ 29.06.2012 - 08:39)
Для всех элементов первого массива надо найти, из ходя из некоторых условий, соответствующий элемент во втором массиве.

Это называется JOIN и делается внутри Мускуля! А в ПХП передается только готовый результат. Не надо изобретать велосипед и "кодить" много на ПХП, лучше потратить немного времени на изучение БД smile.gif

Всё остальное, что написано в этой теме про массивы - "от лукавого" и полное извращение.

Спустя 45 минут, 9 секунд (30.06.2012 - 01:04) I++ написал(а):
Цитата (sergeiss @ 30.06.2012 - 01:19)
Цитата (Воитель @ 29.06.2012 - 18:06)
Оба эти массива вытаскиваются из Mysql.

Цитата (Воитель @ 29.06.2012 - 08:39)
Для всех элементов первого массива надо найти, из ходя из некоторых условий, соответствующий элемент во втором массиве.

Это называется JOIN и делается внутри Мускуля! А в ПХП передается только готовый результат. Не надо изобретать велосипед и "кодить" много на ПХП, лучше потратить немного времени на изучение БД smile.gif

Всё остальное, что написано в этой теме про массивы - "от лукавого" и полное извращение.

Пальцем в небо, автор пока, что не поделился инфой.

Спустя 8 часов, 46 минут, 9 секунд (30.06.2012 - 09:50) Воитель написал(а):
Цитата (sergeiss @ 30.06.2012 - 02:19)
Цитата (Воитель @ 29.06.2012 - 18:06)
Оба эти массива вытаскиваются из Mysql.

Цитата (Воитель @ 29.06.2012 - 08:39)
Для всех элементов первого массива надо найти, из ходя из некоторых условий, соответствующий элемент во втором массиве.

Это называется JOIN и делается внутри Мускуля! А в ПХП передается только готовый результат. Не надо изобретать велосипед и "кодить" много на ПХП, лучше потратить немного времени на изучение БД smile.gif

Всё остальное, что написано в этой теме про массивы - "от лукавого" и полное извращение.

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

Спустя 2 часа, 16 минут, 35 секунд (30.06.2012 - 12:07) Воитель написал(а):
Позже отпишусь.

Спустя 4 минуты, 55 секунд (30.06.2012 - 12:12) sergeiss написал(а):
Цитата (I++ @ 30.06.2012 - 02:04)
Пальцем в небо, автор пока, что не поделился инфой.

Не согласен smile.gif Было четко сказано, что данные изначально лежат в Мускуле:
Цитата (Воитель @ 29.06.2012 - 18:06)
Оба эти массива вытаскиваются из Mysql.

Всё, точка. Этого более чем достаточно. После этого можно смело говорить, что всё можно сделать внутри Мускуля.
А уж JOIN использовать или что-то другое - это уж "дело техники". Мускуль - достаточно мощная БД, там есть много разных средств. Как я уже сказал, и буду это утверждать и дальше, что надо по максимуму сделать обработку в Мускуле, а в ПХП передать готовый результат.

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

Спустя 3 часа, 3 минуты, 3 секунды (30.06.2012 - 15:15) I++ написал(а):
Думаю было бы проще решить задачу, если бы была известна структура базы, а так же какие именно операции с данными должны произойти и куда должен быть отправлен конечный результат обработки.

Цитата
Цитата
Пальцем в небо, автор пока, что не поделился инфой.


Не согласен smile.gif Было четко сказано, что данные изначально лежат в Мускуле:


laugh.gif Очень информативно


_____________
Вечно учусь.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.