1

我正在尝试从数据库调用生成 XML,而我正在使用的实用程序类引发错误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"
  }
}
4

2 回答 2

2

在循环遍历数组时修改数组的键通常是一个坏主意——即使语言支持它,调试起来也很混乱。

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

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

    $rekeyed_assets[ $new_key ] = $asset;
}
于 2012-09-11T18:12:32.897 回答
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);

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

于 2012-09-11T18:10:56.383 回答