26

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

$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)

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

4

5 回答 5

63

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);
于 2012-11-07T13:45:57.887 回答
2

你可以更好地使用foreach它。以下示例显示了处理条目,使用右键添加它并删除原始条目。

$piper = "|k=f|p=t|e=r|t=m|";
$piper = array_filter(explode("|", $piper));

foreach ($piper as $index => $value) {
    list($key, $value) = explode("=", $value);
    $piper[$key] = $value;
    unset($piper[$index]);
}

注意你没有像索引一样的键。

另一种选择是通过引用处理值并在之后设置键:

foreach ($piper as &$value) {
    list($keys[], $value) = explode("=", $value);
}
unset($value);

$piper = array_combine($keys, $piper);

这不会给您带来任何麻烦,而只是使用重复的键。但是您可以在 之后检查该问题foreach,不会丢失任何数据。

以下内容无法保证,foreach这可能是通过输入结果数组最简化的方法:

$result = array();
foreach ($piper as $value) {
    list($key, $value) = explode("=", $value);
    $result[$key] = $value;
}
于 2012-11-07T13:51:19.327 回答
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
于 2012-11-07T13:51:36.690 回答
1

使用 array_reduce 就可以了

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

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

$piper = array_filter($piper);

function splitter($result, $item) {
    $splitted = explode("=",$item);
    $key = $splitted[0];
    $value = $splitted[1];

    $result[$key] = $value;

    return $result;
}

$piper = array_reduce($piper, 'splitter', array());

var_dump($piper);

基于此:http ://www.danielauener.com/howto-use-array_map-on-associative-arrays-to-change-values-and-keys/

于 2016-09-19T12:20:08.850 回答
0

这是我的递归函数,它不仅可以将数组的值更改为 array_walk_recursive() ,还可以更改给定数组的键。它还保持数组的顺序: https ://stackoverflow.com/a/57622225/10452175

于 2019-08-23T08:18:21.607 回答