postavkin

Рейтинг
601
Регистрация
06.01.2009
Zegeberg:
Это, действительно, сложно. Не каждый так на раз вспомнит номер своего телефона. Записывать на стенке надо.

Специально для Вас поправил пункт №2. У моего хорошего знакомого 6 номеров тлф.

Да и не это главное, главное в п.3.

Aisamiery, для меня это сложновато. Я сделал через ассоциативный массив. Далее в цикле берутся id и характеристики из таб2 и сверяются с данными в массиве. Что не верно - корректируется. Время выполнения 2сек. Много ли это я не знаю.

Sitealert:
Насколько я вижу, дальше [0] дело не идёт. Этот элемент только память жрёт. Правильнее было бы так:
$idtov = $row['pole1'];

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

$mass[$id] = array("A"=>"$A", "B"=>"$B", "C"=>"$C", и т.д. 30-ть характеристик

Хотя, по моему это тоже самое что и Вы написали...

Malcolm:
Правильнее будет вообще не проверять все 30 тысяч строк в массиве, а перестроить SQL запрос так, чтобы он сразу нужные строки возвращал. Т.е. в сам запрос добавлять условия проверки, соответствует характеристика нужной или нет.

Не представляю как это возможно. [ATTACH]160167[/ATTACH]

Ведь именно, что нужно проверить каждый id в таб2, все ли его характеристики сходятся с характеристиками из таб1.

jpg 160167.jpg
danforth:
Вам нужна пакетная обработка, или же расширять лимиты на память. Но вообще, конечно, лучше все таки пакетно обрабатывать.

Мне подсказали вариант, что просто нужно как то обойтись без этих массивов.

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

ps Нет, все таки в цикле не получается, слишком долго все выполняется, что в итоге не выполняется.

Потому что он с каждым новым id из таб1, ищет такой же в таб2 каждый раз теперь, ищет и проверяет правильность данных(идет сравнение характеристик товара с id таким-то в таб1 и таб2, более 30-ти характеристик)
А раньше было просто в массиве все из первой, он шел в таб2 и тупо все по порядку id проверял.


---------- Добавлено 09.02.2017 в 20:09 ----------

Aisamiery:
как вариант вы можете не создавать массивы вообще. Для чего вы их делаете?
Нет возможности сразу вернуть дескриптор запроса и уже там где вы выводите массивы, обработать циклом while сам дескриптор?

Отвечаю цитатой того, что я написал чуть выше. Как раз попробовал. Не получается.


ps Нет, все таки в цикле не получается, слишком долго все выполняется, что в итоге не выполняется.
Потому что он с каждым новым id из таб1, ищет такой же в таб2 каждый раз теперь, ищет и проверяет правильность данных (идет сравнение характеристик товара с id таким-то в таб1 и таб2, более 30-ти характеристик)
А раньше было просто в массиве все из первой, он шел в таб2 и тупо все по порядку id проверял.

ps сравниваю, а не просто перезаписываю данные, чтобы вывести на экран инфо, какие именно характеристики и у какого id не соответствуют верным.

---------- Добавлено 09.02.2017 в 20:15 ----------

Sitealert:
Лично я по строкам распилил бы - проще скрипт получится. Полей в таблице как-то многовато, кстати, но переделывать таблицы, я так понял, уже поздно.
И да, у Вас ещё много похожих двумерных массивов заложено - это тоже не есть гут. Это как бы впечатление, не вникая в цели и задачи.

Я правильно понимаю - распилить по строкам, т.е. 30 тыс товаров сверять пакетами по 5 тыс например.

Второе - похожие двумерные массивы? Нет. Я наверное правильно сделал.

Есть id товара. Есть 30 характеристик.

mass_nazvanie_harakteristiki[$id][0] = значение_характеристики.

Далее, получая просто поочередно все id из таб2 в цикле проверяем, у данного id сходство характеристик.

т.е. что то типа

if (id_характеристика_такая_то!=mass_nazvanie_harakteristiki[$id][0]) {...}

Sitealert:
А что подсказать-то надо? Что под массив резервируется хренова куча оперативной памяти? Или как запрос к БД по частям сделать?

Я понял. Так и думал что на куски разбивать. Просто показал тут кусок, что может быть мне бы сказали, что так то и так то можно ужать данные (ну типа того), что можно с массивами сделать так то и так то...Но если нет, то как я понимаю, только один вариант.

а именно, пилить запрос к бд на несколько...

а точнее, не все 30 тыс строк получать, а по 5 тыс строк, например, итого в 6 ть заходов.

или кстати вы про вариант, что получать данные не сразу по всем полям, а по 10-ть полей....

LEOnidUKG:
30 000 строк это вообще ни о чём. Большая это от 1 млн. записей. Вот тогда надо что-то думать.

У вас что-то тормозит или что?

Вообще не тормозит, просто подумал, может есть смысл сделать так, просто чтобы ускорить загрузку. Там в блок подгрузка товаров идет, а для того чтобы вывести идет сортировка 30000 строк по характеристикам из двух столбцов. Конечно, можно замерить, но я спросил, ответ услышал. Спасибо LEOnidUKG.

oleg3d:
кажись блин пора мне на пенсию

Все, ребята, отлично!

Блин, это мне пора очки одевать.

ну надо строку не заметить с round значения, там код более сложный, чем я показал.

Проблему решил!!!Всем спасибо. Извините, что отвлек.

Sitealert:
Я на всех версиях PHP проверил. Везде нормальный результат получается.

Блин, прошу прощения, вот что показывает var_dump

float(1)

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

oleg3d, а print(gettype() показывает

double

В базе в таблице назначено decimal(8,2)

Проблема именно в вынимании из массива, в этой строке

$zakzen = $mass_zakup_zen[$x];

если её не использовать, а все делать с $mass_zakup_zen[$x] , то показывает нормально. Но все таки хотелось бы верное значение получить в zakzen

Причем

$dldl = strlen($zakzen);

показывает, что длинна = 4 знака.

Всего: 5508