我想要实现的目标如下:
转换数组:
['A','B','C'];
转换为字符串:
"A is A, B is B, C is C"
除了 foreach 循环(如内爆)之外,还有其他方法可以实现此目的吗?
如果您不想循环,可以使用 array_walk() 函数。
试试这个:
$input = ['A','B','C'];
function test_alter(&$item, &$key) {
$item = $item.' is '.$item;
}
array_walk($input, 'test_alter');
echo implode(', ', $input);
输出:
A is A, B is B, C is C
$arr = ['A','B','C'];
function myfunction($arr)
{
return "$arr is $arr";
}
print_r(array_map("myfunction",$arr));
//[0] => A is A [1] => B is B [2] => C is C
将以下方式与 array_walk 一起使用
$arr = ['A','B','C'];
function _print($item2, $key)
{
echo "$item2 is $item2, ";
}
array_walk($arr, '_print');
或者如果需要保存在下面的字符串中
$arr = ['A','B','C'];
$str = '';
function _print($item2, $key)
{
global $str;
$str = $str."$item2 is $item2, ";
}
array_walk($arr, '_print');
echo trim($str,',');
这是我的建议,因为您习惯在 php 中使用 implode,所以我为您编写了一个重复函数,该函数在分隔符中采用格式化程序元素。在任何地方放置 %x 都会复制数组键,如下所示:
echo implodeDuplicate(" is %x, ", $myArray);
假设 $myArray 是:
$myArray = array(1,2,3,4);
它将输出:
1 is 1, 2 is 2, 3 is 3, 4 is 4,
功能如下:
function implodeDuplicate($seperator, $array) {
$finalString = "";
for($i = 0; $i < count($array); $i++) {
$trueSep = str_replace("%x", $array[$i], $seperator);
$finalString .= $array[$i] . $trueSep;
}
return $finalString;
}
希望对您有帮助! :)
我看到了
array_map()
和 array_walk()
解决方案,但没有人发布 array_reduce()
方法,所以我会为了完整起见。
对于小型数组(需要很少的迭代),
array_map()
的执行速度会稍微快一些(您的用户永远不会注意到差异)。
随着输入数组大小的增加,
array_reduce()
领先并远离array_map()
。如果您需要执行微优化,请使用自己的真实数据进行自己的基准测试。
array_reduce()
在 26 元素数组上循环 100 次:https://3v4l.org/1oCXM/perf#output
array_map()
在 26 元素数组上循环 100 次:https://3v4l.org/WcjMB/perf#output
我的以下方法不需要
implode()
,因为array_reduce()
输出一个字符串,但是它确实需要在每次迭代时使用条件以避免“过度粘合”。
代码:(演示)
$input = ['A', 'B', 'C'];
echo array_reduce(
$input,
fn($result, $v) => ($result ? "$result, " : '') . "$v is $v"
);
或者这里是
array_map()
,带有箭头函数语法,然后implode()
:(演示)
echo implode(
', ',
array_map(
fn($v) => "$v is $v",
$input
)
);
输出:
A is A, B is B, C is C