Как заменить строку с данными из двух массивов в PHP?

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

$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, чтобы она делала это так?

1

Решение

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

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

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

Далее мы используем 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));

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

$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);
1

Другие решения

Вы упомянули, что вы не можете использовать 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);

Живая демо

0

По вопросам рекламы [email protected]