【问题标题】:In a PHP array, how to modify string keys based on the array values?在 PHP 数组中,如何根据数组值修改字符串键?
【发布时间】:2018-06-07 22:06:33
【问题描述】:

目前我正在对数组执行foreach,并在执行过程中创建一个新数组。例如:

    $newMap = [];
    foreach ($oldMap as $key => $value) {

        // Apply some complex logic to $value to extract a string
        $newString = my_value_processor($value);

        $newkey = $key + $newString;
        $newMap[$newKey] = $value;
    }

我觉得我应该可以使用array_map()array_walk() 来完成这项工作,而且效率会更高,但我似乎无法让它发挥作用。

编辑:在上面的示例中,代码被简化以显示 $newKey 依赖于 $value。实际上,$value 是一个子数组,我对其应用了一些复杂的逻辑来提取字符串。我已经更新了上面的例子来证明这一点。

【问题讨论】:

  • IIRC, foreacharray_ 函数快很多。让我找到一个来源来支持它。 EDIT 找到了我的来源:github.com/lizards-and-pumpkins/catalog/issues/528。这取决于具体的操作,但如果你没有函数式编程的背景,foreach 总是更快,甚至可能更容易阅读。
  • 不,你不能改变现有 Php 数组中的键。
  • foreach ($old as $k => $v) $new[$k.'_'.$v] = $v; 举个例子是不是很费劲?
  • 字符串不能使用+操作符合并,使用.进行连接

标签: php arrays


【解决方案1】:

如果你想修改数组值,你可以使用array_map(注意这里使用了匿名函数,PHP 7 提供)

使用array_map修改数组值

$array = array(
  "k1" => "1",  
  "k2" => "2", 
  "k3" => "3",
);

$mapFunc = function($item) {
  return $item . '_';
};

$newArray = array_map($mapFunc, $array);

var_dump($newArray);

结果:

array(3) {
  ["k1"]=>
  string(2) "1_"
  ["k2"]=>
  string(2) "2_"
  ["k3"]=>
  string(2) "3_"
}

如果你想修改数组键或值或两者都可以使用array_reduce

使用array_reduce修改数组键

$array = array(
  "k1" => "1",  
  "k2" => "2", 
  "k3" => "3",
);

$reduceFunc = function($carry, $key)  use ($array) {
  $carry[$key . '_'] = $array[$key];
  return $carry;
};

$newArray = array_reduce(
  $array,
  $reduceFunc,
  []
);

var_dump($newArray);

结果:

array(3) {
  ["1_"]=>
  string(1) "1"
  ["2_"]=>
  string(1) "2"
  ["3_"]=>
  string(1) "3"
}

但从我的角度来看,这是函数式编程风格,这对于 php 来说并不典型,所以我认为你的 foreach 方法更好。

【讨论】:

  • 他不想改变值。
  • 谢谢,添加数组array_reduce,允许修改键
【解决方案2】:

试试这个代码,这个带有array_walk()的代码。

  $newMap = [];
  array_walk($oldMap, function ($value,$key) use (&$newMap) { 
    $newkey = $key + $value + 'blah blah blah';  
    $newMap[$newkey] = $value;
  });

如果您使用字符串作为 'blah blah blah',则将“+”(加号)替换为“.”(点)。

【讨论】:

    【解决方案3】:

    你可以试试这个方法,

    $oldMap = ['test12' => 'test'];
    foreach($oldMap as $key => $value)
        {
            $oldMap[$key.'_'.$value.'blah blah'] = $value;
            unset($oldMap[$key]);
        }
    var_dump($oldMap);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      • 2019-03-20
      • 1970-01-01
      相关资源
      最近更新 更多