在array_walk功能中更改阵列键?

2022-08-30 15:55:39

我正在使用数组函数将管道分隔的字符串转换为关联数组。

$piper = "|k=f|p=t|e=r|t=m|";

$piper = explode("|",$piper);

$piper = array_filter($piper);

function splitter(&$value,$key) {

    $splitted = explode("=",$value);
    $key = $splitted[0];
    $value = $splitted[1];

}

array_walk($piper, 'splitter');

var_dump($piper);

这给了我

array (size=4)
  1 => string 'f' (length=1)
  2 => string 't' (length=1)
  3 => string 'r' (length=1)
  4 => string 'm' (length=1)

我想要的地方:

array (size=4)
  "k" => string 'f' (length=1)
  "p" => string 't' (length=1)
  "e" => string 'r' (length=1)
  "t" => string 'm' (length=1)

但钥匙没有改变。是否有任何数组函数可以循环访问数组并更改键和值?


答案 1

在array_walk(描述回调函数)的文档中是这样说的:

只有数组的值可能会被更改;它的结构不能改变,即程序员不能添加,取消设置或重新排序元素。如果回调不满足此要求,则此函数的行为是未定义的,并且是不可预测的。

这意味着您不能 使用 来更改迭代数组的键。但是,您可以使用它创建一个新数组:array_walk

$result = array();
array_walk($piper, function (&$value,$key) use (&$result) {
    $splitted = explode("=",$value);
    $result[ $splitted[0] ] = $splitted[1];
});
var_dump($result);

不过,我想如果是我,我会在这里使用正则表达式(而不是“爆炸爆炸”):

$piper = "|k=f|p=t|e=r|t=m|";
preg_match_all('#([^=|]*)=([^|]*)#', $piper, $matches, PREG_PATTERN_ORDER);
$piper = array_combine($matches[1], $matches[2]);
var_dump($piper);

答案 2

为什么不构建一个具有来自$piper所需键和值的新数组?

$piper2 = array();
foreach ($piper as $k => $val)
{
  $splitted = explode("=", $val);
  $key = $splitted[0];
  $value = $splitted[1];

  $piper2[$key] = $value;
}

$piper = $piper2; // if needed