2016-07-17 2 views
1

У меня есть простая строка: $StrOne = "There is my text.";. И у меня есть 2 простых массивов, тоже:Как заменить строку данными, из 2 массивов, на PHP?

$ArrOne = array (

"1" => "a", 
"7" => "e", 
"5" => "c", 
"4" => "x", 
"2" => "r" 

); 

-

$ArrTwo = array (

"7" => "k", 
"9" => "z", 
"1" => "y", 
"3" => "x", 
"2" => "b" 

); 

Я хочу заменить $StrOne со значениями из $ArrOne, значениями из $ArrTwo. Существует моя идея:

  • Шаг 1. Если есть группа письма в $StrOne (что существует в $ArrOne), поиск в $ArrTwo, какое значение придается который тот же ключ (что существует в $ArrOne).
  • Шаг 2. Замените все существующие значения (с Шаг 1.) с помощью этой функции: strtr();.
  • Шаг 3. Отобразите новую выходную строку (которая полностью заменена, от Шаг 2.).

Выходная строка: $StrTwo = "Thkrk is my tkxt.";.


Как создать простую функцию PHP, чтобы она сделана так?

+0

как насчет http://php.net/manual/ru/function.str-replace.php? –

+0

Постарайтесь нам решить эту проблему. – BeetleJuice

+0

@BeetleJuice, я попытался решить свою проблему, используя эту функцию: '$ length = count ($ arrayOne); for ($ i = 0; $ i <$ length; $ i ++) { $ replacement [$ arrayOne [$ i]] = $ arrayTwo [$ i]; } echo strtr ($ string, $ replacement); '. Но он работает только с одномерным массивом. – 16ctt1x

ответ

1

Для начала нужно использовать array_intersect_key, чтобы найти ключи, которые присутствуют в обоих массивах.

Во-вторых, мы сортируем пересекающиеся массивы, поэтому их ключи были в том же порядке с ksort.

В-третьих, мы используем array_combine для создания второго параметра для функции strtr.

Forth мы используем strtr:

$arrayOne = array (
    "1" => "a", 
    "7" => "e", 
    "5" => "c", 
    "4" => "x", 
    "2" => "r" 
); 

$arrayTwo = array (
    "7" => "k", 
    "9" => "z", 
    "1" => "y", 
    "3" => "x", 
    "2" => "b" 
); 

$keys = array_intersect_key($arrayOne, $arrayTwo); 
ksort($keys); 
$values = array_intersect_key($arrayTwo, $arrayOne); 
ksort($values); 

echo strtr('There is my text.', array_combine($keys, $values)); 

Update: для более старых версий попробовать:

$replace = array(); 
foreach ($arrayOne as $k => $v) { 
    // use isset if you want to replace something with empty string 
    if (!empty($arrayTwo[$k])) {  
     $replace[$v] = $arrayTwo[$k]; 
    } 
} 

echo strtr('There is my text.', $replace); 
+0

Прошу прощения, я не хочу использовать эти функции: [array_intersect_key] (http://php.net/manual/en/function.array-intersect-key.php) и [array_combine] (http: // php .net/ручной/EN/function.array-combine.php); потому что, мой сервер слишком * не обновлен *. – 16ctt1x

+0

Ваш php не php5? –

+0

Да, мой сервер по-прежнему работает * PHP 4 *. Не могли бы вы предложить другой ответ? – 16ctt1x

0

Вы упомянули, что вы не можете использовать array_intersect. Это, как я хотел бы сделать это:

//remove anything from $arrayOne that doesn't have a replacement 
// in $arrayTwo 
$arrayOne = array_filter(
    $arrayOne, 
    function($k) use($arrayTwo){return isset($arrayTwo[$k]);}, 
    ARRAY_FILTER_USE_KEY); 

//remove anything from $arrayTwo that doesn't have a match 
//in $arraaOne 
$arrayTwo = array_filter(
    $arrayTwo, 
    function($k) use($arrayOne){return isset($arrayOne[$k]);}, 
    ARRAY_FILTER_USE_KEY); 

//sort the keys so that matching keys will be in same position 
ksort($arrayOne); ksort($arrayTwo); 

//Now arrays have the same keys in the same position. 
//It's safe to perform the replacement 
$stringOut = str_replace($arrayOne,$arrayTwo,$stringInp); 

Live demo

+0

В моем коде не было 26 строк. Кроме того, я проверил перед публикацией. Я даже дал вам ссылку на живую демонстрацию, чтобы вы могли видеть, как она работает для вас. – BeetleJuice

+0

В этой строке: 'function ($ k) use ($ arrayTwo) {return isset ($ arrayTwo [$ k]);}'. – 16ctt1x

+0

'use' нуждается в версии 5.3 – trincot

Смежные вопросы