У меня есть простая строка: $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
, Есть моя идея:
$StrOne
(что существует в $ArrOne
), поиск в $ArrTwo
какое значение прилагается к тому же ключу (что существует в $ArrOne
).strtr();
,Выходная строка: $StrTwo = "Thkrk is my tkxt.";
,
Как создать простую функцию PHP, чтобы она делала это так?
Сначала нам нужно использовать 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);
Вы упомянули, что вы не можете использовать 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);