如何在foreach循环中重命名密钥?

时间:2012-09-11 18:06:46

标签: php xml foreach

我正在尝试从数据库调用生成XML,而utility class I'm using会抛出错误Illegal character in tag name. tag: 0

我认为这是因为数组是[0],[1],[2]等。真的我应该将它们全部设置为标准的东西,比如'资产',因为它们都是资产,但我可以'这样做是因为那时密钥是相同的,但也许ID可以工作。但我不知道如何在foreach循环中更改我所使用的密钥。

我试过了:

foreach ($assets as &$key => &$asset) {
    $key2 = $asset->isci;
    $asset = get_object_vars($asset);
}

但是我无法传递$ key的参考。

这是数组外观的简要表示:

array(2) {
  [0]=>
  array(25) {
    ["id"]=>
    string(2) "27"
  }
  [1]=>
  array(25) {
    ["id"]=>
    string(2) "25"
  }
  [2]=>
  array(25) {
    ["id"]=>
    string(1) "1"
  }
}

2 个答案:

答案 0 :(得分:2)

在循环上修改数组的键通常是一个坏主意 - 即使语言支持它,调试也会非常混乱。

最简单的方法是简单地基于旧数组构建一个新数组,但使用更好的键:

$rekeyed_assets = array();
foreach ($assets as $old_key => $asset)
{
    $new_key = $asset->isci;
    $asset = get_object_vars($asset);

    $rekeyed_assets[ $new_key ] = $asset;
}

答案 1 :(得分:1)

最方便的方法是更改​​所有键,然后使用array_combine创建带有修改键的新数组。以下是使用array_map和匿名函数批量执行此操作的方法:

$newKeys = array_map(function($asset) { return $asset->isci; }, $assets);
$assets = array_combine($newKeys, $assets);

您也可以对值执行相同的操作:

$newKeys = array_map(function($asset) { return $asset->isci; }, $assets);
$newValues = array_map(function($asset) { return get_object_vars($asset); }, $assets);
$assets = array_combine($newKeys, $newValues);

这种方法确实有一个缺点(内存使用量增加),如果你的数组有数百万个项目,这可能会成为一个问题,但在这种情况下,重组程序很可能会更好,因此它不需要首先在内存中保留大量数组。