如何重命名foreach循环中的键


How to rename the key in a foreach loop?

我正试图从数据库调用生成一个XML,而我使用的实用程序类抛出一个错误Illegal character in tag name. tag: 0

我想这是因为数组是[0]、[1]、[2]等。真的,我应该把它们都设置为标准的东西,比如"asset",因为它们都是资产,但我不能这样做,因为这样键就会相同,但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"
  }
}

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

最简单的方法是简单地在旧阵列的基础上构建一个新阵列,但要使用更好的密钥:

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

最方便的方法是更改所有键,然后使用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);

这种方法确实有一个缺点(增加了内存使用量),如果您的数组有数百万个项目,这可能是一个问题,但在这种情况下,很可能最好重组程序,这样它就不需要在内存中保留巨大的数组。