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
Форумы портала PHP.SU :: Версия для печати :: Поочередная замена значенний массива
Форумы портала PHP.SU » » Вопросы новичков » Поочередная замена значенний массива

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

1. qtk - 16 Декабря, 2013 - 14:00:40 - перейти к сообщению
Здравствуйте. Помогите пожалуйста как значение одного массива заменить на значение второго?
PHP:
скопировать код в буфер обмена
  1.  
  2.  $str = 'тут текст %s, а тут число %i и снова текст %s';
  3.  $arr1 = array('%s', '%i', '%s');
  4.  $arr2 = array('трололо', 123, 'ололо');
  5.  

В итоге надо получить строку 'тут текст ТРОЛОЛО, а тут число 123 и снова текст ОЛОЛО'
Спасибо!
2. IllusionMH - 16 Декабря, 2013 - 14:11:22 - перейти к сообщению
qtk, почитайте комментарии к sptintf
Там много различных реализаций сделали.

А если дать уникальные имена для замен, тогда можно спокойно передать 2 массива в preg_replace.
Либо в цикле забирать первые элементы двух массивов, и менять через preg_replace ограничив кол-во замен до 1.
3. teddy - 16 Декабря, 2013 - 14:11:39 - перейти к сообщению
Цитата:
В итоге надо получить строку 'тут текст ТРОЛОЛО, а тут число 123 и снова текст ОЛОЛО'

Если нужно именно 2 массива тогда см. http://www.php.net/function.array-replace
но тут даже можно 1 массивом обойтись
PHP:
скопировать код в буфер обмена
  1. $str = 'тут текст %s, а тут число %d и снова текст %s';
  2. $arr = array('трололо', 123, 'ололо');
  3. printf("$str", $arr[0],$arr[1],$arr[2]);
4. qtk - 16 Декабря, 2013 - 14:44:52 - перейти к сообщению
[quote=teddy][/quote] у меня не стандартные модификаторы.
5. EuGen - 16 Декабря, 2013 - 16:54:34 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $str = 'тут текст %s, а тут число %i и снова текст %s';
  2. $arr1 = array('%s', '%i', '%s');
  3. $arr2 = array('трололо', 123, 'ололо');
  4. $i    = 0;
  5.  
  6. $result = array_reduce($arr1, function($current, $item) use ($arr2, &$i)
  7. {
  8.    return $current = preg_replace('/'.preg_quote($item).'/', $arr2[$i++], $current, 1);
  9. }, $str);
  10.  
  11. //var_dump($result);

?
6. qtk - 17 Декабря, 2013 - 06:36:30 - перейти к сообщению
В принципе я изначально не правильно сформулировал вопрос. Нужно не массив на массив заменить, а элементы в строке, согласно порядку массива.
(Добавление)
EuGen пишет:
PHP:
скопировать код в буфер обмена
  1. $str = 'тут текст %s, а тут число %i и снова текст %s';
  2. $arr1 = array('%s', '%i', '%s');
  3. $arr2 = array('трололо', 123, 'ололо');
  4. $i    = 0;
  5.  
  6. $result = array_reduce($arr1, function($current, $item) use ($arr2, &$i)
  7. {
  8.    return $current = preg_replace('/'.preg_quote($item).'/', $arr2[$i++], $current, 1);
  9. }, $str);
  10.  
  11. //var_dump($result);

?

Думую код работает, но постораюсь найти решение попроще.
7. Invert - 17 Декабря, 2013 - 06:58:49 - перейти к сообщению
Проще всего:

PHP:
скопировать код в буфер обмена
  1.  
  2. $string = str_replace(
  3.     array( '%a%', '%b%', '%c%' ),
  4.     array( 'A', 'B', 'C' ),
  5.     'Это %a% просто %b% строка %c%'
  6. );
  7.  
8. qtk - 17 Декабря, 2013 - 08:12:44 - перейти к сообщению
Invert пишет:
Проще всего:

PHP:
скопировать код в буфер обмена
  1.  
  2. $string = str_replace(
  3.     array( '%a%', '%b%', '%c%' ),
  4.     array( 'A', 'B', 'C' ),
  5.     'Это %a% просто %b% строка %c%'
  6. );
  7.  

Не проще, так как модификаторы повторяются и однотипные заменяется все одним значением, а не в соответствии с массивом.
9. Invert - 17 Декабря, 2013 - 08:23:32 - перейти к сообщению
Ну простите меня, я то хотел помочь, а там оказывается модификаторы повторяются, да еще и однотипный заменяются все одним значением.

Может нормальный, развернутый пример, чтобы без трололо?
10. qtk - 17 Декабря, 2013 - 09:57:13 - перейти к сообщению
Не в коем случае не хотел ни кого обидеть. Вот пример
PHP:
скопировать код в буфер обмена
  1.  
  2. $arg = array('text1', 123, 'text2 *');
  3. $sql = 'SELECT * FROM ?s WHERE id= ?i and text=?s';
  4. preg_match_all('#\?[sifanb]{1}#', $sql, $format);
  5. if(count($arg) === count($format[0]))
  6. {
  7.     for($i = 0; $i < count($arg); $i++)
  8.     {
  9.         if($format[0][$i] == '?s' and !is_string($arg[$i])) die('no str ');
  10.         elseif($format[0][$i] == '?i' and !is_int($arg[$i])) die('no int ');
  11.         else $b = TRUE;
  12.     }
  13.     if($b === TRUE)
  14.     {
  15.         //Тут какой-то код замены в строке
  16.     }
  17.     echo $sql;
  18. }
  19.  

Прошу код не комментировать это так быстрые наброски

 

Powered by ExBB FM 1.0 RC1