如何根据PHP中有array_map的条件交换元素?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何根据PHP中有array_map的条件交换元素?相关的知识,希望对你有一定的参考价值。

我在php中创建了hashmap数组,并使用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')));
?>

它显示输出为“dog @ ant”。但我想要不同的输出。每次都有预期的输出为“@”,我想交换“@”将其值与下一个数组元素交换。

这意味着输出应该是“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中使用这个逻辑。我在上面的PHP代码中使用了array_map来映射元素,但是如果其他部分让我感到困惑。如何在php中执行此操作并打印'doga @ nt'。

答案

使用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
另一答案

也许我已经完全忽略了这一点,但为什么不只是内爆数组,你将获得预期的输出。

$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

以上是关于如何根据PHP中有array_map的条件交换元素?的主要内容,如果未能解决你的问题,请参考以下文章

PHP 合并两个二维数组 array_map 和 array_walk 的区别

php中array_walk() 和 array_map()两个函数区别

如何在 PHP 中使用带有 array_map(...) 的数组?

如何在Angular中有条件地用不同的div包装元素

array_map 等php回调函数使用问题(关联数组下标获取)

如何在PHP中将数组元素转换为字符串?