在PHP数组的每个项前添加一个前缀

91

我有一个PHP数字数组,我想在每个数字前加上负号(-)。我认为通过使用 explode 和 implode 可以实现,但我的php知识不足以实际操作。任何帮助将不胜感激。

本质上,我想从这个状态转变为:

$array = [1, 2, 3, 4, 5];

变成这样:

$array = [-1, -2, -3, -4, -5];
任何想法?
8个回答

172

一种优雅的方式来给数组值添加前缀(PHP 5.3+):

$prefixed_array = preg_filter('/^/', 'prefix_', $array);

此外,这比使用foreach循环快三倍以上。


9
我认为这是最佳答案,主要因为它非常快。还值得一提的是 preg_replace,它做的事情大致相同,但它总是返回一个大小相同的数组,对于不匹配正则表达式的项,返回未修改的项。它在版本要求方面也比较轻(存在于PHP4中,而 preg_filter 要求PHP版本 >= 5.3.0)。 - dbm
1
有没有办法添加后缀? - AvikB
18
要添加后缀,只需使用 $ 锚点:preg_filter('/$/', '_后缀', $array); - Dávid Horváth
2
谢谢,我已经弄明白了 preg_filter('/^(.*?)$/', '$0*', $array),它确实有效,但我喜欢你的方法,更简洁。再次感谢您的帮助 :) - AvikB
1
谢谢,这是最好的答案,但是我喜欢 preg_replace 的方法。 - Luu Hoang Bac
显示剩余5条评论

113

简单:

foreach ($array as &$value) {
   $value *= (-1);
}
unset($value);

除非该数组是字符串:

foreach ($array as &$value) {
    $value = '-' . $value;
}
unset($value);

3
好的,引用传递非常重要。 - Peter Ajtai
6
这是一个重要的但也非常危险的操作。你应该始终将相关变量取消引用:foreach ($array as &$value){ /* ... */ } unset($value); - Dávid Horváth
1
@PeterAjtai 很好的发现,尽管这个回答已经有57票了,但我还是采纳了你的建议并更新了回答。 - Elijah Lynn
为什么这很危险? - mgutt
4
因为 PHP 没有块级变量作用域。如果你在代码后面再次使用相同名称的变量,它会神奇地覆盖所引用变量的内容。 - Dávid Horváth
1
一个数组怎么可能是一个字符串(标量)?你的意思是数组包含字符串吗? - Peter Mortensen

76
在这种情况下,Rohit的答案可能是最好的选择,但是PHP数组函数在更复杂的情况下非常有用。
您可以使用array_walk()对数组的每个元素执行函数,从而改变现有数组。 array_map() 几乎做同样的事情,但它返回一个新数组而不是修改现有数组,因为看起来您想继续使用相同的数组,所以应该使用array_walk()
要直接处理数组元素,可以通过引用传递数组项array_walk()
自php5.3以来,您可以在array_walk中使用匿名函数:
// PHP 5.3 and beyond!
array_walk($array, function(&$item) { $item *= -1; }); // or $item = '-'.$item;

工作示例

如果对于您来说,php 5.3 太过花哨,那么只需使用 createfunction()

// If you don't have PHP 5.3
array_walk($array,create_function('&$it','$it *= -1;')); //or $it = '-'.$it;

工作示例


你的方法比Rohit的方法慢多少?我喜欢一行代码,所以知道它会导致多少“速度损失”会很好。 - mgutt
2
对于简单的数字,循环可能更快。进行性能分析 :) 在我的情况下,我需要在连接整个数组之前给字符串添加前缀,最快的解决方案是使用Array_walk,然后是Implode。 - CoffeDeveloper
伟大的解决方案。如果您想要使用先前声明的变量,在“{ } :”之前添加use($XXX)即可。array_walk($rank,function (&$item) use($cpt) { if ($item >= $cpt) $item += 1; }); - Medhi

26

可以像这样做:

array_map(function($val) { return -$val;} , $array)

3
请注意,这个代码只适用于PHP 5.3及以上版本(因为使用了匿名函数),并且它返回一个新的数组而不是修改现有的数组(所以在上面的操作之后,print_r($array)会显示$array没有变化)。如果你将返回值赋给$array,这将非常好地完成任务。 - Peter Ajtai

12
您可以用一个字符串替换“nothing”。因此,要在一个字符串数组前缀中添加一个字符串(而不是最初发布的数字):
$prefixed_array = substr_replace($array, 'your prefix here', 0, 0);
这意味着,对于$array的每个元素,在偏移量0、长度为0的位置上取空字符串,并用前缀替换它。
参考资料:substr_replace

这是一个非常棒且简单的解决方案,回答了问题 - 谢谢! - Frankie Jarrett

6
$array = [1, 2, 3, 4, 5];
$array=explode(",", ("-".implode(",-", $array)));
//now the $array is your required array

这是一个单行解决方案。你想要什么类型的解释? - Sarwar Hasan
5
如果数组中的任何一个元素包含逗号,则结果数组将比原始数组具有更多的项。这对于只包含数字的OPs案例有效。 - Steven Jeffries

5

我之前也遇到了相同的情况。

给每个数组值添加前缀

function addPrefixToArray(array $array, string $prefix)
{
    return array_map(function ($arrayValues) use ($prefix) {
        return $prefix . $arrayValues;
    }, $array);
}

为每个数组值添加后缀

function addSuffixToArray(array $array, string $suffix)
{
    return array_map(function ($arrayValues) use ($suffix) {
        return $arrayValues . $suffix;
    }, $array);
}

现在是测试部分:
$array = [1, 2, 3, 4, 5];

print_r(addPrefixToArray($array, 'prefix'));

结果

Array ([0] => prefix1 [1] => prefix2 [2] => prefix3 [3] => prefix4 [4] => prefix5)

print_r(addSuffixToArray($array, 'suffix'));

结果

Array ([0] => 1suffix [1] => 2suffix [2] => 3suffix [3] => 4suffix [4] => 5suffix)

1
你也可以在PHP 7.4中这样做。
$array = array_map(fn($item) => -$item, $array);

实时演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接