@msimrial

Не работает преобразование strtr?

<?php
class UpdateForSearch
{
    public function connect_db()
    {
        $params = parse_ini_file('../config.ini');

        if (!is_array($params)) {
            throw new Exception("Error #1");
        } else {
            $db = new PDO($params['db.conn'], $params['db.user'], $params['db.pass']);
            $db->setAttribute (PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
        return $db;
    }

    function encodestring($st)
    {
        // Сначала заменяем "односимвольные" фонемы.
        $st=strtr($st,"абвгдеёзийклмнопрстуфхъыэ_",
            "abvgdeeziyklmnoprstufh\'iei");
        $st=strtr($st,"АБВГДЕЁЗИЙКЛМНОПРСТУФХЪЫЭ_",
            "ABVGDEEZIYKLMNOPRSTUFH'IEI");
        // Затем - "многосимвольные".
        $st=strtr($st,
            array(
                "ж"=>"zh", "ц"=>"ts", "ч"=>"ch", "ш"=>"sh",
                "щ"=>"shch","ь"=>"", "ю"=>"yu", "я"=>"ya",
                "Ж"=>"ZH", "Ц"=>"TS", "Ч"=>"CH", "Ш"=>"SH",
                "Щ"=>"SHCH","Ь"=>"", "Ю"=>"YU", "Я"=>"YA",
                "ї"=>"i", "Ї"=>"Yi", "є"=>"ie", "Є"=>"Ye"
            )
        );
        // Возвращаем результат.
        return $st;
    }
    function str_to_bred($st)
    {
        // Сначала заменяем "односимвольные" фонемы.
        $st=strtr($st,"абвгдеёзийклмнопрстуфхъыэ_",
            "f,dult`pbqrkvyjghcnea[}s'");
        $st=strtr($st,"АБВГДЕЁЗИЙКЛМНОПРСТУФХЪЫЭ_",
            "F,DULT`PBQRKVYJGHCNEA[}S'");

        return $st;
    }

    function getNameAndDesc($id_product){
        $db = $this->connect_db();

        $name = "select name,description from ps_product_lang where id_lang = 1 and id_product = ?";
        $stmt = $db->prepare($name);
        $stmt->execute(array((int)$id_product));
        $result = $stmt->fetch(PDO::FETCH_NUM);

        return $result;
    }

    function updateProduct($id_product){
        $nd = $this->getNameAndDesc($id_product);

        if(!empty($nd)){
            $fragment = explode(" ",$nd[0]);

            foreach ($fragment as $item) {
                $first_rest[] = $this->encodestring($item);
                $first_rest[] =  $this->str_to_bred($item);
            }
            print_r($first_rest);
        }
    }


}
$cl = new UpdateForSearch();
$cl->updateProduct(68);


Выводит :
Array ( [0] => i�ilihm�ibm� [1] => '�'k'[v�',v� [2] => Sand [3] => Sand [4] => iem�i'm�m�isieism�ibieisi�i�m�iu [5] => '�v�'sv�v�'c't'cv�','�'c'�'�v�'e [6] => 1 [7] => 1 [8] => i' [9] => 's )

Я посмотрел по поводу этого наешел mb_ функции но пока не понимаю мне просто каждую сначало искать потом заменять или как то по другому можно?
  • Вопрос задан
  • 718 просмотров
Решения вопроса 1
R0dger
@R0dger
Laravel/Yii/2 AngularJs PHP RESTful API
У вас скорее всего кодировка UTF-8, поэтому используйте вместо strtr - mb-strstr
а если вам нужен SLUG нормальный, то все придумано до Вас - https://github.com/2amigos/transliteration-helper
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@inDeepCode
Проблема с кодировкой в базе.
$link = mysql_connect('localhost', 'user', 'password');
mysql_set_charset('utf8',$link);
Ответ написан
@WhiteSEOMagic
Как сказано в документации функции strtr php.net/manual/ru/function.strtr.php :
Если указаны три аргумента, эта функция возвращает копию str, в которой все вхождения каждого символа (однобайтного) из from были заменены на соответствующий символ в параметре to, т.е. каждое вхождение из $from[$n] заменяется на $to[$n], где $n это корректное смещение строки в обоих аргументах.

То есть, для многобайтовой кодировки вместо конструкции:
$st=strtr($st,"абв","abv");
... следует использовать конструкцию:
$st=strtr($st,
  array(
    "а" => "a",
    "б" => "b",
    "в" => "v",
  )
);

... несмотря на то, что мы заменяем только по одному символу - ведь эти символы многобайтные.
mb_strtr
Скорее всего именно поэтому функция mb_strtr отсутствует, так как в ней нет необходимости, достаточно использовать strtr. Хотя с точки зрения юзабилити удобнее было бы писать mb_ для многобайтовых кодировок, так привычнее.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы