Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Оптимизация цикла\сравнения

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Есть 2 больших массива которые значения которых сравниваются, скрпт очень долго выполняется
madfun
Отправлено: 11 Октября, 2012 - 13:02:16
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Окт. 2012  


Помог: 0 раз(а)




Здравствуйте, очень нуждаюсь в помощи знающих людей.
Есть 2 больших массива значения которых сравниваются, скирпт очень долго выполняется, прошу подсказать как можно оптимизировать его либо подтолкнуть в сторону где можно найти решение.
PHP:
скопировать код в буфер обмена
  1.  
  2.  $c = 0;
  3. $co = count($colorprice);
  4. $co2 = count($BroTic);
  5. $co3 = count($SaNeTi);
  6.  
  7.         for ($key1 = 0;$key1 < $co3;$key1++) {
  8.         $identity = false;
  9.  
  10. for ($key2 = 0;$key2 < $co2;$key2++) {
  11.                 if ($BroTic[$key2][0] == $SaNeTi[$key1][0]) {
  12.                         if ($BroTic[$key2][1] == $SaNeTi[$key1][1]) {
  13.                                 if ($BroTic[$key2][2] == $SaNeTi[$key1][2]) {$identity = true;}
  14.                                                                                                                 }
  15.                                                                                                         }
  16.                                                                         }                                                                      
  17. if (!$identity) {
  18.         for ($n = 0;$n < $co;$n++)
  19.                                                         {
  20.                                                         if ($SaNeTi[$key1][5] == $colorprice[$n]['price']) {
  21.                                                                 $SaNeTi[$key1][6] = $colorprice[$n]['color'];
  22.                                                                                                                                                                 }
  23.                                                         }
  24. $coords[$c]['block'] = $SaNeTi[$key1][0]; // 'parkett links'
  25. $coords[$c]['place'] = $SaNeTi[$key1][2]; // 'x' place
  26. $coords[$c]['row'] = $SaNeTi[$key1][1]; // 'y' row
  27. $coords[$c]['x'] = $SaNeTi[$key1][3]; // X coord
  28. $coords[$c]['y'] = $SaNeTi[$key1][4]; // Y coord
  29. $coords[$c]['price'] = $SaNeTi[$key1][5]; // ticket's price
  30. $coords[$c]['color'] = $SaNeTi[$key1][6]; // price color
  31. $c+= 1;
  32.                                 }
  33.                                                                                 }
  34.  
  35.  

(Отредактировано автором: 11 Октября, 2012 - 13:02:36)

 
 Top
KingStar
Отправлено: 11 Октября, 2012 - 13:04:40
Post Id



Участник


Покинул форум
Сообщений всего: 1889
Дата рег-ции: Авг. 2011  
Откуда: Беларусь


Помог: 69 раз(а)






-----
То что программа работает, не означает что она написана правильно!
 
 Top
madfun
Отправлено: 11 Октября, 2012 - 13:34:40
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Окт. 2012  


Помог: 0 раз(а)




Если заменить
PHP:
скопировать код в буфер обмена
  1. if ($BroTic[$key2][0] == $SaNeTi[$key1][0]) {
  2.                                 if ($BroTic[$key2][1] == $SaNeTi[$key1][1]) {
  3.                                     if ($BroTic[$key2][2] == $SaNeTi[$key1][2]) {
  4.                                         $identity = true;
  5.                                         break;
  6.                                     }
  7.                                 }
  8.                             }


на
PHP:
скопировать код в буфер обмена
  1. $result = array_diff ($SaNeTi[$key1], $BroTic[$key2]);
  2.                            
  3.                            if(empty($result))
  4.                            {$identity = true;
  5.                                         break;}


то скрипт вообще виснет =(
(Добавление)
Забыл сказать в массиве SaNeTi больше значений на 2 уровне.
 
 Top
OrmaJever Модератор
Отправлено: 11 Октября, 2012 - 13:47:58
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




madfun вы бы лучше показали пример масивов и сказали исходную задачу.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
madfun
Отправлено: 11 Октября, 2012 - 13:53:18
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Окт. 2012  


Помог: 0 раз(а)




Вот примеры массивов. Сравнение используется для построения плана зала, внесенные места сравниваются с заказанными билетами.

SaNeTi
Array
(
[0] => R
[1] => 3
[2] => 1
[3] => 648
[4] => 1301
[5] => 45.00
)

BroTic
Array
(
[0] => B li.
[1] => 7
[2] => 11
[3] => 85.00
)
 
 Top
armancho7777777 Супермодератор
Отправлено: 11 Октября, 2012 - 14:25:01
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




madfun пишет:
Вот примеры массивов.

madfun, Вам выше KingStar ответил.
 
 Top
madfun
Отправлено: 11 Октября, 2012 - 14:30:06
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Окт. 2012  


Помог: 0 раз(а)




Если не затруднит, подскажите пожалуйста более подробно, тк мои эксперименты с данной функцией пока никак не могут дать результат Недовольство, огорчение
 
 Top
KingStar
Отправлено: 11 Октября, 2012 - 14:57:19
Post Id



Участник


Покинул форум
Сообщений всего: 1889
Дата рег-ции: Авг. 2011  
Откуда: Беларусь


Помог: 69 раз(а)




PHP:
скопировать код в буфер обмена
  1. $array1 = array (..., ..., ...);
  2. $array2 = array (..., ..., ...);
  3. $array_diff = array_diff($array1, $array2);
  4.  
  5. if(empty($array_diff)) { echo "Массивы одинаковы"; }
  6. else { print_r($array_diff); }

(Отредактировано автором: 11 Октября, 2012 - 14:59:31)



-----
То что программа работает, не означает что она написана правильно!
 
 Top
madfun
Отправлено: 11 Октября, 2012 - 15:03:05
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Окт. 2012  


Помог: 0 раз(а)




Я так пробовал, но видимо из-за того, что SaNeTi имеет больше записей второго уровня функция возвращает пустое значение,а array_diff_assoc() не полный список почему-то, хотя многие значения те которые должны быть.
 
 Top
KingStar
Отправлено: 11 Октября, 2012 - 15:07:29
Post Id



Участник


Покинул форум
Сообщений всего: 1889
Дата рег-ции: Авг. 2011  
Откуда: Беларусь


Помог: 69 раз(а)




читать мануалы видимо никогда не научимся Хм

Цитата:

Замечание:

Два элемента считаются одинаковыми тогда и только тогда, если (string) $elem1 === (string) $elem2. Другими словами, когда их строковое представление идентично.

Замечание:

Обратите внимание, что эта функция обрабатывает только одно измерение n-размерного массива. Естественно, вы можете обрабатывать и более глубокие уровни вложенности, например, используя array_diff($array1[0], $array2[0]);.


-----
То что программа работает, не означает что она написана правильно!
 
 Top
madfun
Отправлено: 11 Октября, 2012 - 15:21:11
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Окт. 2012  


Помог: 0 раз(а)




KingStar мануал я читал, и пробовал делать по вашему примеру еще до того как Вы его написали, Вы наверное его не заметили. (3 сообщение)

Вопрос остается актуальным, буду безмерно благодарен за любою помощь.
Спасибо всем отписавшимся.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB