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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Multibyte strtr

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Помогите дописать
Viper
Отправлено: 04 Августа, 2010 - 10:37:16
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




На одном форуме есть тема

С неё и начал. Проблема в том что хочется чтобы функция работала так же как и нативная в php. Т.е. можно было бы указывать 2 параметра вместо 3х: 1 строка, 2 ассоциативный массив с ключ=>значение.

На данный момент есть вот что

PHP:
скопировать код в буфер обмена
  1. function mb_strtr($str, $from, $to='') {
  2.         $keys = array();
  3.         $values = array();
  4.  
  5.         if (empty($to) && is_array($from)) {
  6.                 $keys_temp = array_keys($from);
  7.                 $values_temp = array_values($from);
  8.                 preg_match_all('/./u', $keys_temp, $keys);
  9.                 preg_match_all('/./u', $values_temp, $values);
  10.                 $mapping = array_combine($keys[0], $values[0]);
  11.  
  12.                 return strtr($str, $mapping);
  13.         } else {
  14.                 preg_match_all('/./u', $from, $keys);
  15.                 preg_match_all('/./u', $to, $values);
  16.                 $mapping = array_combine($keys[0], $values[0]);
  17.  
  18.                 return strtr($str, $mapping);
  19.         }
  20. }


Проблема с первой частью if'а. Т.е. в preg_match нужно передавать 2-ым параметром строку, а не массив как у меня.

Как можно обойти данную проблему "меньшей кровью" ?


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
JustUserR
Отправлено: 04 Августа, 2010 - 15:14:47
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Viper пишет:
Как можно обойти данную проблему "меньшей кровью" ?
По идее в том случае когда вашей функции передается массив с заменяемыми символами - то выполнять никаких дополнительных преобразований не требуется поскольку данные и так находятся в требуемом формате Но так как основной целью видимо является использования регулярного выражения с multibyte-модификатором - то можно сначала выполнить преобразование переданного массива в строку - а потом обработать его с помощью того PHP-кода который приведен в else-ветки По идее отражение сущности работы с multibyte-строками должно сохраниться - потому что в той части PHP-кода которая претерпела изменение использовалось полное копирование строк без их посимвольного разбора - и соответственно если даже трактуемая кодировка была неправильной то строки остались неизменными
Конкретно имелся в виду следующий PHP-код
PHP:
скопировать код в буфер обмена
  1. function mb_strtr($str, $from, $to='') {
  2.         $keys = array();
  3.         $values = array();
  4.         if (empty($to) && is_array($from)) {
  5.                 $keys_temp = array_keys($from);
  6.                 $values_temp = array_values($from);
  7.                 $fr_str=""; $to_str="";
  8.                 for($i=0; $i<count($keys_temp); $i++)  
  9.                 {$fr_str.=$keys_temp[$i]; }
  10.                 for($i=0; $i<count($values_temp); $i++)  
  11.                 {$to_str.=$values_temp[$i]; }
  12.         } else {
  13.                 $fr_str=$from;
  14.                 $to_str=$to;
  15.         }
  16.                 preg_match_all('/./u', $fr_str, $keys);
  17.                 preg_match_all('/./u', $to_str, $values);
  18.                 $mapping = array_combine($keys, $values);
  19.                 return strtr($str, $mapping);
  20. }
Если же вам необходимо обрабатывать с помощью регулярного выражения каждую переданную односимольную строку отдельно - то можно использовать обработку переданного хеш-массива в цикле и передачу в регулярное выражение конкретной выбранной односимвольной строки из одного символа - а в качестве массива для замен использовать временный локальный массив содеражщий всегда только одино значение которое будет использоваться в array_push для основного массива


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB