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
Форумы портала PHP.SU :: Версия для печати :: Оптимизация цикла\сравнения
Форумы портала PHP.SU » » Вопросы новичков » Оптимизация цикла\сравнения

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

1. madfun - 11 Октября, 2012 - 13:02:16 - перейти к сообщению
Здравствуйте, очень нуждаюсь в помощи знающих людей.
Есть 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.  
2. KingStar - 11 Октября, 2012 - 13:04:40 - перейти к сообщению
3. madfun - 11 Октября, 2012 - 13:34:40 - перейти к сообщению
Если заменить
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 уровне.
4. OrmaJever - 11 Октября, 2012 - 13:47:58 - перейти к сообщению
madfun вы бы лучше показали пример масивов и сказали исходную задачу.
5. madfun - 11 Октября, 2012 - 13:53:18 - перейти к сообщению
Вот примеры массивов. Сравнение используется для построения плана зала, внесенные места сравниваются с заказанными билетами.

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
)
6. armancho7777777 - 11 Октября, 2012 - 14:25:01 - перейти к сообщению
madfun пишет:
Вот примеры массивов.

madfun, Вам выше KingStar ответил.
7. madfun - 11 Октября, 2012 - 14:30:06 - перейти к сообщению
Если не затруднит, подскажите пожалуйста более подробно, тк мои эксперименты с данной функцией пока никак не могут дать результат Недовольство, огорчение
8. KingStar - 11 Октября, 2012 - 14:57:19 - перейти к сообщению
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); }
9. madfun - 11 Октября, 2012 - 15:03:05 - перейти к сообщению
Я так пробовал, но видимо из-за того, что SaNeTi имеет больше записей второго уровня функция возвращает пустое значение,а array_diff_assoc() не полный список почему-то, хотя многие значения те которые должны быть.
10. KingStar - 11 Октября, 2012 - 15:07:29 - перейти к сообщению
читать мануалы видимо никогда не научимся Хм

Цитата:

Замечание:

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

Замечание:

Обратите внимание, что эта функция обрабатывает только одно измерение n-размерного массива. Естественно, вы можете обрабатывать и более глубокие уровни вложенности, например, используя array_diff($array1[0], $array2[0]);.
11. madfun - 11 Октября, 2012 - 15:21:11 - перейти к сообщению
KingStar мануал я читал, и пробовал делать по вашему примеру еще до того как Вы его написали, Вы наверное его не заметили. (3 сообщение)

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

 

Powered by ExBB FM 1.0 RC1