hashmap — Как поменять элемент в соответствии с условием в PHP, где есть array_map?

Я создал массив hashmap в PHP и использовал array_map для вывода результатов.

<?php
$rule =
[
"c" => "d",
"a" => "o",
"t" => "g",
"h" => "a",
"1" => "@",
"e" => "n",
"n" => "t"];

echo join('', array_map(function($x) use($rule) { return $rule[$x]; },
str_split('cat1hen')));
?>

Он отображает вывод как «собака @ муравей». Но я хочу другой вывод. Каждый раз, когда ожидается вывод как «@», я хочу поменять местами «@», чтобы поменять его значение со следующим элементом массива.

Это означает, что выходные данные должны быть «doga @ nt» вместо «dog @ ant». Здесь позиция @ заменяется следующим элементом массива, т.е. «a». Положение следует менять только тогда, когда ожидаемый результат равен «@».

Я уже сделал это в JavaScript:

var rule = {
"c": "d",
"a": "o",
"t": "g",
"h": "a",
"1": "@",
"e": "n",
"n": "t"}

function convert(str) {
let strArr = [...str];
return strArr.map((d, i, arr) => {
if (rule[d] == '@') {
return rule[arr[i + 1]];
} else if (rule[arr[i - 1]] == '@') {
return '@';
}
return rule[d];
}).join('')
}
console.log(convert("cat1hen"))

Но я хочу использовать эту логику и в PHP. Я сделал array_map, чтобы отобразить элемент в приведенном выше PHP-коде, но если это еще не все, что меня смущает. Как это сделать в php и вывести «doga @ nt».

0

Решение

С помощью array_walk() который дает доступ к текущему индексу.

$rule =
[
"c" => "d",
"a" => "o",
"t" => "g",
"h" => "a",
"1" => "@",
"e" => "n",
"n" => "t"];

$keys = str_split('cat1hen');

$output = [];
array_walk($keys,
function($item, $index) use($rule,$keys, &$output) {
if($rule[$item] == '@' && isset($keys[$index + 1])) {
$output[] = $rule[$keys[$index + 1]];
return;
}
if(isset($keys[$index - 1]) && $rule[$keys[$index - 1]] == '@') {
$output[] = '@';
return;
}
$output[] = $rule[$item];
return;
},
$keys);
echo implode($output);

// doga@nt
0

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

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

$rule =
[
"c" => "d",
"a" => "o",
"t" => "g",
"h" => "a",
"1" => "@",
"e" => "n",
"n" => "t"];

$str = implode("", $rule);
echo $str; //doga@nt


Необязательный метод — построить массив в соответствии с вашей строкой, а затем использовать preg_replace, чтобы поменять местами буквы.

$rule =
[
"c" => "d",
"a" => "o",
"t" => "g",
"h" => "a",
"1" => "@",
"e" => "n",
"n" => "t"];

$order = str_split("cat1hen");

$str ="";
foreach($order as $key){
$str .= $rule[$key];
}

$str = preg_replace("/(.*?)(@)(.)(.*)/", "$1$3$2$4", $str);
echo $str; //doga@nt

https://3v4l.org/fk4VF

0

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