Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Перебор массива


Recommended Posts

Добрый вечер. Вопрос не совсем про стандартный функционал Опенкарта, но может здешние коллеги смогут помочь...

Нужно сделать "переводчик" названий товара исходя из содержимого массива. Есть большой массив с переводами... Вот для примера маленькая часть его, чтобы было понятно:

$lang_ar['en']['часы'] = 'watches';
$lang_ar['zh']['часы'] = '时钟';
$lang_ar['en']['часы наручные'] = 'Wrist watch';
$lang_ar['zh']['часы наручные'] = '手表';
$lang_ar['en']['наручные часы'] = 'Wrist watch';
$lang_ar['zh']['наручные часы'] = '手表';
$lang_ar['en']['золото 585'] = '14K Gold';
$lang_ar['zh']['золото 585'] = '14K金';
$lang_ar['en']['золото 750'] = '18K gold';
$lang_ar['zh']['золото 750'] = '18K金';
$lang_ar['en']['серебро 925'] = 'Sterling silver';
$lang_ar['zh']['серебро 925'] = '标准纯银';
$lang_ar['en']['платина'] = 'Platinum';
$lang_ar['zh']['платина'] = '铂金';
$lang_ar['en']['титан'] = 'Titanium';
$lang_ar['zh']['титан'] = '钛';

 

Алгоритм работы должен быть такой. Берется название товара -> прогоняется по массиву для перевода -> делается транслитерация с китайского на латиницу -> профит. Использовать для этой цели всякие API гугл-переводчиков - нельзя. Только эти массивы. С транслитерацией и чем либо еще не возникает проблем. Проблемы возникают с переводом.

 

Есть название товара: 

Часы наручные "Petroff" серебро 925* 21,80гр.

Очевидно, что в массиве нету полного названия товара, поэтому название товара надо будет разбивать по кускам и искать совпадения. Причем нужно еще учесть, что фразы могут встречаться как одним словов, так и фразами целиком. Я предполагаю такой вариант действий, но сдаётся мне, что это извращение:

Скрипт ищет самую большу часть, то есть всё название товара:
Часы наручные "Petroff" серебро 925* 21,80гр



Далее он должен обрезать часть фразы до первого пробела, предположим, что обрезать будем с конца. Тогда получается:
Часы наручные "Petroff" серебро 925*
Часы наручные "Petroff" серебро
Часы наручные "Petroff"
Часы наручные  

Тут нашли совпадение "Часы наручные". Эту часть переводим и вырезаем из сходной строки. Ищем по новой, но строка уже такая:



 "Petroff" серебро 925* 21,80гр
 "Petroff" серебро 925*
 "Petroff" серебро
 "Petroff"

Хотя даже такое извращение не выходит по-человечески написать... 6-ой час уже сижу и 3-ий раз всё переписываю. Может кто подскажет более изящное решение?

Надіслати
Поділитися на інших сайтах


Жесть)) Если делать перебором по массиву, то фразу "Часы пацанские" сначала найдет -  $lang_ar['en']['часы'] = 'watches'; и переименует в watches, а вот "часы наручные" уже не найдет ;) Т.к. будет watches наручные) Можно конечно использовать полное соответствие, но это чесн говоря жестко как-то))

 

18 минут назад, ImLucky сказал:

Использовать для этой цели всякие API гугл-переводчиков - нельзя.

 

Ну можно использовать переводчик гугла и без API ;) 

К примеру https://translate.google.ru/#ru/en/Вася через парс можно взять перевод ;) Где Вася - ваше название товара) 

Змінено користувачем Leingard
Надіслати
Поділитися на інших сайтах

2 minutes ago, Leingard said:

Жесть)) Если делать перебором по массиву, то фразу "Часы пацанские" сначала найдет -  $lang_ar['en']['часы'] = 'watches'; и переименует в watches, а вот "часы наручные" уже не найдет ;) Т.к. будет watches наручные)

 

Ну можно использовать переводчик гугла и без API ;) 

К примеру https://translate.google.ru/#ru/en/Вася через парс можно взять перевод ;) Где Вася - ваше название товара) 

 

Да в том и дело, что нельзя никакими переводчиками пользоваться, кроме этого массива. Потому что там вроде как все эти переводы вручную вписывались и вылизывались. Онлайн-переводу не доверяют. 

Надіслати
Поділитися на інших сайтах


3 minutes ago, chukcha said:

foreach ($lang_ar as $code=>$langauge) {

ksort($language);
str_replace(array_key($languge), $languge, $mytext)

}

Не проверял

 

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

 

$lang_ar['zh']['настольные часы'] = '桌钟';
$lang_ar['en']['колье'] = 'necklace';
$lang_ar['zh']['колье'] = '项链';
$lang_ar['en']['украшение'] = 'decoration';
$lang_ar['zh']['украшение'] = '装饰';
$lang_ar['en']['золотые часы'] = 'golden watch';
$lang_ar['zh']['золотые часы'] = '黄金紫金手表';




$iclang->lang_ar = $lang_ar;


if($_GET['product'] == "all")
{
	$products_id = $db->query("SELECT `product_id` FROM `oc_product` WHERE 1");
	$count_products = count((array)$products_id->rows); //Сколько всего продуктов
	for ($i = 0; $count_products > $i; $i++)  //Перебираем продукты
	{	
		$product_id = $products_id->rows[$i]['product_id']; //Текущий ID продукта
		$product = $db->query("SELECT `product_id`,`name`, `language_id`  FROM `oc_product_description` WHERE `product_id`=".$product_id); //Получаем языки в названии проукта
		$product_name = $product->rows[0]['name']; // Русское название
		if($product->rows[1]['name'] == '' or $product->rows[1]['name'] == NULL) 
		{	
			//Английский перевод отсутствует			
		}

		if($product->rows[2]['name'] == '' or $product->rows[2]['name'] == NULL)
		{	
			//Китайский перевод отсутствует			
		}
	}
}

 

Как мне ваш вариант приспособить к своим реалиям? 
 

Надіслати
Поділитися на інших сайтах


Я за меня делать не прошу, но и кость собаке тоже кидать не надо. 

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

А так получается "сумничали", под предлогом "не проверял" и получается как раз из мультика "и так сойдет".

Надіслати
Поділитися на інших сайтах


Умничать? В каком виде?
Вы показали ТЗ в упрощенном варианте
Я показал алгоритм, а не решение, в упрощенном варианте

 

Далее вы даете живой код, и хотите чтоб вам показали это на живом коде..

Вы разберите  мой код и внедрите его в живой

Надіслати
Поділитися на інших сайтах

8 minutes ago, chukcha said:

Я показал алгоритм, а не решение, в упрощенном варианте

Опять же, я и не прошу решения, а наоборот - я сказал, что я не понимаю почему именно так, с вашей точки зрения, нужно решать эту задачу. Прямо не попросил подсказать, но из предложения вроде уже очевидно, что если вы подсказали решение, то можно его и объяснить. Если лень, гордость берет, денег хотите, то так и скажите. Но ради бога, только не говорите что я хочу халявы. "Живой код" - как вы сказали, я привел лишь потому, что мне показалось что вы сами не понимаете что за всем этим стоит и что так просто это не решится.  По крайней мере в контексте моего примера.

Змінено користувачем ImLucky
Надіслати
Поділитися на інших сайтах


Я посмотрел на живой код, и как раз он и решается приведенным  алгоритмом

 

А что там  объяснять?

Там все написано..

То что у вас и живой код кривой, то ладно...

А решение простое - сортировка и замена

Скорей всего нужен не ksort(), а krsort (но это не важно)
 

  • +1 1
Надіслати
Поділитися на інших сайтах

12 minutes ago, chukcha said:

Я посмотрел на живой код, и как раз он и решается приведенным  алгоритмом

 

А что там  объяснять?

Там все написано..

То что у вас и живой код кривой, то ладно...

А решение простое - сортировка и замена

Скорей всего нужен не ksort(), а krsort (но это не важно)
 

 

Кривой, не спорю, потому что без сна уже часов 30 из которых 8 на эту задачу уходило. Много чего было сделано до этого, а тут силенок уже не хватает. Надо отдыхать видимо. Утро-вечера мудренее. Но это.. всё равно, будьте попроще) 

Надіслати
Поділитися на інших сайтах


On 30.01.2018 at 8:18 PM, chukcha said:

foreach ($lang_ar as $code=>$langauge) {

ksort($language);
str_replace(array_key($languge), $languge, $mytext)

}

Не проверял

Спасибо, был не прав, вариант рабочий. Отложил эту задачу до лучших времен, отдохнул, потом взялся по новой, на свежую голову, и всё понял. По вашему примеру получилось буквально "сходу", вместо тех костылей, что я делал до этого и как описывал в первом посте. Малость не совсем так, как вы написали, но подход именно такой. Напишите в личку куда, в знак признательности,  отправить "на пиво". 

Змінено користувачем ImLucky
Надіслати
Поділитися на інших сайтах


9 минут назад, ImLucky сказал:

Напишите в личку куда, в знак признательности,  отправить "на пиво".

Купите девушке щоколадку..

Надіслати
Поділитися на інших сайтах

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.