【问题标题】:Add a prefix to each item of a PHP array为 PHP 数组的每一项添加前缀
【发布时间】:2011-11-28 21:06:07
【问题描述】:

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

基本上我想从这个开始:

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

到这里:

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

有什么想法吗?

【问题讨论】:

    标签: php arrays explode prefix implode


    【解决方案1】:

    简单:

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

    除非数组是字符串:

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

    【讨论】:

    • 不错。通过引用传递是必不可少的。
    • @Peter Ajtai 必不可少,但也非常危险。您应该始终停用引用的变量:foreach ($array as &$value){ /* ... */ } unset($value);
    • @PeterAjtai 很好,尽管这有 57 票我继续并用你的建议更新了答案。
    • 为什么危险?
    • @mgutt 因为 PHP 没有块级变量范围。如果你在后面的代码中使用了同名的变量,它会神奇地覆盖被引用变量的内容。
    【解决方案2】:

    这样的事情会做:

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

    【讨论】:

    • 请注意,这只是 PHP 5.3+ (由于匿名函数),它返回一个新数组而不是修改现有数组(所以print_r($array) 将在上面显示$array 不变. - 如果您将返回的值分配给$array,这将很好地完成工作。
    【解决方案3】:

    在这种情况下,Rohit's answer 可能是最好的,但PHP array functions 在更复杂的情况下可能非常有用。

    您可以使用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;
    

    Working example

    如果 php 5.3 对你来说有点太花哨了,那就用createfunction()

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

    Working example

    【讨论】:

    • 与 Rohits 相比,您的方法慢了多少?我喜欢单线,所以很高兴知道它会导致多少“速度损失”。
    • 对于简单的数字,循环可能更快。分析它:) 在我的情况下,我需要在连接整个数组之前为字符串添加前缀,最快的解决方案是 Array_walk,然后是 Implode。
    • 很好的解决方案。如果要使用之前声明的 var,请在 "{ } 之前添加 use($XXX) : array_walk($rank, function(&$item) use($cpt) { if ($item >= $cpt) $item += 1; });
    【解决方案4】:

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

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

    此外,这比foreach 快三倍以上。

    【讨论】:

    • 我发现这是最好的答案,主要是因为它的速度要快得多。另外值得一提的是preg_replace,它的作用大致相同,但它总是返回一个大小相同的数组,其中包含与正则表达式不匹配的项目的未修改项目。版本要求也稍微轻一些(存在于 PHP4 与 preg_filter 中,需要 PHP >= 5.3.0)。
    • 有什么办法可以加后缀吗?
    • @Avik 要添加后缀,只需使用 $ 锚点:preg_filter('/$/', '_suffix', $array);
    • 谢谢,我知道preg_filter('/^(.*?)$/', '$0*', $array),它确实有效,但我喜欢你的,它很短。再次感谢非常感谢您的帮助:)
    • 谢谢,这是最好的答案,不过我更喜欢preg_replace
    【解决方案5】:
    $array = [1, 2, 3, 4, 5];
    $array=explode(",", ("-".implode(",-", $array)));
    //now the $array is your required array
    

    【讨论】:

    • 它是单行解决方案。你想要什么样的解释?
    • 如果任何数组内容包含,,则生成的数组将比原始数组包含更多的项目。这确实适用于只是数字的 OPs 情况。
    【解决方案6】:

    我以前也遇到过这种情况。

    为每个数组值添加前缀

    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)
    

    【讨论】:

      【解决方案7】:

      您可以将“nothing”替换为字符串。所以要为字符串数组添加前缀(不是最初发布的数字):

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

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

      参考:substr_replace

      【讨论】:

      • 这是一个奇妙而简单的解决方案,可以回答这个问题 - 谢谢!
      猜你喜欢
      • 1970-01-01
      • 2017-07-30
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      • 2013-11-18
      • 2018-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多