为PHP数组的每一项添加前缀


76

我有一个PHP数字数组,我想在前面加上减号(-)。我认为通过使用爆炸和内爆是有可能的,但是我对php的了解实际上是不可能的。任何帮助,将不胜感激。

本质上,我想从这里开始:

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

对此:

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

有任何想法吗?

Answers:


99

简单:

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

除非数组是字符串:

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

3
真好 通过引用是必不可少的。
2011年

6
@Peter Ajtai Essential,但也很危险。您应该始终停用引用的变量:foreach ($array as &$value){ /* ... */ } unset($value);
戴维·霍瓦斯

1
@PeterAjtai很好,尽管有57票,我还是继续前进,并用您的建议更新了答案。
伊莱贾·林恩

为什么有危险?
mgutt

4
@mgutt因为PHP没有块级变量作用域。如果稍后在代码中使用具有相同名称的变量,它将神奇地覆盖所引用变量的内容。
戴维·霍瓦斯

143

一种为数组值添加前缀的优雅方法(PHP 5.3+):

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

此外,这比的速度快三倍以上foreach


7
我发现这是最好的答案,主要是因为它是如此之快。还值得一提的是preg_replace,它执行的操作大致相同,但对于与正则表达式不匹配的项目,它始终返回具有未修改项目的相同大小的数组。版本要求也有所减轻(存在于PHP4中,preg_filter而要求PHP> = 5.3.0)。
dbm 2015年

1
有什么方法可以添加后缀吗?
AvikB

14
@Avik要添加后缀只是使用$锚:preg_filter('/$/', '_suffix', $array);
大卫·霍瓦特

有关PHP正则表达式的更多信息阅读PCRE手册:php.net/manual/en/reference.pcre.pattern.syntax.php
戴维·霍瓦斯

1
谢谢,我想通了preg_filter('/^(.*?)$/', '$0*', $array),它确实有效,但是我喜欢您的,它很短。再次感谢,非常感谢您的帮助:)
AvikB

68

在这种情况下,Rohit的答案可能是最好的,但是PHP数组函数在更复杂的情况下可能非常有用。

您可以用来array_walk()对数组的每个元素执行功能,以更改现有数组。array_map()几乎可以做同样的事情,但是它返回一个新数组而不是修改现有数组,因为看起来您想继续使用同一数组,应该使用array_walk()

要使用直接在数组的元素上工作array_walk(),请通过引用(function(&$item))传递数组的各项。

从php 5.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;

工作实例


与Rohits相比,您的方法要慢多少?我喜欢单线飞机,所以很高兴知道它会造成多少“速度损失”。
mgutt 2015年

2
对于简单的数字,循环可能更快。剖析它:)就我而言,我需要在连接整个数组之前给字符串加上前缀,最快的解决方案是Array_walk和Implode。
CoffeDeveloper 2015年

22

这样的事情会做:

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

3
请注意,这仅适用于PHP 5.3+(由于使用匿名函数),它返回一个新数组而不是修改现有数组(因此在上面的数组之后print_r($array)$array保持不变。)-如果将返回值赋给该数组,$array则会得到工作做得很好
Peter Ajtai 2011年

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

它是单行解决方案。您想要什么类型的解释?
Sarwar Hasan

3
如果任何数组内容包含,,则结果数组将比原始数组包含更多项。这对于仅是数字的OP情况确实适用。
史蒂芬·杰弗里斯

5

您可以用字符串替换“ nothing”。因此,给字符串数组加上前缀(不是最初发布的数字):

$prefixed_array = substr_replace($array, 'your prefix here', 0, 0);

这意味着,对于$ array的每个元素,在偏移量0,长度0处采用(零长度)字符串,并将其替换为前缀。

参考:substr_replace


这是回答问题的一种奇妙而简单的解决方案-谢谢!
Frankie Jarrett

2

我以前也有同样的情况。

为每个数组值添加前缀

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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.