首页 > 解决方案 > 在 PHP 数组中,如何根据数组值修改字符串键?

问题描述

目前我正在做一个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 是一个子数组,我对其应用了一些复杂的逻辑来提取一个字符串。我已经更新了上面的例子来证明这一点。

标签: phparrays

解决方案


如果你想修改数组值,你可以使用 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方法更好。


推荐阅读