
Sergey
19.08.2016
10:21:30
в случае с примером Алеха мы получаем чистую арифметическую прогрессию по длинне изменяемой строки
6,8,10,12 и т.п.
я решил добавить в функцию немного кода, который может распознать арифметическую прогрессию

Anonymous*
19.08.2016
10:25:38

Google

Anonymous*
19.08.2016
10:25:53
и по-мему не обязательно A1
но я не шарю у я двоечник

Aleh
19.08.2016
10:27:40
a => 1b1
1b1 => 11c11
11c11 => 111d111
вроде тоже прогрессия, но не циклится. a1a => aaaaaa
a1a1a1a1a
закончит свое выполнение через два прогона и тоже прогрессия

Sergey
19.08.2016
10:28:22
ну и отлично )
пускай заканчивается )

Aleh
19.08.2016
10:28:52
ну, можно придумать через 40 прогонов)

Aleksandr
19.08.2016
10:49:52
только эта ошибка


Sergey
19.08.2016
10:50:33
$replace_matching = $this->replace_matching;
/**
* Рекурсивная замена
*
* В голову пришли три возможные проблемы:
* 1. Если исходная строка будет вида aaa bbb ccc, а массив соответствий будет вида array("aaa"=>"bbb", "bbb"=>"aaa")
* Решением этой проблемы стал массив $hash в котором я храню все хеши строк и если во время рекурсии хеш повторился -
* значит мы попали в бесконечную рекурсию и нужно вернуть строку, закончив выполнение функции
*
* 2. Если исходная строка будет вида aaa bbb ccc, а массив соответствий будет вида array("aaa"=>"aaa111")
* В этом случае хеши нам не помогут, т.к. строка aaa будет сначала заменена на ааа111, потом на ааа111111, потом на ааа111111111 и
* каждый раз хеш будет разный, но решение есть! Я проверяю вхождение старой подстроки(ааа) в новую подстроку(ааа111), и
* если вхождения есть, то я считаю кол-во вхождений в основной текст как старой подстроки, так и новой. Далее есть два варианта:
* a) кол-во вхождеий старой подстроки и новой отличаются, тогда все новые подстроки я заменяю старыми
* б) кол-во вхождение и старой и новой подстроки равны, тогда я пропускаю замену
*
* 3. Арифметическая прогрессия! Если на вход подать строку вида "cd", а массив соответствий будет вот такого вида: array("c"=>"1a", "d"=>"a2", "aa"=>"cd"),
* то мы попадем в бесконечную рекурсию. Но для этого случая я использую свойство арифметической проргессии An = A1+D(n-1). Соответственно, если
* с какого-то шага кол-во замен на прошлом и текущем шагу не изменилось, я добавляю в массив $progression текущую длинну строки,
* и при достижении длинны в 5 элементов проверяю соответствют ли элементы массива арифметической прогрессии
*/
$recursive_replacer = function($content, array $hash = array(), $prev_counter = 0, array $progression = array()) use($replace_matching, &$recursive_replacer) {
$hash[] = md5($content);
$counter = 0;
foreach ($replace_matching as $search => $replace) {
$replace_flag = true;
$one_phrase_counter = 0;
if (strstr($replace, $search) !== false) {
$clear_count = substr_count($content, $search);
$replace_count = substr_count($content, $replace);
if ($replace_count > 0 && $replace_count != $clear_count) {
$content = str_replace($replace, $search, $content, $one_phrase_counter);
} elseif ($replace_count == $clear_count) {
$replace_flag = false;
}
}
if ($replace_flag === true) {
$content = str_replace($search, $replace, $content, $one_phrase_counter);
$counter = $counter + $one_phrase_counter;
}
}
//Если замен не было или хеш измененной строки уже встречался в массиве $hash, то возвращаем измененную строку
if ($counter == 0 || in_array(md5($content), $hash)) {
return $content;
}
//Проверка на арифметическую прогрессию
if ($counter == $prev_counter) {
$progression[] = mb_strlen($content);
if (count($progression) > 5) {
$D = $progression[count($progression) - 1] - $progression[count($progression) - 2];
$is_progression = true;
for ($i = (count($progression) - 4); $i <= count($progression); $i++) {
$A = $progression[0] + $D * ($i - 1);
if ($progression[$i - 1] != $A) {
$is_progression = false;
}
}
if ($is_progression == true) {
return $content;
}
}
}
return $recursive_replacer($content, $hash, $counter, $progression);
};
Вот
всё, ничего не буду больше трогать )


(;¬_¬)
19.08.2016
10:50:56
ничего нет
погоди... как ничего нет.... а тут где ошибка вылетает? https://github.com/iamdevice/opencart-spsr-integration/blob/master/admin/controller/shipping/spsr.php

Google

Aleksandr
19.08.2016
10:51:15
нет
у меня ощущение что он валится на переключении фильтра на следующую порцию

(;¬_¬)
19.08.2016
10:51:40
О_о...
просто кроме как вот тут у тебя в файле это нигде не юзается
https://github.com/iamdevice/opencart-spsr-integration/blob/master/admin/controller/shipping/spsr.php#L98-L100
и он тут не выкидывает ошибку?

Aleh
19.08.2016
10:54:44
Вот
чет вообще не работает)

Sergey
19.08.2016
10:54:50
Раобтает )

Aleh
19.08.2016
10:54:59
$replace_matching = [
"aa" => "cd",
"c" => "1a",
"d" => "a2"
];
echo $recursive_replacer("ac");

Sergey
19.08.2016
10:55:22
ну бля...
ща )

Sergey
19.08.2016
11:00:16
http://www.phpthewrongway.com/

Aleh
19.08.2016
11:00:16
$replace_matching = [
"a" => "1b1",
"1b1" => "11c11",
"11c11" => "111d111"
];
echo $recursive_replacer("a");

Sergey
19.08.2016
11:03:02

Aleh
19.08.2016
11:03:29

Sergey
19.08.2016
11:04:09

Aleh
19.08.2016
11:04:28
и кстати

Sergey
19.08.2016
11:05:39
Короче, бог с ним. Схожу и узнаю как правильно....ну, если не окажется, что нужно было в php.ini максимальную рекурсию установить или что-то типа того )

Google

Sergey
19.08.2016
11:11:21
парни, спасибо за помощь еще раз

Aleksandr
19.08.2016
11:22:37
в общем разобрался я с косяком
я в классе фильтра указал неправильное присваивание для конечной строки
и вот теперь другой вопрос… время работы скрипта увеличилось на порядок
в какую сторону курить в плане оптимизации?

Sergey
19.08.2016
11:24:33
это ты с PHPЭкселем?
сделал разбитие на чанки?

Aleksandr
19.08.2016
11:29:33
да
щас проверю последние правки и запушу
за 4 минуты только 3000 строк из 58к ?

Sergey
19.08.2016
11:35:34
ты онлидата тоже флажек поставил?
Ну, вообще, у меня 100 меговый файл где-то 4 часа порциями по 2000 лопатился )

[Anonymous]
19.08.2016
11:36:32
Салам мужики , Yii2 или CakePHP ?

F01134H
19.08.2016
11:38:29
Laravel

Vadim
19.08.2016
11:38:57
а может вообще silex? смотря зачем

[Anonymous]
19.08.2016
11:40:29
собрался выучить framework , не могу определится

Никто ??
19.08.2016
11:46:05
Зачем старье всякое учить
Учи laravel, выучишь будешь в коворкинге бесплатное смузи получать

[Anonymous]
19.08.2016
11:47:06
м,а laravel за границой популярен ?
то есть e-work

Артур Евгеньевич
19.08.2016
11:47:15

Google

Никто ??
19.08.2016
11:47:21
В зависимости от того насколько ты популярен
За границей

Артур Евгеньевич
19.08.2016
11:47:33
а если нет то и Yii сойдет)
но я вно не cakePhp

боль
19.08.2016
11:48:07
kekPHP

[Anonymous]
19.08.2016
11:48:07
просто по запросу в гугл . мне приходит cakephp top 1

Никто ??
19.08.2016
11:49:04
Да yii2 уже морально устарел в сравнении с laravel, не говоря о пироге каком-то
Вообще впервый раз слышу о таком

Admin
ERROR: S client not available

Aleksandr
19.08.2016
11:49:28
onlydata тоже поставил

Артур Евгеньевич
19.08.2016
11:49:44
щас бы в разговор хорошо вписался фрик с криками бросайте PHP учите Ruby))

Никто ??
19.08.2016
11:49:57
Пфф руби

(;¬_¬)
19.08.2016
11:49:59
бросайте PHP учите Python!
?

Aleksandr
19.08.2016
11:50:07

боль
19.08.2016
11:50:16
Бросайте кодить, идите на завод!

Никто ??
19.08.2016
11:50:25
Даже хипстеры отморозки уже руби свой бросили

Артур Евгеньевич
19.08.2016
11:50:27
Бросайте программирование возите молоко) http://www.city-n.ru/view/383558.html

?
19.08.2016
11:50:31

Google

?
19.08.2016
11:50:36
выгоните его ?

(;¬_¬)
19.08.2016
11:50:40
??

Никто ??
19.08.2016
11:50:45
Давненько не видел этих аутяг который везде свой рубин толкают.

Артур Евгеньевич
19.08.2016
11:50:47
это у нас в глубинке) сколько же в москве молоково з получает

?
19.08.2016
11:50:56
я вот поел вкусно мяса

Vadim
19.08.2016
11:50:57

?
19.08.2016
11:51:00
залил пивом

Vatasik
19.08.2016
11:51:02
бросайте работать, помогайте детям в африке

?
19.08.2016
11:51:05
как работать теперь?

Vatasik
19.08.2016
11:51:32

Никто ??
19.08.2016
11:51:34
Зачем работать если ты уже поел?

[Anonymous]
19.08.2016
11:51:51
??????

боль
19.08.2016
11:51:52

Никто ??
19.08.2016
11:51:54
Вот если нечего есть можно и поработать

Артур Евгеньевич
19.08.2016
11:52:01
от одного молоковоза толку больше чем от двух питонистов)) https://s.mail.ru/Fm2c/8hbxov6VB

Vatasik
19.08.2016
11:52:18

(;¬_¬)
19.08.2016
11:52:25

?
19.08.2016
11:52:44
солнце ещё высоко

[Anonymous]
19.08.2016
11:52:50
кстати Python!

(;¬_¬)
19.08.2016
11:52:57