我正在尝试从数据库调用生成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"
}
}
答案 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);
这种方法确实有一个缺点(内存使用量增加),如果你的数组有数百万个项目,这可能会成为一个问题,但在这种情况下,重组程序很可能会更好,因此它不需要首先在内存中保留大量数组。